From 76eb4c514088e10e3de0049f067f830d4d2fbc3c Mon Sep 17 00:00:00 2001 From: Jenita Date: Fri, 25 Jul 2025 20:48:05 -0500 Subject: [PATCH 1/2] test: added tests for utxorpc block functions Signed-off-by: Jenita --- ledger/allegra/block_test.go | 48 ++++++++++++++++++++++++ ledger/alonzo/alonzo.go | 10 ++++- ledger/alonzo/block_test.go | 37 ++++++++++++++++++ ledger/byron/block_test.go | 47 +++++++++++++++++++++++ ledger/conway/block_test.go | 73 ++++++++++++++++++++++++++++++++++++ ledger/mary/block_test.go | 66 ++++++++++++++++++++++++++++++++ ledger/shelley/block_test.go | 38 +++++++++++++++++++ 7 files changed, 318 insertions(+), 1 deletion(-) diff --git a/ledger/allegra/block_test.go b/ledger/allegra/block_test.go index 8e2ab942..911b7d6b 100644 --- a/ledger/allegra/block_test.go +++ b/ledger/allegra/block_test.go @@ -22,6 +22,7 @@ import ( "github.com/blinklabs-io/gouroboros/cbor" "github.com/blinklabs-io/gouroboros/ledger/allegra" + "github.com/stretchr/testify/assert" ) // https://cexplorer.io/block/8115134ab013f6a5fd88fd2a10825177a2eedcde31cb2f1f35e492df469cf9a8 @@ -88,3 +89,50 @@ func TestAllegraBlock_CborRoundTrip_UsingCborEncode(t *testing.T) { } } } + +func TestAllegraUtxorpcBlock(t *testing.T) { + // Decode the block hex to bytes + blockCbor, err := hex.DecodeString(allegraBlockHex) + assert.NoError(t, err, "Failed to decode block hex") + + // Parse the block + block, err := allegra.NewAllegraBlockFromCbor(blockCbor) + assert.NoError(t, err, "Failed to parse block") + assert.NotNil(t, block, "Parsed block is nil") + + expectedHash := block.Hash().String() + expectedHeight := block.BlockNumber() + expectedSlot := block.SlotNumber() + + // Convert to UTxO RPC format + utxorpcBlock, err := block.Utxorpc() + assert.NoError(t, err, "Utxorpc() conversion failed") + assert.NotNil(t, utxorpcBlock, "RPC block is nil") + + t.Run("BlockHeader", func(t *testing.T) { + assert.Equal(t, expectedHash, hex.EncodeToString(utxorpcBlock.Header.Hash), + "Block hash mismatch") + + assert.Equal(t, expectedHeight, utxorpcBlock.Header.Height, + "Block height mismatch") + + assert.Equal(t, expectedSlot, utxorpcBlock.Header.Slot, + "Block slot mismatch") + }) + + t.Run("Transactions", func(t *testing.T) { + originalTxs := block.Transactions() + rpcTxs := utxorpcBlock.Body.Tx + + assert.Equal(t, len(originalTxs), len(rpcTxs), + "Transaction count mismatch") + + if len(rpcTxs) > 0 { + firstRpcTx := rpcTxs[0] + assert.NotEmpty(t, firstRpcTx.Hash, "Transaction hash should not be empty") + assert.Greater(t, len(firstRpcTx.Inputs), 0, "Transaction should have inputs") + assert.Greater(t, len(firstRpcTx.Outputs), 0, "Transaction should have outputs") + assert.Greater(t, firstRpcTx.Fee, uint64(0), "Transaction fee should be positive") + } + }) +} diff --git a/ledger/alonzo/alonzo.go b/ledger/alonzo/alonzo.go index f95562d7..5a88ca15 100644 --- a/ledger/alonzo/alonzo.go +++ b/ledger/alonzo/alonzo.go @@ -381,12 +381,20 @@ func (o AlonzoTransactionOutput) Utxorpc() (*utxorpc.TxOutput, error) { return nil, fmt.Errorf("failed to get address bytes: %w", err) } + // Datum hash handling + var datumHash []byte + if o.OutputDatumHash != nil { + datumHash = o.OutputDatumHash.Bytes() + } else { + fmt.Printf("No datum hash present") + } + return &utxorpc.TxOutput{ Address: addressBytes, Coin: o.Amount(), Assets: assets, Datum: &utxorpc.Datum{ - Hash: o.OutputDatumHash.Bytes(), + Hash: datumHash, }, }, nil diff --git a/ledger/alonzo/block_test.go b/ledger/alonzo/block_test.go index de08b420..e2316701 100644 --- a/ledger/alonzo/block_test.go +++ b/ledger/alonzo/block_test.go @@ -1,7 +1,44 @@ package alonzo_test +import ( + "encoding/hex" + "testing" + + "github.com/blinklabs-io/gouroboros/ledger/alonzo" + + "github.com/stretchr/testify/assert" +) + // https://cexplorer.io/block/1d7974cb01cc9e3fbe9dd7594795a36b21cb1deb2f1b70a0625332c91bd7e5a7 // //slot:72316767 //hash:1d7974cb01cc9e3fbe9dd7594795a36b21cb1deb2f1b70a0625332c91bd7e5a7 var alonzoBlockHex = "85828f1a0076e44f1a044f775f5820f289b983294053fa79e182cc464608c8b0839501aa7f60ead08992446b74ff5a582054a08fb24331f75a0ef1ed4918bdea3f6cc7a943f620f2dfd6fddde7a7b3386e58206d1b4ca9f3e109ac01bba976867c85e50e521df6e44610a7ef63167184adf43b82584041623ec7ed8f02d3fc41494333a1a2e2d920d4ab1052cb43fec4da1c2b0feb95e3eaa96f114ffeb5e0b0ed45dadf5000db0f8b6c56e006a6d9f672f5612ab5345850d0a37a9510d9aaaa2d98dafac2baf544f4d7dfef4982167c7375c9a0279e740a2536f9296d69b848e60578950b52d4062f14c5b79367c4add4cb8ff40d285d01bfe7635bf551a43e545097178d7ac10b825840000065f35d36a8af91cf946b6343b895e7ba1e2ab16fcf5626662ff87ba2bb59f815299db1c4365d03d1b004a0379c154d16e2ddf062b127b0c9a01679674a505850cf97a889d4a9e49e6c0336f1afd076b2ad3a2f24a094a62da33d11eeb4a13e7e549afcef1357dddf9fea024cc68bd93857397aee46df40d203c4082ce34a50582852923308652bd69430f3e0ba7a060a191c5458205054611d3aa3d83caa5409b9ff6283659672298423e4d86938993aa5891b4ac158204d87ad159b4d15510164ee138e6949f96ec33b3b8fb19194f19eca852c2764a90119022358404989cb6f6908f43c0d2939ddfb8b8cb0514b4ade1a741c86acdb8774b53252b7626d780dc08d586f5fc6ff06649e41b835a07d7b8761518584e3f80ed2bec80907025901c009e03bea22014744a96f5d9eac6b1aa40d2a04cc86ac534a3d8c8b3c5c46e8a6dab35fbb580d0e9b7b5b5ec217ad44457a5c392f6f1d2fb660a7664a6d6caf06d25aa9661adc4b0a7115495448176ec8d3c63c19e0949a20407a7b7787107e40e3ccefe0704f09a5871466b197d5aca1866f20502820a2bebe7e36826dbe067e3dd934c1077f14d2f7f602b53a265fd54b73556cc50db813ba710b5a81ece98098c850dc1321ecf64464d6b14d90465a70149b1a03249ac0ec555684da175eee5a12549cec498ff4eb15cc475e8a6429ab35ba88e9d03e4c64a341e7401347ed1d052d04f39577a92afe6768d3093cb2ca76d391deaac18d3253998a636aef7c0b4c7ae46f774e3e17643ce24f4c1c0605c7b5d434a1475e1508efd5f3e0cf649553fe6956b89107e255c23f7fa01d48c2e6641fe28c916dd407d44b7d308622a51c397974c4f46fedea8b259aefdd5d045c3c8a1bd999eb5feae51ad66a62dd357f3915f0706d12b85607f4603cfd196ffba7e3b52950f93e3ca368bb4283e59599bb9a442d1576e0be6f542f81ec9eebb0a5bcb94200d30ce336cf96df9fafdbc32d66c996f7fcb876d7cbbe2ca754ca1669559f917a42de85d600574a073c84a800838258206fbc2c129d3f860feb0dc3ea0942a0e9e19ede92f6f0991f2b549497e2a29ae9008258209d845b74015ca8aee31e15be03f9acd1ddecefb02080929132553f196367e5ad05825820d93b6d8857ff6447b8bbd4e5f8fa86b58023ef341456ff2eda3e0d89f51f8d5205018682583901ec1b21968ba227e7a0bff663efe7d160416508cb3042524b910316253573abf694a555b81aeee68f61f3f91ed5a18bf7eeeb43ac1900c9ab1a002625a08258390170e60f3b5ea7153e0acc7a803e4401d44b8ed1bae1c7baaad1a62a721e78aae7c90cc36d624f7b3bb6d86b52696dc84e490f343eba89005f1a000f4240825839012605b6d3b67730dc13f393861841ee3c6b751531558a94cc05c54ee4183f69a0fd8d581f6e0cf57fd8b856cd856b5d82758183c9fc22350c1a02c588a0825839013208d24ba97635e2d5cf5e419b9c06ff47be097af941fae371fa9c7844cf494c42bb64976d3aea361d46b84481e697eb3466530e24df07f6821a00172698a1581ccc3bccc160d89e07ff903caed26d0823f7128ebf3eed5e0e7894a076a14e446567656e42756e6e793233343201825839013208d24ba97635e2d5cf5e419b9c06ff47be097af941fae371fa9c7844cf494c42bb64976d3aea361d46b84481e697eb3466530e24df07f61a004c4b40825839013208d24ba97635e2d5cf5e419b9c06ff47be097af941fae371fa9c7844cf494c42bb64976d3aea361d46b84481e697eb3466530e24df07f61a0302e968021a000addd6031a044f853d081a044f772d0b58203ba6872fbd19dff7b0d46f5d2848e14ac4c302b339bbdd86f18380e429a98f970d81825820fa4ecedc053cc9a6ecd295462e9650a3db535eb14fa9160d187d0b3d6d9abc74010e81581c3208d24ba97635e2d5cf5e419b9c06ff47be097af941fae371fa9c78a50081825820fbd182578c520e965948f648580c5f7245a0346c852c6f64591094363f809e1f00018182583901b5c2c07d85254c17367cc2eb1d8dd38c02c7405901c8d463d3fabbb8839fc3801785f287ead5ad0b3c327f8e54c71d6156d9dffbb3f23d761a27ce3623021a0002a8dd031a04502006048282008200581c839fc3801785f287ead5ad0b3c327f8e54c71d6156d9dffbb3f23d7683028200581c839fc3801785f287ead5ad0b3c327f8e54c71d6156d9dffbb3f23d76581ca79f362a5947f002a9087837627e8d720aadcab1f5655c7b3d41abeba400828258204d87fb6988b759a799e7452af473f1dcbe26d58aab0a3a5bbaa2aa8e9b25cbc801825820f7c3f7dc19a83dbcd85aba75b0078011888c48e9ea480f0b77d1fe1e7711db3f0101828258390191a51fbc7f28528956c5c5b29bfa5d6e18af5a7edb3d69d0d93360f1d0a7d31baf3434a89b662497acab66f29bf587714faaf5662e5aa6e61a01312d008258390155e5dab09c372e401c5bbb767bfbcc2c7add933387c7681f16bbc19e4b6b0846b3d77813c148d810512d47b0f504795f6eaba9c6931f92a7821a00523db0a1581cb3e1cf0ef01fbcadba904194b9715cdfaa69578dd19208a5036c6bbea15242726f6e7a6520466972737420526964657201021a0002a0c9031a044fcb5ea400828258200c32af743d569cc0f27ab547924ce3e8632833e1cd34a11c58a7e87ee0f00532018258200c32af743d569cc0f27ab547924ce3e8632833e1cd34a11c58a7e87ee0f0053200018a825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a00150bd0a1581c423aaa3a092aff29c00cef49fe0bef65abf7838226d6869ca9c44f24a14f43617264616e6f4b6579733038373201825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a00150bd0a1581c423aaa3a092aff29c00cef49fe0bef65abf7838226d6869ca9c44f24a14f43617264616e6f4b6579733135353001825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a00150bd0a1581c423aaa3a092aff29c00cef49fe0bef65abf7838226d6869ca9c44f24a14f43617264616e6f4b6579733233363501825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a00150bd0a1581c423aaa3a092aff29c00cef49fe0bef65abf7838226d6869ca9c44f24a14f43617264616e6f4b6579733334333701825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a00150bd0a1581c423aaa3a092aff29c00cef49fe0bef65abf7838226d6869ca9c44f24a14f43617264616e6f4b6579733536353401825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a00159282a1581c4d9159b8c6a62fb828d74a4f1cd96e8729269c38516ca6d1682321a2a156416c6f6e7a6f417474656e64616e6365546f6b656e3201825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a0014851ea1581c6ac8ef33b510ec004fe11585f7c5a9f0c07f0c23428ab4f29c1d7d10a1444d454c441acc308c04825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a0014851ea1581c9a9693a9a37912a5097918f97918d15240c92ab729a0b7c4aa144d77a14653554e4441451a003125a2825839014a26c538fdd73b0865f5f2031d52d43823eb59f4608a943de9ef4f738d8b0e001d461c9de10177e57df026dbd8112ecd1f51c6a26ce512f9821a0014851ea1581cf0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9aa147707265747a656c0182583901392e2e855a44daed9b0330b317c428d46b067cee9278f940ebcc32ccfa93d72c9f00c279849f33324625e44652a7c053e0a31e32fda53cb41a083f2249021a00033c29031a044f935084a40081825820a6929ef8e2699b1f493c89af8724bb189dbe1037eb247d4bb685b11932fbde235840fedd62d92bdddab9cb1f42a7ecdb062cffa6e5cf4bd800195617d32b286572b2e2df64a2c5c6f1e3ab3c0579a0a07ad7eacd2b336d7b989086d1de721526060c0381590fc1590fbe0100003233223232323322333222323233322232333222323332223322323322323332223232332233223232332232323332223322332233223322323232323232323232323232332232323232323232323322323232332232333322223232323232322232232325335305c33223530310012235303500222222222322235304400c23232325335306f333222533530723300300200110731074506e32353047001220023253353505a00113507649010350543800221002302e5002004107115335304a01313301b49101350033355029302f1200123535505e00122323355030335502d30331200123535506200122353550640012253353506f335503533550250490040062153353507033550363335550323039120012235355069002232233225335350770022130020011507800425335350763335502c0500040072153353080013304d0010031335503d5079300400215335308001330630010031335503d507933335502e0510053304900100300215078150773200135508601225335350680011506a2213535506e002225335308201330530020071003133506d33550710020013006003350720010022133026491023130003322333573466e200080041f41f8cc8cd54c0ec48004d40c00048004cd40c40952000335530321200123535506900122001001004133573892010231310007a133573892010231320007900233233553023120013503500135034001335038223355302c120012353550630012233550660023355302f12001235355066001223355069002333535502b0012330264800000488cc09c0080048cc09800520000013355302c1200123535506300122335506600233353550280012335530301200123535506700122335506a00235502f0010012233355502804a0020012335530301200123535506700122335506a00235502d001001333555023045002001505e33233553023120012253353506c3003002213350610010021001505f2353053001222533530763332001504100600313506f0021506e011320013333555028302f1200122353055002225335307333044002500b10031333355502c303312001235305a00122253353506e333550245042003001213333550265043004335530301200123535506700122335506a002333535502c0012001223535506b002223535506d0032233550703302c00400233553039120012353550700012233550730023335355035001200122330310020012001333555030052003001200133355502704900300100213333550255042003002001003001505b500113301b49101340033355029302f1200123530540012233043500a00250011533535058335530401200123320015051320013530460012235305100122253353506b0012321300100d3200135507f2253353506100113507d491022d310022135355067002225335307b3304c00200710011300600313507a49101370050011350744901013600221335530421200123320015053320013530480012235305300122253353506d0012321300100f32001355081012253353506300113507f491022d310022135355069002225335307d3304e00200710011300600313507c4910137005003133355301d12001225335306f335306a303e302d35304600222001207125335307033041001300401010721350764901013300133505a0020011001505900d3200135507622533535058001135074491022d31002213530470022253353072333200150710020071353063303000122335306f00223507b491022d310020011300600315335350520011306d4988854cd4d41500044008884c1c5263333573466e1d40112002203a23333573466e1d40152000203a23263530663357380b80ce0ca0c80c66666ae68cdc39aab9d5002480008cc0c4c8c8c8c8c8c8c8c8c8c8c8cccd5cd19b8735573aa01490001199999999981f99a828919191999ab9a3370e6aae7540092000233045304b35742a00460986ae84d5d1280111931a983a99ab9c06b076074073135573ca00226ea8004d5d0a80519a8288241aba1500935742a0106ae85401cd5d0a8031aba1500535742a00866a0a2eb8d5d0a80199a82899aa82b3ae200135742a0046ae84d5d1280111931a983899ab9c06707207006f135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135573ca00226ea8004d5d0a80119191999ab9a3370e6aae75400520022303a303e357426aae7940088c98d4c1a0cd5ce02f03483383309baa001357426ae8940088c98d4c194cd5ce02d833032031883289931a983219ab9c49010350543500065063135573ca00226ea80044d55ce9baa001223370000400244a66a60ac00220b0266ae7000815c4488c88c008004c8004d5417c894cd4d41040045413c884d4d5411c008894cd4c16ccc02000801c4d41500044c01800c448888c8cd54c03c480048d4d5411800488cd54124008ccd4d5402c0048004880048004ccd554018014008004c8cd40054109410c488cc008cd5411c014010004444888ccd54c0104800540fccd54c030480048d4d5410c00488cd54118008d5402c004ccd54c0104800488d4d54110008894cd4c160ccd54c06048004d4034cd403c894cd4c168008417040041648d4d5411c00488cc028008014018400c4cd410c01000d4100004cd54c030480048d4d5410c00488c8cd5411c00cc004014c8004d54184894cd4d410c0044d5402c00c884d4d54124008894cd4c174cc0300080204cd5404001c0044c01800c008c8004d5416888448894cd4d40fc0044008884cc014008ccd54c01c480040140100044484888c00c01044884888cc0080140104484888c00401044800448cd404888ccd4d401000c88008008004d4d40080048800448848cc00400c00848004c8004d541488844894cd4d40d8004540e0884cd40e4c010008cd54c018480040100044448888cccd54011403c00c0040084488cd54008c8cd403c88ccd4d401800c88008008004d4d401000488004cd401005012800448848cc00400c008480044488c0080048d4c08c00488800cc8004d5412c88c8c94cd4c114cc0a14009200213300c300433530081200150010033004335300d12001500100310031332233706004002a002900209999aa9801890009919a80511199a8040018008011a802800a8039119b800014800800520003200135504a221122253353502f00113500600322133350090053004002333553007120010050040011235350050012200112353500400122002320013550472212253353041333573466e2400920000430421502d153353502b0011502d22133502e002335300612001337020089001000899a801111180198010009000891091980080180109000990009aa821911299a9a81300108009109a980a801111a982180111299a9a8160038a99a9a8160038804110b1109a980d801111a982480111299a9824199ab9a33720010004094092266a0660186601e01601a2a66a6090666ae68cdc8804001024825099a819803198078070028a99a982419809003800899a81980619807805806899a81980319807807002990009aa82111091299a9a8130008a814110a99a981f19804002240002006266a600c240026600e00890010009119b8100200122333573466e240080040e80e4488cc00ccc01cc018008c018004cc894cd4d40c0008854cd4d40c400884cd4c0b80088cd4c0bc0088cc034008004888100888cd4c0c401081008894cd4c104ccd5cd19b87006003043042153353041333573466e1c01400810c1084cc0380100044108410840ec54cd4d40c0004840ec40ecc014008c014004894cd4c0d8008400440dc88ccd5cd19b8700200103703623530240012200123530230012200222335302d0022335302e00223300500200120352335302e002203523300500200122333573466e3c0080040cc0c8c8004d540e08844894cd4d407000454078884cd407cc010008cd54c018480040100048848cc00400c0088004888888888848cccccccccc00402c02802402001c01801401000c00880048848cc00400c0088004848c004008800448800848800480048c8c8cccd5cd19b8735573aa004900011981519191999ab9a3370e6aae75400520002375c6ae84d55cf280111931a981899ab9c02703203002f137540026ae854008dd69aba135744a004464c6a605c66ae700900bc0b40b04d55cf280089baa00123232323333573466e1cd55cea801a4000466600e602c6ae85400cccd5403dd719aa807bae75a6ae854008cd4071d71aba135744a004464c6a605c66ae700900bc0b40b04d5d1280089aab9e5001137540024442466600200800600440022464646666ae68cdc39aab9d5002480008cc88cc024008004dd71aba1500233500a232323333573466e1cd55cea80124000466446601e004002602c6ae854008ccd5403dd719aa809919299a981419805a800a40022a00226a05c921022d33001375a00266aa01eeb88c94cd4c0a0cc02d400520001500113502e491022d32001375a0026ae84d5d1280111931a981719ab9c02402f02d02c135573ca00226ea8004d5d09aba25002232635302a33573804005605205026aae7940044dd500091199ab9a33712004002040042442466002006004400244246600200600440022464460046eb0004c8004d5408c88cccd55cf80092804119a80398021aba1002300335744004048224464460046eac004c8004d5408c88c8cccd55cf80112804919a80419aa80618031aab9d5002300535573ca00460086ae8800c0944d5d0800889100109109119800802001890008891119191999ab9a3370e6aae754009200023355008300635742a004600a6ae84d5d1280111931a981099ab9c01702202001f135573ca00226ea8004448848cc00400c0084480048c8c8cccd5cd19b8735573aa004900011980318071aba1500233500a2323232323333573466e1d40052002233300e375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea004900011808180a9aba135573ca00c464c6a604666ae700640900880840804d55cea80189aba25001135573ca00226ea8004d5d09aba25002232635301c33573802403a03603426aae7940044dd5000910919800801801100090911801001911091199800802802001900089119191999ab9a3370ea002900011a80418029aba135573ca00646666ae68cdc3a801240044a010464c6a603066ae7003806405c0580544d55cea80089baa001121223002003112200112001232323333573466e1d4005200223006375c6ae84d55cf280191999ab9a3370ea0049000118041bae357426aae7940108c98d4c04ccd5ce00480a00900880809aab9d50011375400242446004006424460020064002921035054310012253353003333573466e3cd4c01800888008d4c018004880080140104ccd5cd19b873530060022200135300600122001005004100412200212200120012212330010030022001235002490101310012326353003335738002008004930900090008891918008009119801980100100081049fd8799f581c2605b6d3b67730dc13f393861841ee3c6b751531558a94cc05c54ee49fd8799fd8799fd8799f581cec1b21968ba227e7a0bff663efe7d160416508cb3042524b91031625ffd8799fd8799fd8799f581c3573abf694a555b81aeee68f61f3f91ed5a18bf7eeeb43ac1900c9abffffffffa140d8799f00a1401a002625a0ffffd8799fd8799fd8799f581c70e60f3b5ea7153e0acc7a803e4401d44b8ed1bae1c7baaad1a62a72ffd8799fd8799fd8799f581c1e78aae7c90cc36d624f7b3bb6d86b52696dc84e490f343eba89005fffffffffa140d8799f00a1401a000f4240ffffd8799fd8799fd8799f581c2605b6d3b67730dc13f393861841ee3c6b751531558a94cc05c54ee4ffd8799fd8799fd8799f581c183f69a0fd8d581f6e0cf57fd8b856cd856b5d82758183c9fc22350cffffffffa140d8799f00a1401a02c588a0ffffffffff0581840000d87a80821a003c19aa1a541fdb09a10082825820c537dea041be45c4fdfa312d5ec2b1c5fb20b22a5c83d2fe19d2ad8c5c9cf97f584030b3698511623e18657f0726952b0ef5ccb6fead676bb659e14f607ad2a03c1b854dc1abe5111a30224651c844ff9791eab71f6cc261d138a5a5929435b50e0e825820bf896d9d767fa126b9e81111fe8014c4ecc4a039d502c42d30070c182fc2fe3c5840aaf16b4078bce4fec432da0cdbd7d3d8eb45791a685f0dafc0240bf543d6d6db8604a10fbc8a6977a6aeaa68a4d40e932d6996e80bee88e701f9f533b074db02a10081825820fc67cff34b2818884e48191cd3c0bfbee53f8a028501fe49d11f0fca5bb60adb58408f53fbec8e9f5e13f7f22069e573825116891c054c73a2202811a0b52e459b71a4f41201850d636258318d4b1b11a7fc3170332e0d50401425eebcd36cff8600a10081825820484497cb155e96f1dbdf476804faf2ed612b436238047e6f2f15c15be23f97045840eff588eb8be144053a6bda757c2b503e8f2e3bbd583bf78f1352ea177bae4203b4e6c61c6f3a9b6fed8b9840d6349e57116750fee7bdd02c2fa0a166adfe2d08a080" + +func TestAlonzoBlockUtxorpc(t *testing.T) { + blockCbor, err := hex.DecodeString(alonzoBlockHex) + assert.NoError(t, err, "Failed to decode block hex") + + // First validate we can parse the block + block, err := alonzo.NewAlonzoBlockFromCbor(blockCbor) + assert.NoError(t, err, "Failed to parse block") + assert.NotNil(t, block, "Parsed block is nil") + + assert.NotEmpty(t, block.Hash(), "Block hash should not be empty") + assert.Greater(t, block.BlockNumber(), uint64(0), "Block number should be positive") + assert.Greater(t, block.SlotNumber(), uint64(0), "Slot number should be positive") + assert.Greater(t, len(block.Transactions()), 0, "Block should contain transactions") + + t.Run("UtxorpcConversion", func(t *testing.T) { + pbBlock, err := block.Utxorpc() + if err != nil { + t.Fatalf("Utxorpc conversion failed: %v", err) + } + + assert.NotNil(t, pbBlock, "Converted block should not be nil") + assert.Equal(t, block.Hash().Bytes(), pbBlock.Header.Hash, "Block hash mismatch") + assert.Equal(t, block.BlockNumber(), pbBlock.Header.Height, "Block height mismatch") + assert.Equal(t, block.SlotNumber(), pbBlock.Header.Slot, "Block slot mismatch") + assert.Equal(t, len(block.Transactions()), len(pbBlock.Body.Tx), "Transaction count mismatch") + }) +} diff --git a/ledger/byron/block_test.go b/ledger/byron/block_test.go index eafb1418..6de3fb91 100644 --- a/ledger/byron/block_test.go +++ b/ledger/byron/block_test.go @@ -1,7 +1,54 @@ package byron_test +import ( + "encoding/hex" + "testing" + + "github.com/blinklabs-io/gouroboros/ledger/byron" + "github.com/stretchr/testify/assert" +) + // https://cexplorer.io/block/1451a0dbf16cfeddf4991a838961df1b08a68f43a19c0eb3b36cc4029c77a2d8 // //slot:4471207 //hash:1451a0dbf16cfeddf4991a838961df1b08a68f43a19c0eb3b36cc4029c77a2d8 var byronBlockHex = "83851a2d964a09582025df38df102b89ec25a432a2972993d2fa8cc1f597a73e6260b2f07e79501eb084830258200f284bc22f5b96228ee0687b7bb87c56132f77df4235c78a1595729ccfce2001582019fb988d02ec920a6de5ac71c5d5e75f8b73d7ed8e8abea7773e28859983206e82035820d36a2619a672494604e11bb447cbcf5231e9f2ba25c2169177edc941bd50ad6c5820afc0da64183bf2664f3d4eec7238d524ba607faeeab24fc100eb861dba69971b58204e66280cd94d591072349bec0a3090a53aa945562efb6d08d56e53654b0e4098848218cf0758401bc97a2fe02c297880ce8ecfd997fe4c1ec09ee10feeee9f686760166b05281d6283468ffd93becb0c956ccddd642df9b1244c915911185fa49355f6f22bfab9811a004430ed820282840058401bc97a2fe02c297880ce8ecfd997fe4c1ec09ee10feeee9f686760166b05281d6283468ffd93becb0c956ccddd642df9b1244c915911185fa49355f6f22bfab9584061261a95b7613ee6bf2067dad77b70349729b0c50d57bc1cf30de0db4a1e73a885d0054af7c23fc6c37919dba41c602a57e2d0f9329a7954b867338d6fb2c9455840e03e62f083df5576360e60a32e22bbb07b3c8df4fcab8079f1d6f61af3954d242ba8a06516c395939f24096f3df14e103a7d9c2b80a68a9363cf1f27c7a4e3075840325068a2307397703c4eebb1de1ecab0b23c24a5e80c985e0f7546bb6571ee9eb94069708fc25ec67a4a5753a0d49ab5e536131c19c7f9dd4fd32532fd0f71028483010000826a63617264616e6f2d736c01a058204ba92aa320c60acc9ad7b9a64f2eda55c4d2ec28e604faf186708b4f0c4e8edf849f82839f8200d8185824825820b0a7782d21f37e9d98f4cbdc23bf2677d93eca1ac0fb3f79923863a698d53f8f018200d81858248258205bd3e8385d2ecdd17d3b602263e8a5e7aa0edb4dd00221f369c2720f7d85940d008200d81858248258201e4a77f8375548e5bc409a518dbcb4a8437b539682f4e840f4a1056f01cea566008200d81858248258205e83b53253f705c214d904f65fdaaa2f153db59a229a9cee1da6c329b543236100ff9f8282d818584283581ca1932430cb1ad6482a1b67964d778c18b574674fda151cdfa73c63cda101581e581cfc8a0b5477e819a27a34910e6c174b50b871192e95cca1a711bbceb3001abcb52f6d1b000000013446d5718282d818584283581c093916f7e775fba80eaa65cded085d985f7f9e4982cddd2bb7c476aea101581e581c83d3e2df30edf90acf198b85a7327d964f9d92fd739d0c986a914f6c001a27a611b61a000c48cbffa0848200d8185885825840a781c060f2b32d116ef79bb1823d4a25ea36f6c130b3a182713739ea1819e32d261db3dce30b15c29db81d1c284d3fe350d12241e8ccc65cdf08adba90e0ad4558408eb4c9549a6a044d687d6c04fdee2240994f43966ef113ebb3e76a756e39472badb137c3e0268d34ce6042f76c2534220cc1e061a1a29cce065faf486184cf078200d818588582584085dc150754227f68d1640887f8fa57c93e4cad3499f2cb7b5e8258b0b367dcceaa42bf9ea1cfff73fd0fab44d9e0a36ef61bc5d0f294365316a4e0ed12b40a135840f1233519fa85f3ecbb2deaa9dff2d7e943156d49a7a33603381f2c1779b7f65ea0d39a8dcdd227f5d69b9355ab35df0c43c2abb751c6dd24b107a2c7ac51f5088200d81858858258403559467e9b4a4e47af0388e7224358197e5d39c57c71c391db4a7d480f297d8b86b0746de21dc5dfca2bd8b8fa817c1fa1c3bd3eeaddbfd7a6b270564e416d0c5840b0e33544dcb1895b592a612f5be81242a88226d0612da76099b653f89ce7c5641af14fad696ccd44b58744915291240224fd83a26f103c0717752ea256b4af0b8200d8185885825840572c3ea039ded80f19b0d6841e9ad0d0d1b73242ac98538affbec6e7356192f48eba0291ea1b174f9c42e139ba85ce75656a036ba0993dda605d5a62956dba6558406257e3a27a896268cade4d5371537ed606d3004d6269f87ebe6056b6eff737a2a9ef82d27ba1f9b642ffc622ec27b38e69ed41e272d3de0767cad860d50fa10d82839f8200d8185824825820779a319e0d64b80eaff5ed13d08062b8672fc71ac27e7b30574c1c7972764de202ff9f8282d818582183581c2c0dd53d4e6001e006729fc09d74c5a799d5f93c9f4b74748412a823a0001a1abd89081a769cfd808282d818582183581c05b073f36ee030589a31148838cd47e8d8c8f82fec9fe091c7d53cd8a0001a0c5f26b11b00000016bc0c4c47ffa0818200d8185885825840f129f07bbfd87fd1d3ff5fb32e9a5566e02208f89518e9994048add22074f433424e682a392581268c7544e34e9c54378a8820bdcf7dddce30490bbb2d363b4b5840709a2e70d3803554a15d788235bf56c9567407102be375be5071fa81d4c137047743b5f5abefdbab6b2781822474995dff917213c962ecd111619d75b8534f0aff8203d90102809fff82809fff81a0" + +func TestByronTransactionUtxorpc(t *testing.T) { + // Decode the hex string to bytes + blockBytes, err := hex.DecodeString(byronBlockHex) + assert.NoError(t, err) + + block, err := byron.NewByronMainBlockFromCbor(blockBytes) + assert.NoError(t, err) + assert.NotNil(t, block) + + txs := block.Transactions() + assert.Greater(t, len(txs), 0, "Expected at least one transaction in the block") + + for _, tx := range txs { + byronTx, ok := tx.(*byron.ByronTransaction) + assert.True(t, ok, "Transaction should be of type *ByronTransaction") + + utxoTx, err := byronTx.Utxorpc() + assert.NoError(t, err) + assert.NotNil(t, utxoTx, "Utxorpc() should not return nil") + + txHash := byronTx.Hash() + assert.NotEmpty(t, txHash.String(), "Transaction hash should not be empty") + + inputs := byronTx.Inputs() + assert.Equal(t, len(inputs), len(byronTx.Consumed()), "Consumed inputs should match Inputs() length") + + produced := byronTx.Produced() + assert.Equal(t, len(produced), len(byronTx.Outputs()), "Produced should match Outputs() length") + + for _, utxo := range produced { + rpcOut, err := utxo.Output.Utxorpc() + assert.NoError(t, err) + assert.NotNil(t, rpcOut, "Utxorpc output should not be nil") + assert.Greater(t, rpcOut.Coin, uint64(0), "Coin amount should be greater than 0") + assert.NotEmpty(t, rpcOut.Address, "Address bytes should not be empty") + } + } +} diff --git a/ledger/conway/block_test.go b/ledger/conway/block_test.go index 1d86451c..df856563 100644 --- a/ledger/conway/block_test.go +++ b/ledger/conway/block_test.go @@ -88,3 +88,76 @@ func TestConwayBlock_CborRoundTrip_UsingCborEncode(t *testing.T) { } } } + +func TestConwayBlockUtxorpc(t *testing.T) { + blockCbor, err := hex.DecodeString(conwayBlockHex) + if err != nil { + t.Fatalf("failed to decode test block hex: %v", err) + } + + block, err := conway.NewConwayBlockFromCbor(blockCbor) + if err != nil { + t.Fatalf("failed to parse Conway block: %v", err) + } + + utxoBlock, err := block.Utxorpc() + if err != nil { + t.Fatalf("failed to convert Conway block to utxorpc: %v", err) + } + + if utxoBlock.Header == nil { + t.Fatal("block header is nil") + } + + expectedHash := block.Hash().Bytes() + if !compareByteSlices(utxoBlock.Header.Hash, expectedHash) { + t.Errorf("block hash mismatch:\nexpected: %x\nactual: %x", expectedHash, utxoBlock.Header.Hash) + } + + if utxoBlock.Header.Height != block.BlockNumber() { + t.Errorf("block height mismatch: expected %d, got %d", block.BlockNumber(), utxoBlock.Header.Height) + } + + if utxoBlock.Header.Slot != block.SlotNumber() { + t.Errorf("block slot mismatch: expected %d, got %d", block.SlotNumber(), utxoBlock.Header.Slot) + } + + if utxoBlock.Body == nil { + t.Fatal("block body is nil") + } + + expectedTxCount := len(block.TransactionBodies) + if len(utxoBlock.Body.Tx) != expectedTxCount { + t.Errorf("transaction count mismatch: expected %d, got %d", expectedTxCount, len(utxoBlock.Body.Tx)) + } + + if expectedTxCount > 0 { + firstTx := block.Transactions()[0] + utxoFirstTx := utxoBlock.Body.Tx[0] + + expectedTxHash := firstTx.Hash().Bytes() + if !compareByteSlices(utxoFirstTx.Hash, expectedTxHash) { + t.Errorf("first tx hash mismatch:\nexpected: %x\nactual: %x", expectedTxHash, utxoFirstTx.Hash) + } + + if len(utxoFirstTx.Inputs) != len(firstTx.Inputs()) { + t.Errorf("first tx input count mismatch: expected %d, got %d", len(firstTx.Inputs()), len(utxoFirstTx.Inputs)) + } + + if len(utxoFirstTx.Outputs) != len(firstTx.Outputs()) { + t.Errorf("first tx output count mismatch: expected %d, got %d", len(firstTx.Outputs()), len(utxoFirstTx.Outputs)) + } + } +} + +func compareByteSlices(a, b []byte) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} diff --git a/ledger/mary/block_test.go b/ledger/mary/block_test.go index a0f70033..1d4976fc 100644 --- a/ledger/mary/block_test.go +++ b/ledger/mary/block_test.go @@ -1,7 +1,73 @@ package mary_test +import ( + "encoding/hex" + "testing" + + "github.com/blinklabs-io/gouroboros/ledger/mary" +) + // https://cexplorer.io/block/d36ab36f451e9fcbd4247daef45ce5be9a4b918fce5ee97a63b8aeac606fca03 // //hash:d36ab36f451e9fcbd4247daef45ce5be9a4b918fce5ee97a63b8aeac606fca03 //slot:39916670 var maryBlockHex = "84828f1a005f27931a0261147e582084d910a9b03102f4d5d1cfa175595e0671fa16f9018ff1679750efc3d056e9595820f62edd10f9c922efcc58d7a7e939fc0493c006fff17d1d5789d314d7a43530725820ac6051aab9b68f68871774b599e697a400a98336a23075db99262f1d5e28d17a825840381bc4e03e170f96f0a0d5ff40a5c4544fed7f44d5da0970e5efe7ac6686e74faf7c655349ceab6b2306d5af201d7943e7dd026ca8e8c4d32bd7953566d29f8f585069cf8f936bb4eb58d67a70e9bdfd45cf8f9d85e0dc836347046217a43ea6c79ee10856ad39163490e30033ed57c847024365c85713319c7d1d18e21234d6271615930d4963f42fd280caa450e6d83d0b8258400006ce96fc4c0171d0478eca955a4fba452f93b2c09ffb85fbe78d5f2a40f017bdddd2dec6f11620aa54736226ff7731719ffdab4f0657ef777115559d375df25850c78ceafa9c9cbad538c13219807f2b9867672bbcc665268813025e6cbad72da40288bc4a7e96e29fa441827f801c6f804b121d6f3a99f7b660c2fe44f0ee1d402228ace7a5cfc5362d4de38b52498a0b1910125820867488a75d35cf4c06efb6d214697ad56b0237f956c75cc7e5f1ab89f5acef17582010f60a7519103220ab76085ca89609e229c60a39f200341675ac97c887287d640519010b584030e52646ec81ad60fc8cd7cf1813604dce4d7d9995621a2f5f7ffb82b1f1d2a8c21b18f0e732ac5da76790d2ac5a4da592da4d77708aec67868013e15673ab0b05005901c07ac5ad01d682b2abfcf6d2be5993a0b9d286e9723a853ebd7a64c973a70ed4c48f4bd644f4387ea9685be096df83e17bdb7b64f5f53019aef6b68d1164315b096e2809cdc43c7a3e83e68e49133209a4b035238940cd41a4211cd70ee8a1d289ed0037eeefca1926d48e6fdbe8ad069247b59c27f949656dfa3a7e155d6b704bdc1774fdb215f0680e109f51f2c302432fe8fa431c1e19b3cdcd5765a198d95cb80968b627ef000e5c7bfd836c1ac625fe318390241a2d78e7bf5c516284a5cf3569d3df6581b145d0391f7be2fa1a5f0ec6428f69b9919a46112ce26bc8db1098f1388c7708d3633bf7215fbbab9c1ea6186fc6a8a9016f567e2076a29310d4954230f0f00116b122867db4cdf59cf28b894d2b19dc547815c41b93359588ddb59f493ee86058bfdfa4c4dcbec705c6f8cdfb190ccd4a84381af7e2ad8995533bea20849aedcce82a7d1bb17919a883a9dfcd3bb0a02ebcbb9515d9ef1732097d9dbd0461df19b23640638b14d10142031af9f77e74839ad4f437d2aa8290f8b4b2e510a78c16722f50a2c71a2b9a4d0fc82ad0361d0aa1068f1f2cb8374abc17205e188d3876e6bb496ea123e8bbcf1e4287cb506db3d55013073c9425d4b786a60081825820400365b0ea683f94287d7c58f509389c4f2e39656add684ac9942e4e7c08bf260001828258390150ab9706fbb31e58d53f4610eedf75a0ee550eae0f7b0b907f063060073bea946b18925ce27b615763b440d09f5dbda0c68591dffbca0d361a0076def382583901c855701288beb1034be3309b2f800ffa9ff807cc247ca2ee003cb23f3d9678af79fc0cc7989ac5264514a78ecea067860cbfb37b8a711c45821a001e8480a1581c4b9c44c53a20cdfaec04f6a24dd6572037a54aed27a4647b400255f3a14c48617264466f726b3132393701021a0003330d031a02793d6007582037b25d6b3e994f68d24412f3843a7fffa50bb90661b276c7e7f46d21ce82d22509a1581c4b9c44c53a20cdfaec04f6a24dd6572037a54aed27a4647b400255f3a14c48617264466f726b3132393701a50081825820d9557efbf84ffa6dd363661c1b5e7313ed29e50823da16baedc1794f2f616207000181825839015d3c84a4ab34244ca865475c13eabf2e862d5a30c612360f4f0b7b2405fbcf0e74565278f93b2b82ab69bcb9f08706ddd4a00d225d5d678f1a00217dad021a00029d2d031a02613b8a0800a50081825820bc8bfc2527eb8008eb49c7c7cc65455163bb17fc957b75b9011a68a6a27e049700018182583901fc52227f756cc430dc9c81d104c78764b4f41626cb85b79c99cd4ccc5073f046e69026e6ff53e6023bc84b40eb0b1b14a09083af07050ebb1a596591d3021a00029d2d031a02613b8a0800a30082825820034d1a90b249fd422c1bfd4aee60878fc713f4f107a94b4776ea05c650d0347e00825820034d1a90b249fd422c1bfd4aee60878fc713f4f107a94b4776ea05c650d0347e01018282581d61fae5d68aa2cf16a8a1af57370839e04654f9e4548c9adef09cf386c01a0138eb0b82583901e021db8d4088cd7668488fb7d1989ac6fddb6ab695f3dd669f2bd1497486fbd43f3af8532c4850473fbef34ea23d0cb196441bae2d16e06e821a00172bb6a1581cc9db24a15a5a4a3686d6f50f1983a56e934acca586f6a98cc9523950a1514d65737361676566726f6d48656176656e01021a0002bbc5a400818258209a5c54484f77e4c177acd2c795276c5cf8ce6614a43dc8813ab21f97e0dd0fa601018282581d615427e52d1cd89142cbc658f2edf03057297ff08e2c16e6d3d397c5bd1a00989680825839017d8e50b38a7683a47ba4e9105d6ff89e9c162630e8b25c5dd16b9f806e96df67c956be4e6960168f929e627fb98e10cce9a0bf887885d95f821a2382fad1a1581c4b9c44c53a20cdfaec04f6a24dd6572037a54aed27a4647b400255f3a44c48617264466f726b31323433014c48617264466f726b31323531014c48617264466f726b31323537014c48617264466f726b3132363301021a00029bcd031a0261308da40082825820f1c340165805cdc0f2ef8a78761a2291a70ed82c648ababcd2919b5a3958b04301825820a0187465edb163de4b26e79e55daabfdb99021b1db0d9605b364e79a4062c28d01018282581d615427e52d1cd89142cbc658f2edf03057297ff08e2c16e6d3d397c5bd1a00989680825839015cef8d7f6eadbc136a46b4dddd59f25a75242b7736e0831ca8bfea40a2f8786501c13a4eca71f88eea12c2a87691836e21be6f20a06685ab821a076a3ee3b819581c093b80c2d0fca1e50d06e6fff5d22ea06c37a70a36fca1999cb34da8a1477374696b37333201581c0ab9242f9838e9f158c1d161c96805fcf4c54842bf763dc1aa852cd5a85147616c65615f666c616d655f7265645f3501581d496d706f737369626c65204f72625f4c6967687420426c75655f325f320156496e66696e6974792053776f72645f5265645f325f3101554a75737469636520426f775f477265656e5f325f3101581a5061736361616c5f666c616d655f677265656e5f6461726b5f32015450726f63615f666c616d655f79656c6c6f775f3301581853776565742044656c696768745f4f72616e67655f325f31014f57696c6c5f6e6f5f666c616d655f3201581c16a2a21a7ed8a67c5254eda1f8d6041021b53f49ef53e18e3e572546a14d456e7468656f7332333033363201581c1f02ffd171edc73021154e4103ad1240eb188751ecb035d12f231756a1464d4f4230383001581c201bcd6107da0f2ecd70e65b0eb042349873281c569de38178630388a148427566667942697409581c32b19fd9b447eb3d64d9f8c8a5a54ed699cd16a47db243ff82bf7515a14b4164614d696e657235303301581c33540028ad4ade822c82d61ed2d55388422c3db0bfcd11e5e1c92e2aa34c446f6269436f6d6d6f6e3239014a446f6269526172653431014c47756d69436f6d6d6f6e343301581c42e6416b9208aa03898a19ac94124282c041f1c7bf08c3e3f3006c06a14d43617264616e6f526f636b313501581c48766b78dbb52c7fc4617acf4503a9f40b2f0fb3448ba0ab0e1fda09a14c5374696b4672696b3030393301581c5bb7f3c67cb9bece3ae0f654ec5eed2f8c0b16ecd18e66157392eb3ca25543617264616e6f4b69647a30303631464330363432015543617264616e6f4b69647a3030363746433034333301581c63a1eb2af64f5915896fd3b5b25f1ead12f64a9b1dd4a06cb8a6ed2fa14b536f6c5661756c7435373001581c7e206036ca4345a7c45d37d2dff0d7280a0854ce26d279e06f7d94f1a14f4e696674795465646479303034343701581c9a6590ca273a1d0f67bb405717e8c2c245a4fe8935b2fdb7813c91eca1581b477265656e4d6f6e7374657258536572696573464952454d41534b01581ca5425bd7bc4182325188af2340415827a73f845846c165d9e14c5aeda349556e697431303730370149556e697432353136380149556e6974323533363301581cad6290066292cfeef7376cd575e5d8367833ab3d8b2ac53d26ae4ecca14a5a6f6d6269743334393701581cb3bd6c0ea238a4a28cc96bd9a360ee2d9f814023ee9a3d0ee58efdc9a44e4241524231303130314d30323836014e4457415232303130314d30313635014d454c4634303130314630333235014e4d41474533303130314d3031313301581cb4c58110c97910ea5fe392b7727f02abeb528261bfdf137b2a7db22aa14330303601581cb56bb25bcad83af33c40e529722ecb19e3a54046dae97105e36d7134a14a4369636164613839373601581cb7ef0cfb14f588740d02ce8a53879ff96ab03c7b21ec1c459ac2bddaa35048617368477561726469616e32383234014f48617368477561726469616e333339015048617368477561726469616e3932313501581cb81e5ffa08dbd35bf7ac7f9d7f0f58d3581444510b35ea4d098313b5a64d43727970746f50657431393834014d43727970746f50657432373930014d43727970746f50657434303137014c43727970746f506574343032014d43727970746f50657435333736014d43727970746f5065743631323601581cbd3602618dc1d4aec509e3532032ef204e0583ff6d5ad4ea81e96145a14b73656164696e6f3237383601581cc4c00fbd8fa227442a5e7cdecde33b24588494d05a2c50fda8938c6da1444b49445a18c8581cca3aeaa53c0b21fccf28c8c724141473d325fe9ea8d0314f7c3b4240a14f4269746c616e64733078303237333701581ce35a1412a23b10bab24f750a88c65aaae4ab3748863b78aeebcbb4c8a24f4869707079446f6767696532313036014f4869707079446f676769653435353701581ce5f5a081d5da6cb1842a944e6855d2d1c9d5537e0b6b33b58cd85ef4a35242494c4c414e444152414e44544544333230014a4a41524845414430303801494b4f49504f4e32383001021a0003b3f5031a0261305186a20082825820e28ba7c48a153434fff06660908467c4534d28f2300e35f0d779f036cb4c09f65840cd87212ba9882ebacc29c2f1069600cdfba14f8d02f6974a50c09ad61bbf2b756150be86302d4c57d6cce3ab59598b2789622da5106d00e2a70b48f55dc19b02825820e376d721acd5e6e18885c7bec9c7725b228dc7e2ac63d2486d645cf307db7a76584021cb598370011cc9a71436e376338afd2c4320fdcfd38cf310ed6de1e9c325c43083e25ccd3802a6d7416c25fbd97adc3a24b96336b1992ad7531f1849eaf00201818201828200581c7528c78f63dc6de1dc998e4ca9ea1f19829b0958cf916b72d480bf2582051a02793d60a100818258205f565a66dee8a092bd11e6196ce1f974195bc4183cc883699d3f04c87a603b6f58400354c4b89d6d2eacec89eb2b1cea400309edef1ed707b406455f8c405a2a7c7cfda44565c00dfbb8a35c3a9d7a804d6dfbea074ef197d0de7ad5f66c175db105a1008182582008d17aa2ee3c574d1ad9d6a1ccb3c2da53f2356110e5e4da5dbe59c0a3b0a30a58405186ecee50ff90f33ec0361501ec962bab34e6c0754d32a955fd551a994e47c75cbd5e0d407686aae41c44b4e64bddac0eeb25b9775b6d5172bc869069b92106a10081825820d5d20c965cf82e1bc0f61395d93ab82461406c826398caa57ec6fca3f4c052a5584017bebd385cd3f93255c251a90f6cde1656ac38fb77e8c37546f03e586bd1296b0e688f0491e1ba05cb357703e516b6021f8efa3474db40c035ae633cd2d4890ca10081825820ff627640b8a2299cc8605241316b259a2037bc6c7753eccdb336ae5d7818f31d5840c80294976aabde590ceebb98f97c0264a977cfe2b18df622a9c03408d68279033f2e4079df6f3cbf3de551b625d8ec47cca28d1ce125ed621fed840a6225ca0fa1008282582046f371ca0e6fe6ec2047310d943f1e4a17083f6c55cba236008e28123a902a725840bca7d02537231092e7044e60ad8642e710b5d003c537297729ee03b5f76c4365436cfd9c4e9fa4115d7cf9c2498764cdf683393d75c458204785ecb7ddba340d8258200cd1ce481d2bac11d09b374df34f58743806bdbabd996703394a4429f771374b5840a3977d3e2f15c7e80dcaf4f46fcaf76552b40d6bce73469a504b91ff40634abadb4b33457b3498a5be955decfdc5b94abd4dd27b21085344caa091dc4b87c103a10082a11902d1a178383462396334346335336132306364666165633034663661323464643635373230333761353461656432376134363437623430303235356633a16c48617264466f726b31323937a567416c666f6e7a6f8374436c61796d656d6f7261746976652070696563657829746f2063656c6562726174652074686520416c6f6e7a6f206861726420666f726b2075706772616465756f6e2053657074656d6265722031322c20323032316566696c657381a3696d656469615479706569766964656f2f6d7034646e616d65781b4861726420466f726b202d20436c6179204d617465732031323937637372637835697066733a2f2f516d5a6b6e6d4166384233445070535841665a69627a5655517a454c4d576347736a6e6262546d484b693666647265696d6167657835697066733a2f2f516d566a714a6345764e713179476b4a774d51577836395652776e5831786e5632414b766d4138533652795a5052646e616d65781b4861726420466f726b202d20436c6179204d6174657320313239376774776974746572782168747470733a2f2f747769747465722e636f6d2f5468655f436c61794d6174657380" + +func TestMaryBlockUtxorpc(t *testing.T) { + testBlockCbor, err := hex.DecodeString(maryBlockHex) + if err != nil { + t.Fatalf("failed to decode test block hex: %v", err) + } + + block, err := mary.NewMaryBlockFromCbor(testBlockCbor) + if err != nil { + t.Fatalf("failed to parse Mary block: %v", err) + } + + utxoBlock, err := block.Utxorpc() + if err != nil { + t.Fatalf("failed to convert Mary block to utxorpc: %v", err) + } + + if utxoBlock == nil { + t.Fatal("converted block is nil") + } + + if utxoBlock.Header == nil { + t.Fatal("block header is nil") + } else { + expectedHash := block.Hash().Bytes() + if !compareByteSlices(utxoBlock.Header.Hash, expectedHash) { + t.Errorf("block hash mismatch") + } + + if utxoBlock.Header.Height != block.BlockNumber() { + t.Errorf("block height mismatch") + } + + if utxoBlock.Header.Slot != block.SlotNumber() { + t.Errorf("block slot mismatch") + } + } + + if utxoBlock.Body == nil { + t.Fatal("block body is nil") + } else { + expectedTxCount := len(block.TransactionBodies) + if len(utxoBlock.Body.Tx) != expectedTxCount { + t.Errorf("transaction count mismatch") + } + } +} + +func compareByteSlices(a, b []byte) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} diff --git a/ledger/shelley/block_test.go b/ledger/shelley/block_test.go index e7be49fc..353d8d52 100644 --- a/ledger/shelley/block_test.go +++ b/ledger/shelley/block_test.go @@ -89,3 +89,41 @@ func TestShelleyBlock_CborRoundTrip_UsingCborEncode(t *testing.T) { } } } + +func TestShelleyBlockUtxorpc(t *testing.T) { + // Decode the test block CBOR + blockCbor, err := hex.DecodeString(shelleyBlockHex) + if err != nil { + t.Fatalf("failed to decode block hex: %v", err) + } + + block, err := shelley.NewShelleyBlockFromCbor(blockCbor) + if err != nil { + t.Fatalf("failed to parse block: %v", err) + } + + // Convert to utxorpc format + utxoBlock, err := block.Utxorpc() + if err != nil { + t.Fatalf("failed to convert to utxorpc: %v", err) + } + + if utxoBlock.Header == nil { + t.Error("block header is nil") + } + if utxoBlock.Body == nil { + t.Error("block body is nil") + } + + expectedTxCount := len(block.TransactionBodies) + if len(utxoBlock.Body.Tx) != expectedTxCount { + t.Errorf("expected %d transactions, got %d", expectedTxCount, len(utxoBlock.Body.Tx)) + } + + if utxoBlock.Header.Height != block.BlockNumber() { + t.Errorf("height mismatch: expected %d, got %d", block.BlockNumber(), utxoBlock.Header.Height) + } + if utxoBlock.Header.Slot != block.SlotNumber() { + t.Errorf("slot mismatch: expected %d, got %d", block.SlotNumber(), utxoBlock.Header.Slot) + } +} From 5147b2d0006e673e91d4af73f54a64375773ab57 Mon Sep 17 00:00:00 2001 From: Jenita Date: Sun, 27 Jul 2025 21:27:15 -0500 Subject: [PATCH 2/2] test: added tests for utxorpc block functions Signed-off-by: Jenita --- ledger/alonzo/alonzo.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/ledger/alonzo/alonzo.go b/ledger/alonzo/alonzo.go index 5a88ca15..24782216 100644 --- a/ledger/alonzo/alonzo.go +++ b/ledger/alonzo/alonzo.go @@ -385,8 +385,6 @@ func (o AlonzoTransactionOutput) Utxorpc() (*utxorpc.TxOutput, error) { var datumHash []byte if o.OutputDatumHash != nil { datumHash = o.OutputDatumHash.Bytes() - } else { - fmt.Printf("No datum hash present") } return &utxorpc.TxOutput{