From 277feda1f811bdc83889a400fda5596259d19300 Mon Sep 17 00:00:00 2001 From: bkioshn Date: Mon, 16 Sep 2024 09:15:34 +0700 Subject: [PATCH 1/6] test(rust/cardano-chain-follower): add test data --- .../test_data/conway_tx_rbac/Readme.md | 33 +++++++++++++++++++ .../test_data/conway_tx_rbac/conway_1.block | 1 + .../test_data/conway_tx_rbac/conway_2.block | 1 + .../test_data/conway_tx_rbac/conway_3.block | 1 + 4 files changed, 36 insertions(+) create mode 100644 rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md create mode 100644 rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block create mode 100644 rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_2.block create mode 100644 rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block diff --git a/rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md b/rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md new file mode 100644 index 0000000000..57b235b11a --- /dev/null +++ b/rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md @@ -0,0 +1,33 @@ +# Test data for CIP-0509 RBAC validation + +## Role Based Access Control (RBAC) validation + +The current validation includes + +1. Hashing the transaction input `0: transaction inputs` within the transaction should match the `1: txn-inputs-hash`. +2. `?7: auxiliary_data_hash` should match the hash of the auxiliary data. + This also log the pre-hashed of the auxiliary data (auxiliary data with `99: validation signature` set to 0x00). +3. Role 0 validation + 1. Stake public key extracted from URI in X509 or C509 subject alternative name should match some of the + witness set within the transaction. + 2. Reference `?3: payment-key` + 1. Negative index reference - reference to transaction output in transaction: should match some of the + key within witness set. + 2. Positive index reference - reference to transaction input in transaction: check only the index + exist within the transaction input. + +## Test Data + +* `conway_1.block`: Block number: `2684141`, Absolute slot number: `70512378` +* `conway_2.block`: Block number: `2625015`, Absolute slot number: `68906742` +* `conway_3.block`: Block number: `2686596`, Absolute slot number: `70579800` + +## References + +* [Conway CDDL](https://github.com/IntersectMBO/cardano-ledger/blob/ab8d57cf43be912a336e872b68d1a2526c93dc6a/eras/conway/impl/cddl-files/conway.cddl) + +* [CIP-0509 RBAC Registration](https://github.com/input-output-hk/catalyst-CIPs/tree/x509-rbac-signing-with-cip30/CIP-XXXX) +* [CIP-0509 Metadata Envelope](https://github.com/input-output-hk/catalyst-CIPs/tree/x509-envelope-metadata/CIP-XXXX) +* [CIP-0509 Role Registration](https://github.com/input-output-hk/catalyst-CIPs/tree/x509-role-registration-metadata/CIP-XXXX/) + +**Note: CIP-0509 is still in process and may be subject to change.** diff --git a/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block new file mode 100644 index 0000000000..b1fd443b42 --- /dev/null +++ b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block @@ -0,0 +1 @@ +820785828a1a0028f4ed1a0433eefa582030bf7177c5ae2a9aa030347f79f1d8c3bac7bc2e5b05cc4ae64952f85d1a8a325820a8b8d238db94519c71fee2e5c0caac00cfd4e11f7ed1d813220a59143e179c415820732bd5eb4b5b131df6f238723d965585562f461378308283d277ea4cdb790a518258403a952f2a11cc0d78c810118f038029d77435230460577c4d6b9f83924ecf2051dadd3389f7415167d1dceaf9de68af6c335f3df58a3b6d7e4ce29c8feeb8be695850f5a72771d92a26b2eb0da93d1cbd12f5d530e57b5323f1754c12d656369e42dc301f0d3dd12c604deb316f9d8178b77d4c75b6a9448fd9ca7aaab1f24c5de692b87e0a7dd2cc6746e16d6df0f65489061904e958201989697f290b6ebb2744976439ba4174c0e589355ac03c495dd41303107210c284582053d2f62efd6dd50719a526166aa64bd492cac64fa6b858cd71eb37e14ef613d60619020a58407d6779eee8d316895cd1b7528cb91b0fc0daa7b0bcde1c6b93c64b6ab9843e8f95ca50e688d2db1aee316a125994d81e03173ad59395094e180c3a413ddda2018209015901c0d9f3522654763fedf46970f2af3721f4cd62b4460eadeba5237037ede355f05bcb7acb67d81a555ebaa8296de6fa55ba6b35a7201b7c2be23155e2824ee2520a2f3aece3ec94421f2a1e59d19183bca92bc39fd13aadcded2a335ccf63306ede256d78d96d84971c6fca5f6d1f3005f951090cb69b6f6881b9fca2ed34d1852f4c102d611544228dd41ef274225fc72991e246e7ca14ea8d458b4e205d26171bc32d65a61b66dc67a1d88177204fb7acadd07d88916a696c190511bc2b957cdadea897a12eb87b7544b57f4b69005fdfd9e4c691053f6af81598b42ddf077112c100c8028b167b051a1097b64eed78ad2f1772373f8b9ea56e35c1b873090bd25ee2c9066dfac1e939ea89d574676716797a084b53ba6086969e05a11035992b13a2d1dbfc3403743cb47cd6fd0321f0d5fca16e1d6883f51838111a59538c870f303381d01be41feffceab7a16065bc14056462828e947966959a2828498b2452f72623554d6aabde6400bc1d9d93cdae201d8525a94927420c7a505a48cc76bcb5c417ba1c5af8ee79b49abc2f28bbf8dd262c1403ceb446340dafe2d943501757b5b66e8874158100c3499b5a12c91ee3eada0a862625f5966931ba4aa54981a60081825820444b6ac4cbef80fa420b1880fe6f48a5d21a2391fe561abe987c56102b464b2e000181a200583900eb21979c03eed7207020b2a0b47565b5aafb1a2c3849b59a1fa8e6c5e075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d6473903011b000000025003244f021a0003372d075820eadec4a094c0c9edcfb3ce5582bb89fd48805d7c349b89537a1d0202a37cc1bd0e81581ce075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d64739030f0081a100828258208469288efa6f9cb49040b43dcff93f40969d72433f751afde50235012c0160205840bb6298cda951ea27eb0accf72f3b478e035deb74efb91a6905813f6d9ed52940ab06cb61ba967267f771873af32f319a78dc29851ebe94a4a96316b94d81f80282582076af5530fa318a370820270031d1838545a4ceed8696510627563d1114d4182b5840ce5ad68ffe14c5dec9551a8dbdba6176afc903e68a662e6c7f98f3d797557dc001afb80ab101632b3845aadfe84eabd7e167cf8f5cf021dc4220d6a673a3ff01a100a11901fda50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c0150c39ea979cd06bdc62eee8422a19361da0258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b8b58401b09048064084f8b2b0dc2dd44a61d5c0c4ef620f87f37f5000ff1946fb706d0f7268e255684615920797acf734fc8224eb7197419d8ab868cb5be7696f3994258406c0360b135c350c9221c43314ccf2774cfee070b8dd79c709dd157d779a7e943d4cc0580a47057652be88502c0a3f05c825260b9d9500164bee00af9dd011a005840bde49a23144104280752cbf8425e6ad77503d4078a850542e1442bd2109e3675a1a42c9f030b4391970f08845e1082406f581492be6f46e7b990742b6e8df4735840dd542ee353bdda6ecea406fcce7c29a5d5bb02d12abec73a636fb8f257db52e62360de0166816f9bcb08660660a6b2dd6256fa1ae6194ff0fc58604bcad3446d5840447687b2ca55828795cd2d419e9e9534adf6d4c8c52e97be31a8536b02b440a3a9f4ee08eca80d048db4afb655ddea5da35377d23e01fe6a6dad575b635b839f584052dd5cdf56ad54f9e86ad44080af2921081c231f01f319db13048eb9ae144a921c1cdd2e5646e28b849ebdf9fd3cb95fee9fd53e137f87584cb9107cb8c8999b5840874722f9f71256ae0dec4a9c23183b07b9bdad2439b33e63ad6a7dbc38f3787ee16164d9cdf5a6e3f6dc06a9572ce04ddf7b5bf1cd2b53a79ec765b2b94b73125840ea47ede0e931058f9184839d037d07ab7326c7a3a86d6ccde8b526aa2727743fa20f1dbfc06a5b313bfd49abb9fbbef11153ffbc4e9e39d3f7d7f1c7dd46d1175840e925b35ea90a97b0188ab354276d7fb6b020a264c330a4c768e5a7a4691fc7e20ffef38e8df03dfeaae0cfdca04393824cdcc71e497c71ff95b0d6ebb945f8c6584095b2439d0d3d275295cddcd143765ce1d8159df9989105737b902cb00aae77dc7761c732f7aaa5ab2eb9b488344a2ffd0ef327d12b820e252c1e5b78c7d9c8895834cd009d9daf3f3b4d35d7d7db36e139f4389ae1b2cb2779eacbe08f974e9eb2d9b1ffef48239a598e2028cb47b0c380237cfa6f2418635840d89b0c89865f3aac53a78c0cfc26fbc49a869970254262a56f78aa80f309ab4f9d30b4a6b381d770829c25f0dde0306fc2651dace0dbdf39acd95fd923bfac0980 \ No newline at end of file diff --git a/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_2.block b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_2.block new file mode 100644 index 0000000000..7d82e6c8f7 --- /dev/null +++ b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_2.block @@ -0,0 +1 @@ +820785828a1a00280df71a041b6ef6582094790029bb572c18af549a45f83c5f0bf8608b1a1f51cf5777a65776ba3ed34c582054ca56226c90d5544bf6f558026b814027b634e60de0bc215237944110569c6c582037d6147adbf2907948d66f9e4751774bbe9d6c4ad562ce04ef66f0fc1e7ac301825840a2289520ac539f3106b4be4dbf1c0ac7fee2b2cd09b800b1cbaea565a9665ec0cb45b0ce2b9285373ac2ba07133fb37b1571e08850c4ec8f183c2bea25ec442f5850b7c65148f4ac46b1ded83d99b3a0a4f3f0f8dcf287702d40ba868b68da0a61a519bd3011cd1a64ca58fc4b64f4d637d8b84ff6c54f68cad4b8465a9ea3495b4b0648963ee855ec41d25dfe0a4a5f840c1910e05820bb2083eb4a3ae701b38fa125d6e19d651acd6bdaaa1457a348e402c9a10c0d21845820579c45732473db77b8acd430585aeb79ccf7e76b7b118f1e7302291a2cb3d958071901ff5840cad68c6ebff25b637335d3ea1647707cc0e91ecdbc00f1e4a8e3639f1879a5560d50bc948792d43dd2d7cbf54c3e188df16c7ad79f1f78ad1ec760b0725fbe0a820a005901c0cd10797809bd1ecb1427dfd03e39d79f8ecb5ca8d2ea9c9639b7858f19b82b236fccd7f4495c7d130124c6a396af1bfd6c44e29eea2130a29209acc38c933c0487c4be23cf412d9cb7a7684d8316d508f3cd54b4fc029a059d6e12fedae427d8d7bdedd7620955c93127b2f3c1aae8594f2ae126c718e62c12b1ca039ad75cd54854182023dafd45fdee35f15fd6b97faaf7e170ac0b8778ad1705a2353ccda2e36d246e6c5a3e960258475429ac5c41257c5a96f857db3e69510bfe940e5731a31aa281a7e6508308d95eb881fe9143da08e1b880f063d9a1f56ea0fab6a714f2a3dc63425553ea855b6596c104a7d961e6410a0c00c30614ea1693f00f1b13508547ffd5dc55f9b3d9314e35e68690f22188c741e1138aa3df54b78482ebddac7689f45ec277342e6a463091d994422b21c041bc324f6e8368f18df5dcfd5e955933662dddc16009423b7c37f75a12c1185a27b3c37667edb6429291f3dbaa2e9e42a3c9ec12fc28367a636eb91f9414823b9533600789a61d43fe16e3059bf5e77e321a6a78b24e4ad9c44d5e6f1dfebb74d11d470cfd77d05848bab980308cdfd157edbc572c75a2f2c6462c9351607e1e7a944e9d0b41e1bfd1ef2dbdb385ab0083825820353dad97c1aeabb08c0995df84acb1d663e760aca78cfab521a3c372790c5bcb008258203ccea3218b3326101952153ff36c3a655704d1a3f5a3e265790e587f8a76038c02825820fe2245753df56d9c034fa027562bd9cecaa0408f67a09991788fca4e9b0272d9010183a300581d70284cdf01757311c543fac6e755f9d644dc5865617efcdc2b81b249fd01821a001e8480a1581c2232026bd47c51e9777eae1d913de051ef22242125fafb70159d171fa1484e6f64654665656401028201d818583cd87a9fd8799f581cdf4e46bb98ab56936b39b8f5a7f231f5e69aa8820a83d083400a711bd8799fd8799f1a000fa1571b0000019189910975ffffffff82581d60df4e46bb98ab56936b39b8f5a7f231f5e69aa8820a83d083400a711b1a0089544082581d60df4e46bb98ab56936b39b8f5a7f231f5e69aa8820a83d083400a711b1a08aa9e23021a0009cbd9031a041b6f19081a041b6ea10b582073cd085e9ddf0b6079b7a91667bbed35c0a4e48ee5e0ad95ece6f1c9f5b9462e0d81825820353dad97c1aeabb08c0995df84acb1d663e760aca78cfab521a3c372790c5bcb020e81581cdf4e46bb98ab56936b39b8f5a7f231f5e69aa8820a83d083400a711b1082581d60df4e46bb98ab56936b39b8f5a7f231f5e69aa8820a83d083400a711b1a00487c28111a00370c3f1281825820fee1be4cc8b034a3cb036a0e2857a257905d1634b0b869935c9bc4d33aac556500ab00848258207985fb67fa21f2f246dce49a5246ceefc73a78efc4a4c8a1299693177ff9170a018258209f91e4bd3f9784693ff8c1864b4d8e56e98fc80a521182fbf66820eef99fd017008258209f91e4bd3f9784693ff8c1864b4d8e56e98fc80a521182fbf66820eef99fd01702825820df8d763b5263f206b9f81add009a2136153cceace149c5add7da28fac82f747b020183a300581d70b07d22a4dc75abdba1b8c80033a15b85305b76521a0114b17f291a8701821a001e8480a1581c362e3f869c98ce971ead0e2705c56df467ddd2aecb44f6f216c3e1d5a1484e6f64654665656401028201d818583ad87a9fd8799f581c49bd983d12353a48d39ad15212220ebd71dd3f897eb29ab89f3cb58ed8799fd8799f1908d11b00000191899195f7ffffffff82581d6049bd983d12353a48d39ad15212220ebd71dd3f897eb29ab89f3cb58e1a0089544082581d6049bd983d12353a48d39ad15212220ebd71dd3f897eb29ab89f3cb58e1a00ce3fad021a0009dde8031a041b6f19081a041b6ea10b58200f5f979be8cdcf34b4e369422841ba47d76b1f29b5a5af05a5451566896a09da0d818258209f91e4bd3f9784693ff8c1864b4d8e56e98fc80a521182fbf66820eef99fd017010e81581c49bd983d12353a48d39ad15212220ebd71dd3f897eb29ab89f3cb58e1082581d6049bd983d12353a48d39ad15212220ebd71dd3f897eb29ab89f3cb58e1a00524801111a00370c3f1281825820180fb7cfedba19697b4d164867c49ad8bf2493f6dd51d860aa03cd3e46301cb600ab008382582000a3eb1b40d7593f6b506bb7768c38371f3dddb62efd18e1b7a6ec08eaf46c6b0082582000a3eb1b40d7593f6b506bb7768c38371f3dddb62efd18e1b7a6ec08eaf46c6b01825820a5394bfb4a554582b0460ec2872b00b92c954036c03eb047272ae028b5f6d1a0010183a300581d70b07d22a4dc75abdba1b8c80033a15b85305b76521a0114b17f291a8701821a001e8480a1581c362e3f869c98ce971ead0e2705c56df467ddd2aecb44f6f216c3e1d5a1484e6f64654665656401028201d818583ad87a9fd8799f581cbd95d582888acda57a20256bb03e4c4abb6bdf09a47d788605412c53d8799fd8799f1908d11b000001918991e69dffffffff82581d60bd95d582888acda57a20256bb03e4c4abb6bdf09a47d788605412c531a0089544082581d60bd95d582888acda57a20256bb03e4c4abb6bdf09a47d788605412c531a007f95a7021a0009be99031a041b6f19081a041b6ea10b5820cab3c345de5780ccf6c117b35458cfdbf1827909b75270026ebdd694945467170d8182582000a3eb1b40d7593f6b506bb7768c38371f3dddb62efd18e1b7a6ec08eaf46c6b010e81581cbd95d582888acda57a20256bb03e4c4abb6bdf09a47d788605412c531082581d60bd95d582888acda57a20256bb03e4c4abb6bdf09a47d788605412c531a00524801111a00370c3f1281825820180fb7cfedba19697b4d164867c49ad8bf2493f6dd51d860aa03cd3e46301cb600ab0083825820051c7acbd2d64c8472be0176c8f72c5d3b860dd1c5ef51a9210eef907a411edb0082582016d708c7b6edb816b3f72b2c048e220ab2c16bf6aac905174de2c80167b7857e02825820e0db59489272242c2cdda407a67f7f8440558fc895793054a5c50b54fcacd5c5010183a300581d70f5542fa9d9c61b4dbccd71654cc5a72a9fddc9d563f503682e772ec901821a001e8480a1581c5e4a2431a465a00dc5d8181aaff63959bb235d97013e7acb50b55bc4a1484e6f64654665656401028201d818583cd87a9fd8799f581c007df380aef26e44739db3f4fe67d8137446e630dab3df16d9fbddc5d8799fd8799f1a0050d1cd1b000001918991e9f4ffffffff82581d60007df380aef26e44739db3f4fe67d8137446e630dab3df16d9fbddc51a0089544082581d60007df380aef26e44739db3f4fe67d8137446e630dab3df16d9fbddc51a005268d1021a0009cb75031a041b6f19081a041b6ea10b582033fafa4a0a4f144831d33d3d3011d909edd1a0a869a2d452f1e4e8bf8cee89610d818258201e1feecf62e9419842ee8904aa418ebbeb788ccf58e11beaf5e48f9dfc45895d010e81581c007df380aef26e44739db3f4fe67d8137446e630dab3df16d9fbddc51082581d60007df380aef26e44739db3f4fe67d8137446e630dab3df16d9fbddc51a00524801111a00370c3f12818258204b61acedca6426ec989ef78a85ed97a8b4ffd47d9c40d4155e453d7e6b25ae5800a500818258202907eba8940424fa6087da45a9f424983411d9c50ad433e7c4d0b08370ae9d8f00018182583900eb21979c03eed7207020b2a0b47565b5aafb1a2c3849b59a1fa8e6c5e075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d64739031b000000024fa2aca1021a000377a1075820c512b4385a5f96fd190717d83fe20499e503550830071acb5d1e7c8acc795b9f0f0085a20081825820a6ada7ee39223e536b7284e798f5b4a84fc42b4d2cab9dba50f6c6df59e1ed3e5840b5c38748adf1862349e76703dc7ec15789ed214f2784386c8d3be2c6878731e9e78b354b50346f587feb262826b6160574b15099cd96b5cbb1de69a710eff30e0581840000d87980821a0012a1311a10500e4fa20081825820c1267a8c539268789ceb419306f5114ae1bd2f53da1610b15077efec97a597fb58402c815e084c134b7eb667284d85e1cb0560f7ab17d6a63070c326afbecc42000ddc3cd2ab19547d96468057bb2c5ec45c64d994557d9fb4e67e8cecff8055cd0c0581840001d87980821a00132df31a112de183a20081825820df06fec0a22f6839e6637f11dabb6c98995ffb30136983fe240e76d828a8017f58409426594d0ccb765d510d5fb22522dd4192036ee1602c3569fc81a86d63627d39d97a5e36599a532d633461fc0f9405698346c270f97b2bbdddee3f0ebdfbf1030581840000d87980821a0011e9651a0fd34e7ea2008182582094c7c682888eb1999c01c68a7c198ad612cd3d412f9470e1d167e15e5174b7c55840ae7a6040e9d98e41bee94fc2d2c658cc0cab6388c07c66067420c3a6d77c217ca1cf5a47c5629a418a15f216f233d8383e5f8f40dadc57c732ca44845eb04a0f0581840000d87980821a00129b911a104c8a4fa100818258208469288efa6f9cb49040b43dcff93f40969d72433f751afde50235012c01602058400e3310ec7633c4797f9547d3aeb8a3ac6cb24cc5fb96cdc50895fb93d3b07b8ebb81fb900a1dfcf131f901534992b1776e70076c095fb2466feb7d7df10eb304a104a11901fda50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c01500176dd0159778fbd97a824a8b77c949d0258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b9358401bad052066084fcb359de04c74673e9b99f86e2fe8e8a6fe0079c494f7003a6b4c1c4bac378e322cb210730dd8cadcf51ef1d0ce9599592957ea20c7bb62bb11584014db8ea0707e338c01180c23cf9b3451a8ca7d799075942de3414f3ceb84bc1542454c269e6992f99d0a000a2208b9284b819011c38e5862068ca3bd2c0342d7584036a494e40b812c33c288f3249454d6822c3d422b0539259965cac9832c13c250180525e5226c5441701c9162b0e8f063849b854a4e0151915394955390959375584043848a4f36904301bfc710486014d040531f38390605009a75b9a7d6ad4ee216f2ae31fe5f2e25b150936ea791e8979554c7b5b0b8f0f62d42c207779650f2ed584015968c33ea3fe79ebf0dc9630a5e0fe8ed897ce653685e3fa19a0b101bb13c1f3ea5dc8894fd1dd1b47831ef2fe0bb7a73bc6222e2fcd2197afffbdceba4774c58407fd3be175be5d1bffe78dbe8b9e56b610b8e74f3977f9677fa676f7dba397553c4d41d22affc6761fd4258fec6d1c2d75f8b02cf94ba31217acd5424ffa98b6e58408a9a73f351198c55fe9d8eff6b12a7d9c87a3fa8c7f9bd0c4567e7d0da317d2bbb54b58f29d26616d80367f6064fef779bfa151796074568b91e251fa828649d5840fd5453fcf3c6d13c7ae55bfba565e9b064bab3d73db36ebf7e88799e6060008136147022286045f0bbc4b023171d16bf8ae097506786286d5258830e4516927458409386b1c45a99579202fc246ee28e6f64949a8c8c2f0e173b9ade09e0dcb231b10aa1b1aa09093148302e2928362e2535402e1a17ab9018a6a4a4a0ecafa41a9758409012894b548a55564cc2c923314961e1d1d111a90972be4972e1ca114161a9c9b1a9f2fec9891172484272709262b472344e21544525253aaea601899108c5765840ba34582c8c217a8070e9a11036d6e6a412c48088880406ddc63010f54d58c697535bb454890bfa3d2b3a06faebfa8429d5dda120a2146f1340b9990f00fc334b584039eb49cb59e91b8d07c96cca9faf3fc60cdf4fb38bbc888f3e20248bbe78debd7a2157b0cebe7ffe65aff9421d1eb612e0a9b1f8f6dda2289c8960ca7a7f3c3258409ca55b8ae66e5155ef3d0f1f6b5da1dbdaaf3c57fa7bbd2d586dc9768cdb9cf8c66c566508bf05dbcae81ddb1b485a0f3a08fc470b6fa3252719e64cb23876ce584078dbf2134c245e25a22dda17e565aee67eb3dccbd97c6081cfb93b1eb900d6b26edda809ced25938cc21c4c66b5ea4b379fab1ea9c5957d177e12bdddf7b88a95840757f1eace62becca5ce9e0574c46cc24109a33647599dd48d42dad00954d5a8eb3786220c47f5fea596572cd70819c2f59d07f06f153854bd3117a8c78973c4858401f7ca50ab333d27fd3fd92f575d9fd870f20f610c719c8180001c3a09c3ee0c28719e10b9d89745797d7f9baf0413a449b994f0d6be74530b01901f5527f55545840fa00e4a213b503033bd7b67c52a8ed78b4b2be952de9c5dbc835834a4b2bce30e5eddf0ef4f16b73f8d1af48dcc647d0d12f5e9a1d9036d91a5417192c252e5c5840ee753ccaca8dbf7995c885573d5464fe70b25dcaafadfb583c8a2a2e408e2989eb917ea7dab2494b9eeb2d315651d4e6f59758fc9106b9de9fc35b3946426f1458226cfebea9cd2fe6b3d3d7100acc6dcbd6d861c5e13b2008a0e410860f30448efbc20a186358408ac17c3e459a3dee699e5f6b12c6ba028f67ffa1bef4512c8e9b0f7ffc27f7f224dd0321c9acf528d5829e771e0a54bad24ef743923209389d6281c531eb4f0f80 \ No newline at end of file diff --git a/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block new file mode 100644 index 0000000000..99dc415054 --- /dev/null +++ b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block @@ -0,0 +1 @@ +820785828a1a0028fe841a0434f6585820bd6c1f28c1a265de501e8e33dffde602a76713b99d75a31177c03f492791efa158202f5ad4772c00767b6d75c8c1fae31e3479d91921abf41b1989346d2896b61de258201003b81af09c4acb552e0fbb33ffe12415360f2842c0e020b11b09cb82f7c5e48258400a7cf0b7d8f4f4fa9e6ca765c48809002e45592c8dc814ac2ee211ed42a1174409f5a6ab2d722b461f312bd2c257e49c515cf9873a206af171217c4e8be29a465850745029499c740fa493f1e132dfeb358666347a26444a6c7ed988d9f2ec692eecd106fa6526dc67819687de946ea8240e22cdedd7094af6d05028ea66145fd2b19c370c9ca72ced629fbb3ae0b82ac30a19095a5820bf8c18b255e9b583283806e74259fc6eb912bfa6dddfcde307277404ff9ce818845820873bdd3584228477e9d9ee6b60a9cd6000627acf154126162178860ba752e9cd0619020d5840e461305c25b0690c1001e96f882d51c3a12ca32bae4cd25f9f46a98a0e9a7fe9b43ed108f230393c474444ce5ea88cc1bd299b94e7a60795d883e0a16004c0068209015901c06ad990d54ad71724a3678551ab78938816aa399bbdc6e6b276cb7cf0e507810a6e38472a27ec23f54d0eb87562738f932d506c65f36461d159e53cd46ffed5030f502c2c0ba6f01047404760512a5c4a947bb3a096fb3b325ab7c53130c1e1c45ea5e8b2efe9d3778bc2b86b8e61dd15d58458446ee393275b6d8eb02c36eaa5f20c1cbfb7e13d90e4581b5e08cc6c23bbb4fba63b37bb3b597ce64fc1cfe50a1ddaaded8b5762ba24b4bcd2dcfbe72924c508e2da50c59ab7974e62d5ce061d0e21642fb858f4cad0390c13b277dad3c51d750ad4cf0c9ce870605e10481f07cc3f60b2845b488a445226c8e00a42b0e9b23a6fdc083720f10aa8bc37e99d96580224ca3e7d044ac04097d8e648f6f664bdeef50f2df21f9a171d670c83698de357276c21d70cbab333e106afc7756556da04fc0e336f218b15d592dd0680ae9d6f14320695532d90a3b19d231a6a1cbf1e9a74a758c7e94fd28e8299e541b682263b0fb4aacca71ee020f5645deb712874d68ac897046af1d6f8a8511a6c8b5e93cb843f7db6a80ae06161a8d373325fd19a0efcf6bc4c76635513353213c1d9d07e1fa563adabd17558a2ff1fece92c75a0957b3592ac2816f4fd9ad8773d83a400d9010281825820cd9ea9db9994cdf311fd1113c86f2c243037fe80e524f7b568e7dea7309bc24800018282583900c9c0b70e66812af4f3d5f3c986841ab51e8c4e78fc51e17805cf01cefd663095e5adc264dc2782d25ed53fc8352f89b47ba337041b5cda58821a00141fcca2581c919e8a1922aaa764b1d66407c6f62244e77081215f385b60a6209149a1494861707079436f696e01581cee1ce9d7560f48a4ba3867037dbec2d8fed776d94dd6b00a35309073a14001825839007a75f01a89fbe8053f115ed9a5fcf9edcfd95cf0d9755ab6d3c4f93deb54ea5e1faa92afe966f769d1f6b4d11d68450ca5d1f00e93aec38e821a0158a77ba2581c919e8a1922aaa764b1d66407c6f62244e77081215f385b60a6209149a1494861707079436f696e03581cee1ce9d7560f48a4ba3867037dbec2d8fed776d94dd6b00a35309073a14003021a0002ac21031a04351267ab00838258203753c8a7d729362985c0b9e56a2be91021e568bd5edb2622f0582b901bbea79e02825820587b30ba034c29929fdf99eae56cfc418cf5c93105bc8a6ba01fc411bfc75cea00825820a35ad4d5b1f338d1f0e2101823c39236edfcdd1511c7c8aeb91dd88b817a065a010183a300581d703f89c436844cd0acd2714201817836b2cd16b082e03e3a21bb69e5ad01821a001e8480a1581c2b556df9f37c04ef31b8f7f581c4e48174adcf5041e8e52497d81556a1484e6f64654665656401028201d818583cd87a9fd8799f581c564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff0d8799fd8799f1a000560341b00000191ed4abdb2ffffffff82581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a0089544082581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a0075b708021a0009ce9c031a0434f6b2081a0434f63a0b582091b0d6dba1d88661433fb0ed0097faa20ddc563980b6b66039fdb211cc8a30ee0d81825820587b30ba034c29929fdf99eae56cfc418cf5c93105bc8a6ba01fc411bfc75cea020e81581c564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01082581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a004876a1111a00370c3f12818258201a28375b01a8928f21a87598e24165ab5806e7c3e77a5eb4d78c56e3cf07894c00a600818258208ae2b54f272a4567937f8c3aa4a5dc1763b93476e200ab1fec255e8e66d35a2d000181a200583900eb21979c03eed7207020b2a0b47565b5aafb1a2c3849b59a1fa8e6c5e075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d6473903011b000000024fe9128f021a00033ba50758201d2d097c5bc8ff64223d674c1c3f57b08b34e34aa37b715e1e02f1f85bcadcfe0e81581ce075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d64739030f0083a100d9010281825820119feb7e0216cd3e4d3f1d0b491ba94741e06f3ee3a186fe5479ca889e5f03245840befa9dda302a102727303b28c6ddeb80c42a74412939e34c8dfe991ac0417be83999e9031cdcd5c4684ec3aa9813ae7c25345d2f57079ef99a1593f3c50b0a09a2008182582002205785797b8efa694d21d7dbc3a290d2ae09538957920c9409999c261ecb2f5840cbf97e51408fee6f25399fce2067aea5990890089a723ccdd242f2f1449e3d66e4227a69979bcd3a046a3144bffdbac8f748e70dbd95fb368e69512f4dc6d7070581840001d87980821a0012c8941a106a99c6a100828258208469288efa6f9cb49040b43dcff93f40969d72433f751afde50235012c01602058408fcfe92e2d6d1e4c5a5d4c8f9c6c928c802aa23b8b2d472a05e557a54fe1f3d991cc2686f6338ef6208f2f53a252fda9ffff9466ba7dc3b1b1e669b55097c30d82582076af5530fa318a370820270031d1838545a4ceed8696510627563d1114d4182b58405197dc7b6021cafa2ea7c962e53af5fe6edcc94e3c6fa1d79c53d02149384fcb659283c091b14c966c7865dd70f40cff167cc941c6bfc90a77503ea84ca2af01a102a11901fda50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c015073990c75d9f630e010c76eda61ca9a130258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b8c58401b3d030866084fcb259de07496d3197e913a39fd628a3db0a4ed6839261a00c51cb0a5b9c16194064132ace375ea23c75c60659400cba304d0d689c00086195d5840ff28714da02c35e7295815ba58b77f227e576fa254c464e2f9c6f9dfa900a0208250033c054a468c38e08819601d073c034a4727a524ff39995477443c1fca235840839c927599b253887f50487c1caf757c0aaf79bc3fcacd42252b8f2ae1f1a8b282929ca22bb5c2885cc23a66005c0cc1ca20142b82310c3a137d44c1943e40995840a7a7ce5c3475b5887a3765ede2ff3b7bfea90f255e2edf37fd44e27f26b8e6cf408aef4b20bebf7257b3dabc7eda65fff4ed278b50219f0a52367ff5b80e46b758403875f55a394d17a5d9a6b1a1deff5b2206e9e9734e9fbefa6a1cdfeb7a104546dfb6e46c46feaeb65a7f4648c276e29e87b27bc053bffef79359300220d0c3875840f2a05cc4880317358e19c758fd9ab9917551ce3987af2e35d73b6958a0f5732784621b0c92f68a93537f16f48445424890f955d7a597c13c2eb54a82b39f0307584097507df5fef916fabb6dafdfb516fb9184783e2cb4e89d048a6c1e5c04818bdb76ffb5cbef1fbe452658d904cd152ee72a3bfc6efe1199fb3b51f1979629cd4e5840fdb7df511723d4cead3d2b2eb9c1f18cbbfcf9f5cc8eac46dc03cd55fcac3303c391437f50400923e65c02e981af5461b6867a47fb25ebe9b0fb4d9e41ec210e58404b9011000206414523c0990f9ee20b5d8a745393d3febaf6413a448b994f1567eb7945df7a0ab44afd55561e0190b376d411026c5d7a4a49a19e0bd3f5addd6c5840492fde46eee8d75b587286291dfeb6a78fdf59c1a6bfa2717b1f41dfa878756140ce7c77504b64b094b870ade78569566eec66369133af5aa8c8eab9f95e29df58409ec10be251547101b24c495c8ff4fa55378dbb4a5c6e89b18a12ac033343d61c3b7f5fba725b51536d92a5cbfaef9be6d24a3e5b3d75a1c0e29e42f523567fac4d0f8200811c822d22ffc9fdbb42186358402fd6f584ef5f17fc0b0ebadf621dc9fece8008ea589b2e59ca5e6d17c386b16359d3edd2aad415ff5c6902e045359aaafdf69c9d9008e8eb4fff52a3c24f390d80 \ No newline at end of file From 54d92fb01dc47dc93ac83ab039a203753b3ec132 Mon Sep 17 00:00:00 2001 From: bkioshn Date: Mon, 16 Sep 2024 09:15:48 +0700 Subject: [PATCH 2/6] test(rust/cardano-chain-follower): add test for x509_chunk decompression --- .../src/metadata/cip509/x509_chunks.rs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/rust/cardano-chain-follower/src/metadata/cip509/x509_chunks.rs b/rust/cardano-chain-follower/src/metadata/cip509/x509_chunks.rs index 53e09216f8..c6ba7bd64d 100644 --- a/rust/cardano-chain-follower/src/metadata/cip509/x509_chunks.rs +++ b/rust/cardano-chain-follower/src/metadata/cip509/x509_chunks.rs @@ -81,3 +81,42 @@ fn decompress(d: &mut Decoder, algorithm: &CompressionAlgorithm) -> anyhow::Resu } Ok(buffer) } + +#[cfg(test)] +mod tests { + use super::*; + + // RAW data: 10 + const RAW: &str = "0a8d5840a50a81590238308202343082019da00302010202145afc371daf301793cf0b1835a118c2f90363d5d9300d06092a864886f70d01010b05003045310b300906035840550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c74643058401e170d3234303731313038353733365a170d3235303731313038353733365a3045310b30090603550406130241553113301106035504080c0a536f6d652d537458406174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c746430819f300d06092a864886f70d010101050003818d00308189025840818100cd28e20b157ca70c85433c1689b1d5890ec479bdd1ffdcc5647ae12be9badf4af20764cd24bd64130831a57506dfbbdd3e924c96b259c6ccedf24d6a255840618f0819643c739f145b733c3c94333e5937b499ada9a4ffc127457c7cb557f2f5623dcadea1e06f09129db9584b0aee949244b3252b52afde5d385c65e563a65840efb07f0203010001a321301f301d0603551d0e0416041492eb169818b833588321957a846077aa239cf3a0300d06092a864886f70d01010b0500038181002e5f584073333ce667e4172b252416eaa1d2e9681f59943724b4f366a8b930443ca6b69b12dd9debee9c8a6307695ee1884da4b00136195d1d8223d1c253ff408edfc8ed584003af1819244c35d3843855fb9af86e84fb7636fa3f4a0fc396f6fb6fd16d3bcebde68a8bd81be61e8ee7d77e9f7f9804e03ebc31b4581313c955a667658b14815840588b004301f50d6b52464320746573742043411a63b0cd001a6955b90047010123456789ab01582102b1216ab96e5b3b3340f5bdf02e693f16213a04525ed444584050b1019c2dfd3838ab010058406fc903015259a38c0800a3d0b2969ca21977e8ed6ec344964d4e1c6b37c8fb541274c3bb81b2f53073c5f101a5ac2a928865835840b6a2679b6e682d2a26945ed0b2181e81d9800558203b6a27bcceb6a42d62a3a8d02a6f0d73653215771de243a63ac048a18b59da2918288250667e69bd56a0fb583ed2d4db363e3bb017a150fdec9a8c902152433c25668aa3883cc9186481a5000001820a000250667e69bd56a0fbd2d4db363e3bb017a103000a6454657374"; + // Brotli data: 11 + const BROTLI: &str = "0b8c58401b3d030866084fcb259de07496d3197e913a39fd628a3db0a4ed6839261a00c51cb0a5b9c16194064132ace375ea23c75c60659400cba304d0d689c00086195d5840ff28714da02c35e7295815ba58b77f227e576fa254c464e2f9c6f9dfa900a0208250033c054a468c38e08819601d073c034a4727a524ff39995477443c1fca235840839c927599b253887f50487c1caf757c0aaf79bc3fcacd42252b8f2ae1f1a8b282929ca22bb5c2885cc23a66005c0cc1ca20142b82310c3a137d44c1943e40995840a7a7ce5c3475b5887a3765ede2ff3b7bfea90f255e2edf37fd44e27f26b8e6cf408aef4b20bebf7257b3dabc7eda65fff4ed278b50219f0a52367ff5b80e46b758403875f55a394d17a5d9a6b1a1deff5b2206e9e9734e9fbefa6a1cdfeb7a104546dfb6e46c46feaeb65a7f4648c276e29e87b27bc053bffef79359300220d0c3875840f2a05cc4880317358e19c758fd9ab9917551ce3987af2e35d73b6958a0f5732784621b0c92f68a93537f16f48445424890f955d7a597c13c2eb54a82b39f0307584097507df5fef916fabb6dafdfb516fb9184783e2cb4e89d048a6c1e5c04818bdb76ffb5cbef1fbe452658d904cd152ee72a3bfc6efe1199fb3b51f1979629cd4e5840fdb7df511723d4cead3d2b2eb9c1f18cbbfcf9f5cc8eac46dc03cd55fcac3303c391437f50400923e65c02e981af5461b6867a47fb25ebe9b0fb4d9e41ec210e58404b9011000206414523c0990f9ee20b5d8a745393d3febaf6413a448b994f1567eb7945df7a0ab44afd55561e0190b376d411026c5d7a4a49a19e0bd3f5addd6c5840492fde46eee8d75b587286291dfeb6a78fdf59c1a6bfa2717b1f41dfa878756140ce7c77504b64b094b870ade78569566eec66369133af5aa8c8eab9f95e29df58409ec10be251547101b24c495c8ff4fa55378dbb4a5c6e89b18a12ac033343d61c3b7f5fba725b51536d92a5cbfaef9be6d24a3e5b3d75a1c0e29e42f523567fac4d0f8200811c822d2210b97f5708"; + // Zstd data: 12 + const ZSTD: &str= "0c8c584028b52ffd605002251700942ca50a81590238308202343082019da00302010202145afc371daf301793cf0b1835a118c2f90363d5d9300d06092a864886f70d015840010b05003045310b300906035504061302415531133011080c0a536f6d652d53746174653121301f0a0c18496e7465726e65742057696467697473205074792058404c7464301e170d3234303731313038353733365a170d3235819f01050003818d0030818902818100cd28e20b157ca70c85433c1689b1d5890ec479bdd1ffdcc55840647ae12be9badf4af20764cd24bd64130831a57506dfbbdd3e924c96b259c6ccedf24d6a25618f0819643c739f145b733c3c94333e5937b499ada9a4ffc1274558407c7cb557f2f5623dcadea1e06f09129db9584b0aee949244b3252b52afde5d385c65e563a6efb07f0203010001a321301f301d0603551d0e0416041492eb1698584018b833588321957a846077aa239cf3a00b81002e5f73333ce667e4172b252416eaa1d2e9681f59943724b4f366a8b930443ca6b69b12dd9debee9c8a6307695e5840e1884da4b00136195d1d8223d1c253ff408edfc8ed03af1819244c35d3843855fb9af86e84fb7636fa3f4a0fc396f6fb6fd16d3bcebde68a8bd81be61e8ee7d758407e9f7f9804e03ebc31b4581313c955a667658b1481588b004301f50d6b52464320746573742043411a63b0cd001a6955b90047010123456789ab01582102b12158406ab96e5b3b3340f5bdf02e693f16213a04525ed44450b1019c2dfd3838ab010058406fc903015259a38c0800a3d0b2969ca21977e8ed6ec344964d4e1c6b37c85840fb541274c3bb81b2f53073c5f101a5ac2a92886583b6a2679b6e682d2a26945ed0b2181e81d9800558203b6a27bcceb6a42d62a3a8d02a6f0d73653215771de2584043a63ac048a18b59da2918288250667e69bd56a0fbd2d4db363e3bb017a150fdec9a8c902152433c25668aa3883cc9186481a5000001820a000250667e69bd56582ea0fbd2d4db363e3bb017a103000a64546573740000080084391c0898ad681c1a1ad7a506644166c038791758a719"; + + #[test] + fn test_decode_x509_chunks_raw() { + let raw_bytes = hex::decode(RAW).unwrap(); + let mut decoder = Decoder::new(raw_bytes.as_slice()); + let x509_chunks = X509Chunks::decode(&mut decoder, &mut ()); + // Decode the decompressed data should success. + assert!(x509_chunks.is_ok()); + } + + #[test] + fn test_decode_x509_chunks_brotli() { + let brotli_bytes = hex::decode(BROTLI).unwrap(); + let mut decoder = Decoder::new(brotli_bytes.as_slice()); + let x509_chunks = X509Chunks::decode(&mut decoder, &mut ()); + // Decode the decompressed data should success. + assert!(x509_chunks.is_ok()); + } + + #[test] + fn test_decode_x509_chunks_zstd() { + let zstd_bytes = hex::decode(ZSTD).unwrap(); + let mut decoder = Decoder::new(zstd_bytes.as_slice()); + let x509_chunks = X509Chunks::decode(&mut decoder, &mut ()); + // Decode the decompressed data should success. + assert!(x509_chunks.is_ok()); + } +} From c2b1bd66ba6b145b8303e67e0223a947ecdd5f77 Mon Sep 17 00:00:00 2001 From: bkioshn Date: Mon, 16 Sep 2024 09:17:41 +0700 Subject: [PATCH 3/6] fix(rust/cardano-chain-follower): payment key should accept negative number --- .../src/metadata/cip509/rbac/role_data.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/cardano-chain-follower/src/metadata/cip509/rbac/role_data.rs b/rust/cardano-chain-follower/src/metadata/cip509/rbac/role_data.rs index cbb68aa5c2..8845941723 100644 --- a/rust/cardano-chain-follower/src/metadata/cip509/rbac/role_data.rs +++ b/rust/cardano-chain-follower/src/metadata/cip509/rbac/role_data.rs @@ -7,7 +7,7 @@ use strum::FromRepr; use super::Cip509RbacMetadataInt; use crate::metadata::cip509::decode_helper::{ - decode_any, decode_array_len, decode_bytes, decode_i64, decode_map_len, decode_u64, decode_u8, + decode_any, decode_array_len, decode_bytes, decode_i16, decode_map_len, decode_u64, decode_u8, }; /// Struct of role data. @@ -20,7 +20,7 @@ pub struct RoleData { /// Optional role encryption key. pub role_encryption_key: Option, /// Optional payment key. - pub payment_key: Option, + pub payment_key: Option, /// Optional role extended data keys. /// Empty map if no role extended data keys. pub role_extended_data_keys: HashMap>, @@ -64,7 +64,7 @@ impl Decode<'_, ()> for RoleData { role_data.role_encryption_key = Some(KeyReference::decode(d, ctx)?); }, RoleDataInt::PaymentKey => { - role_data.payment_key = Some(decode_i64(d, "PaymentKey in RoleData")?); + role_data.payment_key = Some(decode_i16(d, "PaymentKey in RoleData")?); }, } } else { From 58a8c6bbd75e59f4022170cd77054b87e1d88f4f Mon Sep 17 00:00:00 2001 From: bkioshn Date: Mon, 16 Sep 2024 09:18:21 +0700 Subject: [PATCH 4/6] test(rust/cardano-chain-follower): add test for cip509 validation --- .../src/metadata/cip509/mod.rs | 228 ++++++++++++++++++ 1 file changed, 228 insertions(+) diff --git a/rust/cardano-chain-follower/src/metadata/cip509/mod.rs b/rust/cardano-chain-follower/src/metadata/cip509/mod.rs index 1b84037ad8..03b494994d 100644 --- a/rust/cardano-chain-follower/src/metadata/cip509/mod.rs +++ b/rust/cardano-chain-follower/src/metadata/cip509/mod.rs @@ -987,3 +987,231 @@ impl Cip509 { None } } + +#[cfg(test)] +mod tests { + + use dashmap::DashMap; + + use super::*; + fn conway_1() -> Vec { + hex::decode(include_str!( + "../../../test_data/conway_tx_rbac/conway_1.block" + )) + .expect("Failed to decode hex block.") + } + + fn conway_2() -> Vec { + hex::decode(include_str!( + "../../../test_data/conway_tx_rbac/conway_2.block" + )) + .expect("Failed to decode hex block.") + } + + fn conway_3() -> Vec { + hex::decode(include_str!( + "../../../test_data/conway_tx_rbac/conway_3.block" + )) + .expect("Failed to decode hex block.") + } + + fn cip_509_aux_data(tx: &MultiEraTx<'_>) -> Vec { + let raw_auxiliary_data = tx + .as_conway() + .unwrap() + .clone() + .auxiliary_data + .map(|aux| aux.raw_cbor()); + + let raw_cbor_data = match raw_auxiliary_data { + pallas::codec::utils::Nullable::Some(data) => Ok(data), + _ => Err("Auxiliary data not found"), + }; + + let auxiliary_data = RawAuxData::new(raw_cbor_data.expect("Failed to get raw cbor data")); + auxiliary_data + .get_metadata(LABEL) + .expect("Failed to get metadata") + .to_vec() + } + + #[test] + fn test_decode_cip509() { + let cip_509 = "a50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c01504dd9d3b2ef173daf8612819857721d4b0258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b8c58401b3d030866084fcb259de07496d3197e913a39fd628a3db0a4ed6839261a00c51cb0a5b9c16194064132ace375ea23c75c60659400cba304d0d689c00086195d5840ff28714da02c35e7295815ba58b77f227e576fa254c464e2f9c6f9dfa900a0208250033c054a468c38e08819601d073c034a4727a524ff39995477443c1fca235840839c927599b253887f50487c1caf757c0aaf79bc3fcacd42252b8f2ae1f1a8b282929ca22bb5c2885cc23a66005c0cc1ca20142b82310c3a137d44c1943e40995840a7a7ce5c3475b5887a3765ede2ff3b7bfea90f255e2edf37fd44e27f26b8e6cf408aef4b20bebf7257b3dabc7eda65fff4ed278b50219f0a52367ff5b80e46b758403875f55a394d17a5d9a6b1a1deff5b2206e9e9734e9fbefa6a1cdfeb7a104546dfb6e46c46feaeb65a7f4648c276e29e87b27bc053bffef79359300220d0c3875840f2a05cc4880317358e19c758fd9ab9917551ce3987af2e35d73b6958a0f5732784621b0c92f68a93537f16f48445424890f955d7a597c13c2eb54a82b39f0307584097507df5fef916fabb6dafdfb516fb9184783e2cb4e89d048a6c1e5c04818bdb76ffb5cbef1fbe452658d904cd152ee72a3bfc6efe1199fb3b51f1979629cd4e5840fdb7df511723d4cead3d2b2eb9c1f18cbbfcf9f5cc8eac46dc03cd55fcac3303c391437f50400923e65c02e981af5461b6867a47fb25ebe9b0fb4d9e41ec210e58404b9011000206414523c0990f9ee20b5d8a745393d3febaf6413a448b994f1567eb7945df7a0ab44afd55561e0190b376d411026c5d7a4a49a19e0bd3f5addd6c5840492fde46eee8d75b587286291dfeb6a78fdf59c1a6bfa2717b1f41dfa878756140ce7c77504b64b094b870ade78569566eec66369133af5aa8c8eab9f95e29df58409ec10be251547101b24c495c8ff4fa55378dbb4a5c6e89b18a12ac033343d61c3b7f5fba725b51536d92a5cbfaef9be6d24a3e5b3d75a1c0e29e42f523567fac4d0f8200811c822d2210b97f5708186358403b22c9d23b9e33092595b517442f4c73fbe11f2ec5bb7b3eb1ed060aeca73bfe750496dc8bdf459e9100c0013801dd1c6783d1703e18f738cf1b13561eaa1209"; + let binding = hex::decode(cip_509).unwrap(); + let mut decoder = Decoder::new(binding.as_slice()); + let decoded_cip509 = Cip509::decode(&mut decoder, &mut ()).unwrap(); + + let purpose: [u8; 16] = hex::decode("ca7a1457ef9f4c7f9c747f8c4a4cfa6c") + .unwrap() + .try_into() + .unwrap(); + let txn_inputs_hash: [u8; 16] = hex::decode("4dd9d3b2ef173daf8612819857721d4b") + .unwrap() + .try_into() + .unwrap(); + let prv_tx_id: [u8; 32] = + hex::decode("4d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c2") + .unwrap() + .try_into() + .unwrap(); + let validation_signature = hex::decode("3b22c9d23b9e33092595b517442f4c73fbe11f2ec5bb7b3eb1ed060aeca73bfe750496dc8bdf459e9100c0013801dd1c6783d1703e18f738cf1b13561eaa1209").unwrap(); + + assert_eq!(decoded_cip509.purpose, purpose); + assert_eq!(decoded_cip509.txn_inputs_hash, txn_inputs_hash); + assert_eq!(decoded_cip509.prv_tx_id, Some(prv_tx_id)); + assert_eq!(decoded_cip509.validation_signature, validation_signature); + } + + #[test] + fn test_validate_txn_inputs_hash() { + let decoded_metadata = DecodedMetadata(DashMap::new()); + let mut validation_report = ValidationReport::new(); + let conway_block_data = conway_1(); + let multi_era_block = pallas::ledger::traverse::MultiEraBlock::decode(&conway_block_data) + .expect("Failed to decode MultiEraBlock"); + + let transactions = multi_era_block.txs(); + // First transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[0].clone(); + let aux_data = cip_509_aux_data(&tx); + + let mut decoder = Decoder::new(aux_data.as_slice()); + let cip509 = Cip509::decode(&mut decoder, &mut ()).expect("Failed to decode Cip509"); + assert!(cip509 + .validate_txn_inputs_hash(&tx, &mut validation_report, &decoded_metadata) + .unwrap()); + } + + #[test] + fn test_validate_aux() { + let decoded_metadata = DecodedMetadata(DashMap::new()); + let mut validation_report = ValidationReport::new(); + let conway_block_data = conway_1(); + let multi_era_block = pallas::ledger::traverse::MultiEraBlock::decode(&conway_block_data) + .expect("Failed to decode MultiEraBlock"); + + let transactions = multi_era_block.txs(); + // First transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[0].clone(); + + let aux_data = cip_509_aux_data(&tx); + + let mut decoder = Decoder::new(aux_data.as_slice()); + let mut cip509 = Cip509::decode(&mut decoder, &mut ()).expect("Failed to decode Cip509"); + assert!(cip509 + .validate_aux(&tx, &mut validation_report, &decoded_metadata) + .unwrap()); + } + + #[test] + fn test_validate_public_key_success() { + let decoded_metadata = DecodedMetadata(DashMap::new()); + let mut validation_report = ValidationReport::new(); + let conway_block_data = conway_1(); + let multi_era_block = pallas::ledger::traverse::MultiEraBlock::decode(&conway_block_data) + .expect("Failed to decode MultiEraBlock"); + + let transactions = multi_era_block.txs(); + // First transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[0].clone(); + + let aux_data = cip_509_aux_data(&tx); + + let mut decoder = Decoder::new(aux_data.as_slice()); + let cip509 = Cip509::decode(&mut decoder, &mut ()).expect("Failed to decode Cip509"); + assert!(cip509 + .validate_stake_public_key(&tx, &mut validation_report, &decoded_metadata, 0) + .unwrap()); + } + + #[test] + fn test_validate_payment_key_success_positive_ref() { + let decoded_metadata = DecodedMetadata(DashMap::new()); + let mut validation_report = ValidationReport::new(); + let conway_block_data = conway_1(); + let multi_era_block = pallas::ledger::traverse::MultiEraBlock::decode(&conway_block_data) + .expect("Failed to decode MultiEraBlock"); + + let transactions = multi_era_block.txs(); + // First transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[0].clone(); + + let aux_data = cip_509_aux_data(&tx); + + let mut decoder = Decoder::new(aux_data.as_slice()); + let cip509 = Cip509::decode(&mut decoder, &mut ()).expect("Failed to decode Cip509"); + + if let Some(role_set) = &cip509.x509_chunks.0.role_set { + for role in role_set { + if role.role_number == 0 { + assert!(cip509 + .validate_payment_key( + &tx, + &mut validation_report, + &decoded_metadata, + 0, + role + ) + .unwrap()); + } + } + } + } + + #[test] + fn test_validate_payment_key_success_negative_ref() { + let decoded_metadata = DecodedMetadata(DashMap::new()); + let mut validation_report = ValidationReport::new(); + let conway_block_data = conway_3(); + let multi_era_block = pallas::ledger::traverse::MultiEraBlock::decode(&conway_block_data) + .expect("Failed to decode MultiEraBlock"); + + let transactions = multi_era_block.txs(); + // Third transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[2].clone(); + + let aux_data = cip_509_aux_data(&tx); + + let mut decoder = Decoder::new(aux_data.as_slice()); + let cip509 = Cip509::decode(&mut decoder, &mut ()).expect("Failed to decode Cip509"); + + if let Some(role_set) = &cip509.x509_chunks.0.role_set { + for role in role_set { + if role.role_number == 0 { + println!( + "{:?}", + cip509.validate_payment_key( + &tx, + &mut validation_report, + &decoded_metadata, + 0, + role + ) + ); + } + } + } + } + + #[test] + fn test_validate_public_key_fail() { + let decoded_metadata = DecodedMetadata(DashMap::new()); + let mut validation_report = ValidationReport::new(); + let conway_block_data = conway_2(); + let multi_era_block = pallas::ledger::traverse::MultiEraBlock::decode(&conway_block_data) + .expect("Failed to decode MultiEraBlock"); + + let transactions = multi_era_block.txs(); + // Fift transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[4].clone(); + + let aux_data = cip_509_aux_data(&tx); + + let mut decoder = Decoder::new(aux_data.as_slice()); + let cip509 = Cip509::decode(&mut decoder, &mut ()).expect("Failed to decode Cip509"); + assert!(!cip509 + .validate_stake_public_key(&tx, &mut validation_report, &decoded_metadata, 0) + .unwrap()); + } +} From 4b8516b7bfa19b399e171c7e45d73c41e4c989a8 Mon Sep 17 00:00:00 2001 From: bkioshn Date: Mon, 16 Sep 2024 09:26:28 +0700 Subject: [PATCH 5/6] chore(rust/cardano-chain-follower): typo --- rust/cardano-chain-follower/src/metadata/cip509/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/cardano-chain-follower/src/metadata/cip509/mod.rs b/rust/cardano-chain-follower/src/metadata/cip509/mod.rs index 03b494994d..a7e97362c9 100644 --- a/rust/cardano-chain-follower/src/metadata/cip509/mod.rs +++ b/rust/cardano-chain-follower/src/metadata/cip509/mod.rs @@ -1203,7 +1203,7 @@ mod tests { .expect("Failed to decode MultiEraBlock"); let transactions = multi_era_block.txs(); - // Fift transaction of this test data contains the CIP509 auxiliary data + // Fifth transaction of this test data contains the CIP509 auxiliary data let tx = transactions[4].clone(); let aux_data = cip_509_aux_data(&tx); From e4cf2c2c05ce3e3a9793a83e8a6f5720702ab37e Mon Sep 17 00:00:00 2001 From: bkioshn Date: Mon, 16 Sep 2024 16:39:15 +0700 Subject: [PATCH 6/6] fix(rust/cardano-chain-follower): update test data --- .../src/metadata/cip509/mod.rs | 20 +++++++++---------- .../test_data/conway_tx_rbac/Readme.md | 4 ++-- .../test_data/conway_tx_rbac/conway_1.block | 2 +- .../test_data/conway_tx_rbac/conway_3.block | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/rust/cardano-chain-follower/src/metadata/cip509/mod.rs b/rust/cardano-chain-follower/src/metadata/cip509/mod.rs index d5641cfcdb..75bac279cb 100644 --- a/rust/cardano-chain-follower/src/metadata/cip509/mod.rs +++ b/rust/cardano-chain-follower/src/metadata/cip509/mod.rs @@ -1084,8 +1084,8 @@ mod tests { .expect("Failed to decode MultiEraBlock"); let transactions = multi_era_block.txs(); - // First transaction of this test data contains the CIP509 auxiliary data - let tx = transactions[0].clone(); + // Second transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[1].clone(); let aux_data = cip_509_aux_data(&tx); let mut decoder = Decoder::new(aux_data.as_slice()); @@ -1104,8 +1104,8 @@ mod tests { .expect("Failed to decode MultiEraBlock"); let transactions = multi_era_block.txs(); - // First transaction of this test data contains the CIP509 auxiliary data - let tx = transactions[0].clone(); + // Second transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[1].clone(); let aux_data = cip_509_aux_data(&tx); @@ -1125,8 +1125,8 @@ mod tests { .expect("Failed to decode MultiEraBlock"); let transactions = multi_era_block.txs(); - // First transaction of this test data contains the CIP509 auxiliary data - let tx = transactions[0].clone(); + // Second transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[1].clone(); let aux_data = cip_509_aux_data(&tx); @@ -1146,8 +1146,8 @@ mod tests { .expect("Failed to decode MultiEraBlock"); let transactions = multi_era_block.txs(); - // First transaction of this test data contains the CIP509 auxiliary data - let tx = transactions[0].clone(); + // Second transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[1].clone(); let aux_data = cip_509_aux_data(&tx); @@ -1180,8 +1180,8 @@ mod tests { .expect("Failed to decode MultiEraBlock"); let transactions = multi_era_block.txs(); - // Third transaction of this test data contains the CIP509 auxiliary data - let tx = transactions[2].clone(); + // Second transaction of this test data contains the CIP509 auxiliary data + let tx = transactions[1].clone(); let aux_data = cip_509_aux_data(&tx); diff --git a/rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md b/rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md index 57b235b11a..7715cdb36f 100644 --- a/rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md +++ b/rust/cardano-chain-follower/test_data/conway_tx_rbac/Readme.md @@ -18,9 +18,9 @@ The current validation includes ## Test Data -* `conway_1.block`: Block number: `2684141`, Absolute slot number: `70512378` +* `conway_1.block`: Block number: `2694583`, Absolute slot number: `70795216` * `conway_2.block`: Block number: `2625015`, Absolute slot number: `68906742` -* `conway_3.block`: Block number: `2686596`, Absolute slot number: `70579800` +* `conway_3.block`: Block number: `2694587`, Absolute slot number: `70795304` ## References diff --git a/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block index b1fd443b42..ae3fb4ece2 100644 --- a/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block +++ b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_1.block @@ -1 +1 @@ -820785828a1a0028f4ed1a0433eefa582030bf7177c5ae2a9aa030347f79f1d8c3bac7bc2e5b05cc4ae64952f85d1a8a325820a8b8d238db94519c71fee2e5c0caac00cfd4e11f7ed1d813220a59143e179c415820732bd5eb4b5b131df6f238723d965585562f461378308283d277ea4cdb790a518258403a952f2a11cc0d78c810118f038029d77435230460577c4d6b9f83924ecf2051dadd3389f7415167d1dceaf9de68af6c335f3df58a3b6d7e4ce29c8feeb8be695850f5a72771d92a26b2eb0da93d1cbd12f5d530e57b5323f1754c12d656369e42dc301f0d3dd12c604deb316f9d8178b77d4c75b6a9448fd9ca7aaab1f24c5de692b87e0a7dd2cc6746e16d6df0f65489061904e958201989697f290b6ebb2744976439ba4174c0e589355ac03c495dd41303107210c284582053d2f62efd6dd50719a526166aa64bd492cac64fa6b858cd71eb37e14ef613d60619020a58407d6779eee8d316895cd1b7528cb91b0fc0daa7b0bcde1c6b93c64b6ab9843e8f95ca50e688d2db1aee316a125994d81e03173ad59395094e180c3a413ddda2018209015901c0d9f3522654763fedf46970f2af3721f4cd62b4460eadeba5237037ede355f05bcb7acb67d81a555ebaa8296de6fa55ba6b35a7201b7c2be23155e2824ee2520a2f3aece3ec94421f2a1e59d19183bca92bc39fd13aadcded2a335ccf63306ede256d78d96d84971c6fca5f6d1f3005f951090cb69b6f6881b9fca2ed34d1852f4c102d611544228dd41ef274225fc72991e246e7ca14ea8d458b4e205d26171bc32d65a61b66dc67a1d88177204fb7acadd07d88916a696c190511bc2b957cdadea897a12eb87b7544b57f4b69005fdfd9e4c691053f6af81598b42ddf077112c100c8028b167b051a1097b64eed78ad2f1772373f8b9ea56e35c1b873090bd25ee2c9066dfac1e939ea89d574676716797a084b53ba6086969e05a11035992b13a2d1dbfc3403743cb47cd6fd0321f0d5fca16e1d6883f51838111a59538c870f303381d01be41feffceab7a16065bc14056462828e947966959a2828498b2452f72623554d6aabde6400bc1d9d93cdae201d8525a94927420c7a505a48cc76bcb5c417ba1c5af8ee79b49abc2f28bbf8dd262c1403ceb446340dafe2d943501757b5b66e8874158100c3499b5a12c91ee3eada0a862625f5966931ba4aa54981a60081825820444b6ac4cbef80fa420b1880fe6f48a5d21a2391fe561abe987c56102b464b2e000181a200583900eb21979c03eed7207020b2a0b47565b5aafb1a2c3849b59a1fa8e6c5e075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d6473903011b000000025003244f021a0003372d075820eadec4a094c0c9edcfb3ce5582bb89fd48805d7c349b89537a1d0202a37cc1bd0e81581ce075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d64739030f0081a100828258208469288efa6f9cb49040b43dcff93f40969d72433f751afde50235012c0160205840bb6298cda951ea27eb0accf72f3b478e035deb74efb91a6905813f6d9ed52940ab06cb61ba967267f771873af32f319a78dc29851ebe94a4a96316b94d81f80282582076af5530fa318a370820270031d1838545a4ceed8696510627563d1114d4182b5840ce5ad68ffe14c5dec9551a8dbdba6176afc903e68a662e6c7f98f3d797557dc001afb80ab101632b3845aadfe84eabd7e167cf8f5cf021dc4220d6a673a3ff01a100a11901fda50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c0150c39ea979cd06bdc62eee8422a19361da0258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b8b58401b09048064084f8b2b0dc2dd44a61d5c0c4ef620f87f37f5000ff1946fb706d0f7268e255684615920797acf734fc8224eb7197419d8ab868cb5be7696f3994258406c0360b135c350c9221c43314ccf2774cfee070b8dd79c709dd157d779a7e943d4cc0580a47057652be88502c0a3f05c825260b9d9500164bee00af9dd011a005840bde49a23144104280752cbf8425e6ad77503d4078a850542e1442bd2109e3675a1a42c9f030b4391970f08845e1082406f581492be6f46e7b990742b6e8df4735840dd542ee353bdda6ecea406fcce7c29a5d5bb02d12abec73a636fb8f257db52e62360de0166816f9bcb08660660a6b2dd6256fa1ae6194ff0fc58604bcad3446d5840447687b2ca55828795cd2d419e9e9534adf6d4c8c52e97be31a8536b02b440a3a9f4ee08eca80d048db4afb655ddea5da35377d23e01fe6a6dad575b635b839f584052dd5cdf56ad54f9e86ad44080af2921081c231f01f319db13048eb9ae144a921c1cdd2e5646e28b849ebdf9fd3cb95fee9fd53e137f87584cb9107cb8c8999b5840874722f9f71256ae0dec4a9c23183b07b9bdad2439b33e63ad6a7dbc38f3787ee16164d9cdf5a6e3f6dc06a9572ce04ddf7b5bf1cd2b53a79ec765b2b94b73125840ea47ede0e931058f9184839d037d07ab7326c7a3a86d6ccde8b526aa2727743fa20f1dbfc06a5b313bfd49abb9fbbef11153ffbc4e9e39d3f7d7f1c7dd46d1175840e925b35ea90a97b0188ab354276d7fb6b020a264c330a4c768e5a7a4691fc7e20ffef38e8df03dfeaae0cfdca04393824cdcc71e497c71ff95b0d6ebb945f8c6584095b2439d0d3d275295cddcd143765ce1d8159df9989105737b902cb00aae77dc7761c732f7aaa5ab2eb9b488344a2ffd0ef327d12b820e252c1e5b78c7d9c8895834cd009d9daf3f3b4d35d7d7db36e139f4389ae1b2cb2779eacbe08f974e9eb2d9b1ffef48239a598e2028cb47b0c380237cfa6f2418635840d89b0c89865f3aac53a78c0cfc26fbc49a869970254262a56f78aa80f309ab4f9d30b4a6b381d770829c25f0dde0306fc2651dace0dbdf39acd95fd923bfac0980 \ No newline at end of file +820785828a1a00291db71a04383fd05820e17d79a3f151867ade791776d0e0943015e7f9798bdd303d30dca9334af1707758200339649fecc4224156494435a46d783d72c8b47fe54e411e6b8fdadda3a7585058203997f8cde4ebadc8993fb0e73c88a7058ec089a6311cc1f930388b9114fc3c998258409c01ac9306d07079b50e3bdb2ef9d0b7d71535a118460e17c0e58e159274aeab24964296043f1500e4b879c70771f36de6b870ffe1e2c7a33edef417d5f7432958502b5f608087b3b56b6e400f1b24564b5da14931c3784640646f3626bca9794624fb73ac116c0ca2f4806b8120c31bce646afb14f2e59f21566a1b6b8def2e81a49c4112660d87e54f0c156039b698dd0619127a5820e5214fe9e610868c77834c869e84c70ab20cdc54c962b16c55aeeba6bb3f888a845820dd91ee0776a240d3a6814843fd7a2fd833dcffba0ae5e0020608bb0cfe8df22a071901f9584000f01b8bc5c60a45a2ba47140faaa57affe1e6ecf659d4438b7e98307ff33221ca1c46c4c3848b0346504c747515813c6f58a2370faab28d7657435b6ad041038209015901c09da71f08ecf5bc180dacb9e8875747ecffe89b2984e26a3fce35a863a0f9a3c601b40cd2d7e8efd53b8751f4abeb13fcb23eebfbb4e7c99525694b2730721e077e9fb387bc2d6962ab39fcc89044f25ded89f8d7e9476a0a32f3e181ffd436e201002838577d56e469a0fe7a3448a1638ec0333f99de6d8a2f1e72ef1e8a1af84d2fda9ff7e33bb09c3ced807c8c8cd66a990089d36f160694bdaced321717b199feb4bfd0ccf99070d8124bd2b92efdb362bca41519a344d9d7ce248014c33d53f8fae8552283dce3fcdff8aa0c757728b7c052635e042e202ba21bb6ab888ebe1daf103290faf3afbb55650a5d0f624028e8285a003da4a7155a3bd30aa9b415bbac5d26803bb972ed063740a9ffe703bf8db6a49bc165f5dcc8c0d14dc67915af8c57bf0675eba89d3f1a6ce88814f0d1aa4fc9c75d25beafe72cfbfd9fd339140d8e9ccc5c7fdd9dde77381fe5805f68f5ec54349534602504b9d1c5eef5963cde362c79db8c9a4d4437f3461b406a4d46e34724354a150b9f6fab6c0e9efb534a63f03638b7a9a9a4e913a7aac3abc65616a530c757252e18b20074580b35022990748c5b707a65ca9286e9766a2b2e9ed80b04b3659c3ad6c75110bb7485a50081825820cf8057752280a5a13c1ae3651ce6f9b79881e43969810cce9238b0ee76442550010182825839006f2c165bfb9e28a313da02d395eafe57ee1081bb14b8faac1856b0473907b2a702a6dcd0d937d4cbdd2ea8db46c335f9c6980ee93b0ee9b31a00a542f782583900fe33b43ae102d26c495a616187fd535a8ab31cf0cb0d7bc4f2ac35343f05a30548ea2f467860ff3ea675fcebf50bccf21eb99c9fc92d854a1b00000001d81af4c2021a000295c9031a04385bc7081a03ee2678a60081825820e164beb32197cdff998d704c5dbd05eef9dfa45b5de257122553a8db7808a13b000181a200583900eb21979c03eed7207020b2a0b47565b5aafb1a2c3849b59a1fa8e6c5e075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d6473903011b000000024fdf6838021a0003372d0758207a92d08053d510a28a64353b3e6e359bb67127bd7df356a55f2fa66bef1e21cc0e81581ce075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d64739030f00a400818258209cff23a1a46e3d084a3c024c1cd155b7f139e7b59916b9332783d2eea2035756020183a300581d704282ff43cff01fc2bcd6bcb700884586148e14c35192deff2e18ae0701821a0018fda8a1581cc2ecc337337cf48720e3747c833c9c179e08d2ea235d9bee7afbcb17a1444155544801028201d8185887d8799fd8799f4d59617272612047617264656e734a313066204d616964656e1b00000191fa21ba2e1b00000191ff48162e1b00000191ff513dee194e20d87a8010d87a809f1988b81961a8194e20193a98191388ff192710a140a1401a00989680a0582028cb63b4bcdbaecef3b5c05d0c18f7dbe3f3050beaaa6fdb45f0b0f9fc81f9dc40ffffa300581d704282ff43cff01fc2bcd6bcb700884586148e14c35192deff2e18ae07011a000f2044028201d8185818d905029fd8799fd87a80d879801b00000192099df5eeffff82581d6069d48095b0a51528bfe321b4bf4ad335c1929f17e6810dde4fe228dd821a70ae27fba1581cc2ecc337337cf48720e3747c833c9c179e08d2ea235d9bee7afbcb17a144415554481a000dc6f8021a0002b95d0f00ab0083825820c9f154a78548b18f97c9ce6fc8e33c2bd242cbaf018d8fe77d04bd0de542b97701825820e934b3f89e943b0596f7cbf93bbd4dc546a3afdcaff126bff7d07c1faf0a672300825820e934b3f89e943b0596f7cbf93bbd4dc546a3afdcaff126bff7d07c1faf0a6723010183a300581d70284cdf01757311c543fac6e755f9d644dc5865617efcdc2b81b249fd01821a001e8480a1581c2232026bd47c51e9777eae1d913de051ef22242125fafb70159d171fa1484e6f64654665656401028201d818583cd87a9fd8799f581c5d038a0789159458ca38d05c60bec3475d22030f0e038dee393f0046d8799fd8799f1a000e68dc1b00000191fa21dfb9ffffffff82581d605d038a0789159458ca38d05c60bec3475d22030f0e038dee393f00461a0089544082581d605d038a0789159458ca38d05c60bec3475d22030f0e038dee393f00461a007f85a4021a0009ce9c031a0438401f081a04383fa70b582091b0d6dba1d88661433fb0ed0097faa20ddc563980b6b66039fdb211cc8a30ee0d81825820e934b3f89e943b0596f7cbf93bbd4dc546a3afdcaff126bff7d07c1faf0a6723020e81581c5d038a0789159458ca38d05c60bec3475d22030f0e038dee393f00461082581d605d038a0789159458ca38d05c60bec3475d22030f0e038dee393f00461a005befbd111a00370c3f1281825820fee1be4cc8b034a3cb036a0e2857a257905d1634b0b869935c9bc4d33aac556500ab00d90102858258205551c51771a3c2de3cf83f515d6fefc1269f0d0a66647759a530ed4c4f0957b0028258205551c51771a3c2de3cf83f515d6fefc1269f0d0a66647759a530ed4c4f0957b0038258205551c51771a3c2de3cf83f515d6fefc1269f0d0a66647759a530ed4c4f0957b0048258205551c51771a3c2de3cf83f515d6fefc1269f0d0a66647759a530ed4c4f0957b0058258205551c51771a3c2de3cf83f515d6fefc1269f0d0a66647759a530ed4c4f0957b006018b82581d6089a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a831a001e848082581d6089a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a831a001e848082581d6089a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a831a001e848082581d6089a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a831a001e848082581d6089a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a831a001e8480a300583910fc0e7851b524e4519c13ea212b98b30dc316ea18f1c026531d8a3830d612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527011a014fb180028201d8185891d8799f581c52e70cf4347f089d8f3ac0f689343f3e4b0ab8d5a6037a14df0f2db9d8799f581cd612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527ff9fd8799f40401a001e8480ffff581c89a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a83d87a801b00000191fa344418d8799f1b00000191ff23b198ff01d87a801a000f4240ffa300583910fc0e7851b524e4519c13ea212b98b30dc316ea18f1c026531d8a3830d612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527011a014fb180028201d8185891d8799f581c52e70cf4347f089d8f3ac0f689343f3e4b0ab8d5a6037a14df0f2db9d8799f581cd612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527ff9fd8799f40401a001e8480ffff581c89a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a83d87a801b00000191fa344418d8799f1b00000191ff23b198ff01d87a801a000f4240ffa300583910fc0e7851b524e4519c13ea212b98b30dc316ea18f1c026531d8a3830d612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527011a014fb180028201d8185891d8799f581c52e70cf4347f089d8f3ac0f689343f3e4b0ab8d5a6037a14df0f2db9d8799f581cd612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527ff9fd8799f40401a001e8480ffff581c89a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a83d87a801b00000191fa344418d8799f1b00000191ff23b198ff01d87a801a000f4240ffa300583910fc0e7851b524e4519c13ea212b98b30dc316ea18f1c026531d8a3830d612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527011a014fb180028201d8185891d8799f581c52e70cf4347f089d8f3ac0f689343f3e4b0ab8d5a6037a14df0f2db9d8799f581cd612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527ff9fd8799f40401a001e8480ffff581c89a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a83d87a801b00000191fa344418d8799f1b00000191ff23b198ff01d87a801a000f4240ffa300583910fc0e7851b524e4519c13ea212b98b30dc316ea18f1c026531d8a3830d612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527011a014fb180028201d8185891d8799f581c52e70cf4347f089d8f3ac0f689343f3e4b0ab8d5a6037a14df0f2db9d8799f581cd612cf3028c5dd7b3046df9789e825c2552338abf85c0eb89b5c3527ff9fd8799f40401a001e8480ffff581c89a61e3c09bc2755ec443e6edb5602bd4a1753bc1c1eefbb9f232a83d87a801b00000191fa344418d8799f1b00000191ff23b198ff01d87a801a000f4240ff82581d60a2c0bee5044bcc9324f63cacacb58a2725f7966bc703bd827e8d68e61a0043c163021a000889dd031a043841ff081a04383fa70b5820b0c8bcc8608c3a57a6a3a18583012dfcedf770da60e64d1966779280e81770960dd90102818258205ae5362f6fa5b485fae8fb8e5eeaa3eb6f58641cdf8836eb0d75a564d9906ebf020ed9010281581ca2c0bee5044bcc9324f63cacacb58a2725f7966bc703bd827e8d68e61082581d60a2c0bee5044bcc9324f63cacacb58a2725f7966bc703bd827e8d68e61a066b060c111a000ccecc12d90102828258209bffe27bb23b2f1ee97f2aa17be16146283dd954dfecfbf317f37a0d0c6b949a00825820119e2c8b8611af2dbf812f64c005ce7538156cf81be497c4a0aec9cbf2e95ad50085a1008182582046c7b1430923a9aa57971324819633d7f0dc984ae03ba37b2c58631ea9f18f1d58406c26412f34a1e09d8c1f3a845b6800a3ecb2d5c5802f9bb218a556ddb87d380e39b2e7f4bae4a7bbfa771682c8af7dc5620fd43eae9db3ec7a1a8e2a4e53940ca100828258208469288efa6f9cb49040b43dcff93f40969d72433f751afde50235012c0160205840a42968764bcd3d13bf945fc9b8e82b7e8c3f9275aa42bf7f3744c90e8b0922223d5498d94044aa4dcc49aac26fc42274028e1197f8df4e36ef6ba2833ae3160382582076af5530fa318a370820270031d1838545a4ceed8696510627563d1114d4182b584069c5a02a973b7d4a63263086766d853f879fc5f89a8ee86b0f8d601d4ebaca3ccfc711d4ba360c5eadbaedc385b6429492aae6fbc8f9c8b59dbf9387b5a4e808a1008182582023c47a8eb32995326cd79f8b0a50e78d70a9863f4310a95c8bffd9cc2845f57b5840b79ae4ddc5273760e664702749e8580761fd8188d1e7902944860464f5aa6065749a8857c04b295c86e3c8428465f62f0954366b6fb7e0380206ffc3c0ca3309a20081825820bbf1fcb4bf3a1c8fb7765b8c2d5546e771f025b8862fbed3de0c222009afd55f58406801cd576631b4128c2b7eeda2c9e49a7c01fdd4a5bd2c06cbf9ada4abf42e55ed9913ab10ecde07aad2f5528e961b8522d7e7d7022b9f92d8ed4c0b60af2c0e0581840001d87980821a0012c8941a106a99c6a200d90102818258208a1737f82161d4de35b8eb9703b8a7f7e98d240fabf0e7eb71709c6888f05b5c58401194df9c8535fcba11ce5c63e2948b1af782eb21bb9f36533e0dff079349e6c16f1bf51411cd3b07c79e92f87399c3d6b5cf99ebd21b39cefe0a53467037400205a582000082d87a9f000500d87a80ff821a000981d81a0bfeb29582000182d87a9f010500d87a80ff821a0009b3101a0c34de8482000282d87a9f020500d87a80ff821a0009e4481a0c6b0a7382000382d87a9f030500d87a80ff821a000a15801a0ca1366282000482d87a9f040500d87a80ff821a000a46b81a0cd76251a101a11901fda50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c015065385c39ee6da728c2066f35950340fc0258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b8b58401b09048064084f8b2b0dc2dd44a61d5c0c4ef620f87f37f5000ff1946fb706d0f7268e255684615920797acf734fc8224eb7197419d8ab868cb5be7696f3994258406c0360b135c350c9221c43314ccf2774cfee070b8dd79c709dd157d779a7e943d4cc0580a47057652be88502c0a3f05c825260b9d9500164bee00af9dd011a005840bde49a23144104280752cbf8425e6ad77503d4078a850542e1442bd2109e3675a1a42c9f030b4391970f08845e1082406f581492be6f46e7b990742b6e8df4735840dd542ee353bdda6ecea406fcce7c29a5d5bb02d12abec73a636fb8f257db52e62360de0166816f9bcb08660660a6b2dd6256fa1ae6194ff0fc58604bcad3446d5840447687b2ca55828795cd2d419e9e9534adf6d4c8c52e97be31a8536b02b440a3a9f4ee08eca80d048db4afb655ddea5da35377d23e01fe6a6dad575b635b839f584052dd5cdf56ad54f9e86ad44080af2921081c231f01f319db13048eb9ae144a921c1cdd2e5646e28b849ebdf9fd3cb95fee9fd53e137f87584cb9107cb8c8999b5840874722f9f71256ae0dec4a9c23183b07b9bdad2439b33e63ad6a7dbc38f3787ee16164d9cdf5a6e3f6dc06a9572ce04ddf7b5bf1cd2b53a79ec765b2b94b73125840ea47ede0e931058f9184839d037d07ab7326c7a3a86d6ccde8b526aa2727743fa20f1dbfc06a5b313bfd49abb9fbbef11153ffbc4e9e39d3f7d7f1c7dd46d1175840e925b35ea90a97b0188ab354276d7fb6b020a264c330a4c768e5a7a4691fc7e20ffef38e8df03dfeaae0cfdca04393824cdcc71e497c71ff95b0d6ebb945f8c6584095b2439d0d3d275295cddcd143765ce1d8159df9989105737b902cb00aae77dc7761c732f7aaa5ab2eb9b488344a2ffd0ef327d12b820e252c1e5b78c7d9c8895834cd009d9daf3f3b4d35d7d7db36e139f4389ae1b2cb2779eacbe08f974e9eb2d9b1ffef48239a598e2028cb47b0c3805bf1e9bf9118635840eddae87ff6a62cee5dd14a0b5f0042e48e6109227fe6ad0b9a245aefa6358fcc7f1a9a67490e0c7e0d66e9bb1f4178319a93e19c3fe12ea085c1791b7fa5cf0780 \ No newline at end of file diff --git a/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block index 99dc415054..b8cc816730 100644 --- a/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block +++ b/rust/cardano-chain-follower/test_data/conway_tx_rbac/conway_3.block @@ -1 +1 @@ -820785828a1a0028fe841a0434f6585820bd6c1f28c1a265de501e8e33dffde602a76713b99d75a31177c03f492791efa158202f5ad4772c00767b6d75c8c1fae31e3479d91921abf41b1989346d2896b61de258201003b81af09c4acb552e0fbb33ffe12415360f2842c0e020b11b09cb82f7c5e48258400a7cf0b7d8f4f4fa9e6ca765c48809002e45592c8dc814ac2ee211ed42a1174409f5a6ab2d722b461f312bd2c257e49c515cf9873a206af171217c4e8be29a465850745029499c740fa493f1e132dfeb358666347a26444a6c7ed988d9f2ec692eecd106fa6526dc67819687de946ea8240e22cdedd7094af6d05028ea66145fd2b19c370c9ca72ced629fbb3ae0b82ac30a19095a5820bf8c18b255e9b583283806e74259fc6eb912bfa6dddfcde307277404ff9ce818845820873bdd3584228477e9d9ee6b60a9cd6000627acf154126162178860ba752e9cd0619020d5840e461305c25b0690c1001e96f882d51c3a12ca32bae4cd25f9f46a98a0e9a7fe9b43ed108f230393c474444ce5ea88cc1bd299b94e7a60795d883e0a16004c0068209015901c06ad990d54ad71724a3678551ab78938816aa399bbdc6e6b276cb7cf0e507810a6e38472a27ec23f54d0eb87562738f932d506c65f36461d159e53cd46ffed5030f502c2c0ba6f01047404760512a5c4a947bb3a096fb3b325ab7c53130c1e1c45ea5e8b2efe9d3778bc2b86b8e61dd15d58458446ee393275b6d8eb02c36eaa5f20c1cbfb7e13d90e4581b5e08cc6c23bbb4fba63b37bb3b597ce64fc1cfe50a1ddaaded8b5762ba24b4bcd2dcfbe72924c508e2da50c59ab7974e62d5ce061d0e21642fb858f4cad0390c13b277dad3c51d750ad4cf0c9ce870605e10481f07cc3f60b2845b488a445226c8e00a42b0e9b23a6fdc083720f10aa8bc37e99d96580224ca3e7d044ac04097d8e648f6f664bdeef50f2df21f9a171d670c83698de357276c21d70cbab333e106afc7756556da04fc0e336f218b15d592dd0680ae9d6f14320695532d90a3b19d231a6a1cbf1e9a74a758c7e94fd28e8299e541b682263b0fb4aacca71ee020f5645deb712874d68ac897046af1d6f8a8511a6c8b5e93cb843f7db6a80ae06161a8d373325fd19a0efcf6bc4c76635513353213c1d9d07e1fa563adabd17558a2ff1fece92c75a0957b3592ac2816f4fd9ad8773d83a400d9010281825820cd9ea9db9994cdf311fd1113c86f2c243037fe80e524f7b568e7dea7309bc24800018282583900c9c0b70e66812af4f3d5f3c986841ab51e8c4e78fc51e17805cf01cefd663095e5adc264dc2782d25ed53fc8352f89b47ba337041b5cda58821a00141fcca2581c919e8a1922aaa764b1d66407c6f62244e77081215f385b60a6209149a1494861707079436f696e01581cee1ce9d7560f48a4ba3867037dbec2d8fed776d94dd6b00a35309073a14001825839007a75f01a89fbe8053f115ed9a5fcf9edcfd95cf0d9755ab6d3c4f93deb54ea5e1faa92afe966f769d1f6b4d11d68450ca5d1f00e93aec38e821a0158a77ba2581c919e8a1922aaa764b1d66407c6f62244e77081215f385b60a6209149a1494861707079436f696e03581cee1ce9d7560f48a4ba3867037dbec2d8fed776d94dd6b00a35309073a14003021a0002ac21031a04351267ab00838258203753c8a7d729362985c0b9e56a2be91021e568bd5edb2622f0582b901bbea79e02825820587b30ba034c29929fdf99eae56cfc418cf5c93105bc8a6ba01fc411bfc75cea00825820a35ad4d5b1f338d1f0e2101823c39236edfcdd1511c7c8aeb91dd88b817a065a010183a300581d703f89c436844cd0acd2714201817836b2cd16b082e03e3a21bb69e5ad01821a001e8480a1581c2b556df9f37c04ef31b8f7f581c4e48174adcf5041e8e52497d81556a1484e6f64654665656401028201d818583cd87a9fd8799f581c564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff0d8799fd8799f1a000560341b00000191ed4abdb2ffffffff82581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a0089544082581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a0075b708021a0009ce9c031a0434f6b2081a0434f63a0b582091b0d6dba1d88661433fb0ed0097faa20ddc563980b6b66039fdb211cc8a30ee0d81825820587b30ba034c29929fdf99eae56cfc418cf5c93105bc8a6ba01fc411bfc75cea020e81581c564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01082581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a004876a1111a00370c3f12818258201a28375b01a8928f21a87598e24165ab5806e7c3e77a5eb4d78c56e3cf07894c00a600818258208ae2b54f272a4567937f8c3aa4a5dc1763b93476e200ab1fec255e8e66d35a2d000181a200583900eb21979c03eed7207020b2a0b47565b5aafb1a2c3849b59a1fa8e6c5e075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d6473903011b000000024fe9128f021a00033ba50758201d2d097c5bc8ff64223d674c1c3f57b08b34e34aa37b715e1e02f1f85bcadcfe0e81581ce075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d64739030f0083a100d9010281825820119feb7e0216cd3e4d3f1d0b491ba94741e06f3ee3a186fe5479ca889e5f03245840befa9dda302a102727303b28c6ddeb80c42a74412939e34c8dfe991ac0417be83999e9031cdcd5c4684ec3aa9813ae7c25345d2f57079ef99a1593f3c50b0a09a2008182582002205785797b8efa694d21d7dbc3a290d2ae09538957920c9409999c261ecb2f5840cbf97e51408fee6f25399fce2067aea5990890089a723ccdd242f2f1449e3d66e4227a69979bcd3a046a3144bffdbac8f748e70dbd95fb368e69512f4dc6d7070581840001d87980821a0012c8941a106a99c6a100828258208469288efa6f9cb49040b43dcff93f40969d72433f751afde50235012c01602058408fcfe92e2d6d1e4c5a5d4c8f9c6c928c802aa23b8b2d472a05e557a54fe1f3d991cc2686f6338ef6208f2f53a252fda9ffff9466ba7dc3b1b1e669b55097c30d82582076af5530fa318a370820270031d1838545a4ceed8696510627563d1114d4182b58405197dc7b6021cafa2ea7c962e53af5fe6edcc94e3c6fa1d79c53d02149384fcb659283c091b14c966c7865dd70f40cff167cc941c6bfc90a77503ea84ca2af01a102a11901fda50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c015073990c75d9f630e010c76eda61ca9a130258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b8c58401b3d030866084fcb259de07496d3197e913a39fd628a3db0a4ed6839261a00c51cb0a5b9c16194064132ace375ea23c75c60659400cba304d0d689c00086195d5840ff28714da02c35e7295815ba58b77f227e576fa254c464e2f9c6f9dfa900a0208250033c054a468c38e08819601d073c034a4727a524ff39995477443c1fca235840839c927599b253887f50487c1caf757c0aaf79bc3fcacd42252b8f2ae1f1a8b282929ca22bb5c2885cc23a66005c0cc1ca20142b82310c3a137d44c1943e40995840a7a7ce5c3475b5887a3765ede2ff3b7bfea90f255e2edf37fd44e27f26b8e6cf408aef4b20bebf7257b3dabc7eda65fff4ed278b50219f0a52367ff5b80e46b758403875f55a394d17a5d9a6b1a1deff5b2206e9e9734e9fbefa6a1cdfeb7a104546dfb6e46c46feaeb65a7f4648c276e29e87b27bc053bffef79359300220d0c3875840f2a05cc4880317358e19c758fd9ab9917551ce3987af2e35d73b6958a0f5732784621b0c92f68a93537f16f48445424890f955d7a597c13c2eb54a82b39f0307584097507df5fef916fabb6dafdfb516fb9184783e2cb4e89d048a6c1e5c04818bdb76ffb5cbef1fbe452658d904cd152ee72a3bfc6efe1199fb3b51f1979629cd4e5840fdb7df511723d4cead3d2b2eb9c1f18cbbfcf9f5cc8eac46dc03cd55fcac3303c391437f50400923e65c02e981af5461b6867a47fb25ebe9b0fb4d9e41ec210e58404b9011000206414523c0990f9ee20b5d8a745393d3febaf6413a448b994f1567eb7945df7a0ab44afd55561e0190b376d411026c5d7a4a49a19e0bd3f5addd6c5840492fde46eee8d75b587286291dfeb6a78fdf59c1a6bfa2717b1f41dfa878756140ce7c77504b64b094b870ade78569566eec66369133af5aa8c8eab9f95e29df58409ec10be251547101b24c495c8ff4fa55378dbb4a5c6e89b18a12ac033343d61c3b7f5fba725b51536d92a5cbfaef9be6d24a3e5b3d75a1c0e29e42f523567fac4d0f8200811c822d22ffc9fdbb42186358402fd6f584ef5f17fc0b0ebadf621dc9fece8008ea589b2e59ca5e6d17c386b16359d3edd2aad415ff5c6902e045359aaafdf69c9d9008e8eb4fff52a3c24f390d80 \ No newline at end of file +820785828a1a00291dbb1a043840285820160ea19fb19f00088e2ef986fa354c958f0f40db89d29c32f188e5247a410736582054ca56226c90d5544bf6f558026b814027b634e60de0bc215237944110569c6c582037d6147adbf2907948d66f9e4751774bbe9d6c4ad562ce04ef66f0fc1e7ac301825840f4db3a5ec9aabd655c9f651071036626a368e855152897a01115661660f32b19bb406669ef359e30745c48dbe4872e1f5d110191de27d750230243f6150494f758505af67e52747541a74c5b13d1d24a4706fe7c84ce254b1eab283e1f38fe1398d055ce36a4ba4268d67ce1ef84580f093bc671dbbbf5887f96c2bf192ad1bb3d8b97765cdb927219f3e0988c93bbb0510c190f2b58202f98cae65753f272fa96ba2a7ab566f4aa81356e97c1800b57f6246fc193aeb5845820579c45732473db77b8acd430585aeb79ccf7e76b7b118f1e7302291a2cb3d958071901ff5840cad68c6ebff25b637335d3ea1647707cc0e91ecdbc00f1e4a8e3639f1879a5560d50bc948792d43dd2d7cbf54c3e188df16c7ad79f1f78ad1ec760b0725fbe0a820a005901c0f98f0569ea6ff5df6d3483aaa68e195ac1866edb28b03499a0adc8b2655a06855d69b15c39e94d13db695281a6249a65d175d37bcc029c422ba3cadf2afdde070f5658ef64058ab83e1435b5066a132195fba0981f76c4badaa93dd5cbe25a7028efed14eefadf9988557610d4e875a2d9375d25e5fe2939ebf23a5c44c0e4be7b107dfdc93a3b21c6a87ff9b46f69b65c53a204e5ead4fe9b1ae756e7a2755fd5a6dd9b4b67bc511479247eab6089e0eb17fea1eca7ac5fcd03dad404798a3067a2669d5eba8c3d762de40b42157486cd99746c0a021c213054b868a1f35f747933368ec3bd901b18ddddc09918d9d3562dfb425c9a3f442929c71ea09984f9a2d1f9a5f67016b07c406f319e9bda78158204f8641c215e9d6a726f1bba21ccf82a241e31ecf24624e95d5c82b42bea18435946706671969b91157f2071609c3cbb4b5e944e4829392e85b6c20920072ef246d1c9aec109331fc83c9f1d4b07d0d012547f82da0b83d514e2981186cb2d6b6e392c57465010414ae32bcbaf60f5e77e321a6a78b24e4ad9c44d5e6f1dfebb74d11d470cfd77d05848bab980308cdfd157edbc572c75a2f2c6462c9351607e1e7a944e9d0b41e1bfd1ef2dbdb387ab0083825820c3ad11a79c6b2b131fd37fec1f85be7dda6d5e8891f7523377008205ad6122b002825820ddebcb766e4902dc1b2537178875ff80da782402858254e994c9b782aa1dee3b01825820fe7258dd047bd4bb15641c1589ba9c9e5ebeccc689d2b01ae4210613f4d52d5b000183a300581d703f89c436844cd0acd2714201817836b2cd16b082e03e3a21bb69e5ad01821a001e8480a1581c2b556df9f37c04ef31b8f7f581c4e48174adcf5041e8e52497d81556a1484e6f64654665656401028201d818583cd87a9fd8799f581c564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff0d8799fd8799f1a0004fc6f1b00000191fa22918effffffff82581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a0089544082581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a006f2857021a0009d160031a0438406d081a04383ff50b5820d5adb9576273dc98ae443e7248d3ba5a35ba7befa01b37ead68c0810aa40882e0d81825820fe7258dd047bd4bb15641c1589ba9c9e5ebeccc689d2b01ae4210613f4d52d5b010e81581c564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01082581d60564b2400e0901e336538bea2eb48f0bac8aa77b0c3a948f07cd15ff01a00524801111a00370c3f12818258201a28375b01a8928f21a87598e24165ab5806e7c3e77a5eb4d78c56e3cf07894c00a6008182582030133b1ce7dd59fedcf79adbd0012f7fab64bc54d08ea9621e0df25cf18ac656000181a200583900eb21979c03eed7207020b2a0b47565b5aafb1a2c3849b59a1fa8e6c5e075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d6473903011b000000024fdc310b021a0003372d075820aa05878c56074cd1241e91b49a63ef718988ff544c596e44521f1a8dc6b387650e81581ce075be10ec5c575caffb68b08c31470666d4fe1aeea07c16d64739030f00a500818258202d9559bceafc74514c59ce55bbd9e2bec6dc31790f277d4aba4e042e85f4112a000181825839009fbdc6a75e10012d8c42017e375337cbc3760e96f911c87aacb6dfbe74b1d8380c8d4a9dfe1781ce3616c5f099b74854da5aa69532235ba91a04b04d51021a00029a6d031a04385c0e075820880443667460ae3b3016366d5bf66aca62c8149d67a53e94dde37120adffa624a500818258209e911e840789b2727a194f4d00959b4ee1f94db95542a16f2b0fde5cc14e03ff010182825839006f2c165bfb9e28a313da02d395eafe57ee1081bb14b8faac1856b0473907b2a702a6dcd0d937d4cbdd2ea8db46c335f9c6980ee93b0ee9b31a00a542f782583900fe33b43ae102d26c495a616187fd535a8ab31cf0cb0d7bc4f2ac35343f05a30548ea2f467860ff3ea675fcebf50bccf21eb99c9fc92d854a1b00000001d6236a82021a000295c9031a04385b0f081a005c5a2da40082825820139e2c770f1c836164cd9a04b756dc34622a672289f579efd42b48e929c3bf0a01825820bf1f24ac9ffcd9938f71a5dc2ce457f496d877440c57de1134334dc66378cc6d000182825839006d874798dee894262bb80ff32409e1ccb5c662f438d0832f7e83635b93cfb33930fd28cae34fd9a508f9a1c98bdd52561297e062983583dc821a001226b8a1581cf0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9aa150000de14068616e646c65746f73656e640182583900f3cb671c88d464460e064deca0dcdbdb68a5753a1f08a09deeed716a7fc7000fdaeb72ac4f46ead88304fb4b036d953184cd114522c60f2b821a034df563a1581c63f01fe6cd68ec6438c95a46cea4a6cd27efb791b5e8cc1fa92af329a1524c616365204e46542050726570726f64313501021a0002a98d031a04385c15a400d9010281825820c5fc4abb70cb78e2dd81ede78769187a5e62a2cbe61e89e3241cc87bf49d3c9901018282584f82d818584583581cb0c95c61063a9438de2cadd7835078da4fd3d967b325b0ef49a98be2a201581e581c0e3885905f8f51eb31f58ee644d9adbf925e914c7953bcd14859471e024101001ac50f88b51a0010602782584f82d818584583581cacdf62c4488e78c07e28c4c80539f4aa0bcf0f7d14b37c9eeef45173a201581e581c0e3885905f8f5185d980efe6b5befe429093a12e9751ccae2633a713024101001afd4bab7e1a17d16bed021a0002a6a1031a04385c2fa30082825820c0ded58d1f20a8b7e1c01087ebb1d1ebb94af490e8a93e3b9e5bb20a98ebf41e01825820ffb031c142583f453bb67564b3994f38edcaf175ef66edb778d447b3faffa558010183a300581d70c05492bb753dd4750beaf12356ce4e8252f3930cbf92d06854f6852d011a00b71b00028201d8185842d8799f43323435581cdf95da5f1f11e588bad36eef8c9ea171a706e4cdf529fd97156e74ebd8799f1a01312d00d879801a0007a12000d87980d8798001d87a80ffff82583900df95da5f1f11e588bad36eef8c9ea171a706e4cdf529fd97156e74eb758ab9d2ac7b679542638ee8024dfea41e77d462389977872454f2cc821a00129c92a1581c8a746b4319053b7855c68ac5ed9c943525702afa94c0b303684bc814a2463234305f6e6f1a012b1280473234305f7965731a012b128082583900df95da5f1f11e588bad36eef8c9ea171a706e4cdf529fd97156e74eb758ab9d2ac7b679542638ee8024dfea41e77d462389977872454f2cc1a9925a57b021a0002b3dd87a2008182582002205785797b8efa694d21d7dbc3a290d2ae09538957920c9409999c261ecb2f584084d1baa591107d76dc8d2c0ee9780ebe3840b0f249ab8a00539aa25002adabd96e36f081241eeafa071a02c4982c756ce2dd6e077c9cdd380c9dbd96feb076030581840002d87980821a0012eff61a1085253da100828258208469288efa6f9cb49040b43dcff93f40969d72433f751afde50235012c016020584047f575a45ba7a644eb8131f0c2a85475873fd3ea71d0a5104905dcd637013407b113b1cbf4b7af8cfc2922de2a416168a1276839946b293c0aa6dda61b87960d82582076af5530fa318a370820270031d1838545a4ceed8696510627563d1114d4182b584019db9a32be1507c0c13b2177086c17ddc39d0d0c7956258da66dfab937cc57d8c39f6384ef2a07ccffddbea56b1afbbfd0d2cf82446d099f4658bcd2989a0506a10081825820f398d21bc567394b5e2670bf2b8088a36c0355a60786f83033aaee90c51a0652584088064631469320af98bae7571a1f6ea50f733c46dd65c5cd1e79153096063a4b4b3f508dbfb715f80742bcf751d1d913a8e082b4a5be73b4dce608160c355000a1008182582046c7b1430923a9aa57971324819633d7f0dc984ae03ba37b2c58631ea9f18f1d584096465f0d4f1b715d26f027edf5be6624558aefe6d3d2dec6f3cd1b3f7b62269e2f578b1c8f1e539652f5d9f0758536a2fa860b199771e53e1705b139ad2b5f07a10081825820fa198ff264f1191a846af5f6067afa341b36b9c882988810b209613ef4686d585840ebb8757498a9209c4ff1b7e92ec69e44f89df18ea1093d978dbf0cc1a2ca6edcf4d1950887acc0c710f8828d2988854eb15e34b64325b6b1cfcec53d5155e400a102d9010281845820847953db74a03327eecedf38f424d510bd6dbfb0da2be989d5be80251b76319b58400789ea001bac725e24ee88673706771013c356f864f3a268544ff985f72d1dcc26a4a9992a367ad9e9ae9ba83325f73dcb37f76d6f262031837e94256431d90b582053ecfa2c8bc4ab302ec166256aa48a95d549c4a7c01f1e0a98153c654e94c16e5825a201581e581c0e3885905f8f51949c09b5e6d340fe92426bdf4a912d78ef9422b32a024101a10081825820975277c2fe1db3f260850e3f4946f15affa868a6df0388dbb9b4fcb40725e1c858402f68e3b0716c37dc105d6cee678ed5f734f1d906dcd37a72f7da4768629e42bd9b345f8d356733ee85a9231d45d7eed711acc9d11fa3c6f8a14928897441c002a201a11901fda50050ca7a1457ef9f4c7f9c747f8c4a4cfa6c0150cb6c2b83991a305eb48f60c933913acf0258204d3f576f26db29139981a69443c2325daa812cc353a31b5a4db794a5bcbb06c20b8b58401b09048064084f8b2b0dc2dd44a61d5c0c4ef620f87f37f5000ff1946fb706d0f7268e255684615920797acf734fc8224eb7197419d8ab868cb5be7696f3994258406c0360b135c350c9221c43314ccf2774cfee070b8dd79c709dd157d779a7e943d4cc0580a47057652be88502c0a3f05c825260b9d9500164bee00af9dd011a005840bde49a23144104280752cbf8425e6ad77503d4078a850542e1442bd2109e3675a1a42c9f030b4391970f08845e1082406f581492be6f46e7b990742b6e8df4735840dd542ee353bdda6ecea406fcce7c29a5d5bb02d12abec73a636fb8f257db52e62360de0166816f9bcb08660660a6b2dd6256fa1ae6194ff0fc58604bcad3446d5840447687b2ca55828795cd2d419e9e9534adf6d4c8c52e97be31a8536b02b440a3a9f4ee08eca80d048db4afb655ddea5da35377d23e01fe6a6dad575b635b839f584052dd5cdf56ad54f9e86ad44080af2921081c231f01f319db13048eb9ae144a921c1cdd2e5646e28b849ebdf9fd3cb95fee9fd53e137f87584cb9107cb8c8999b5840874722f9f71256ae0dec4a9c23183b07b9bdad2439b33e63ad6a7dbc38f3787ee16164d9cdf5a6e3f6dc06a9572ce04ddf7b5bf1cd2b53a79ec765b2b94b73125840ea47ede0e931058f9184839d037d07ab7326c7a3a86d6ccde8b526aa2727743fa20f1dbfc06a5b313bfd49abb9fbbef11153ffbc4e9e39d3f7d7f1c7dd46d1175840e925b35ea90a97b0188ab354276d7fb6b020a264c330a4c768e5a7a4691fc7e20ffef38e8df03dfeaae0cfdca04393824cdcc71e497c71ff95b0d6ebb945f8c6584095b2439d0d3d275295cddcd143765ce1d8159df9989105737b902cb00aae77dc7761c732f7aaa5ab2eb9b488344a2ffd0ef327d12b820e252c1e5b78c7d9c8895834cd009d9daf3f3b4d35d7d7db36e139f4389ae1b2cb2779eacbe08f974e9eb2d9b1ffef48239a598e2028cb47b0c3805bf1e9bf9118635840466ebf1f9df0f881cdaafa8a876b55ae6c38c958f9242261df29f48be13dfd9226f44fd82e60bc868353d5e790a920b006a42d36b63e3405d891ad297123500502a1191acea165706f6f6c7381a26269647838353136366636393434336666376433356136356637356330333565653765626637663964626531376334396234643861383262613439623566776569676874186480 \ No newline at end of file