From 7a621da4e857f1ce56cafc9e3894f4c7acedfcd7 Mon Sep 17 00:00:00 2001 From: Sdoba16 Date: Mon, 26 Jan 2026 15:57:45 +0200 Subject: [PATCH 1/4] Created global issuance check with tests for options --- .../src/finance/options/build_arguments.rs | 8 ++ .../sdk/finance/issuance_validation/mod.rs | 4 + .../finance/issuance_validation/test_data.rs | 74 ++++++++++ .../finance/issuance_validation/validate.rs | 128 ++++++++++++++++++ crates/contracts/src/sdk/finance/mod.rs | 4 + 5 files changed, 218 insertions(+) create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/mod.rs create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/test_data.rs create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/validate.rs diff --git a/crates/contracts/src/finance/options/build_arguments.rs b/crates/contracts/src/finance/options/build_arguments.rs index 123e513..badf8b2 100644 --- a/crates/contracts/src/finance/options/build_arguments.rs +++ b/crates/contracts/src/finance/options/build_arguments.rs @@ -372,6 +372,14 @@ impl OptionsArguments { impl simplicityhl_core::Encodable for OptionsArguments {} +use crate::sdk::IssuanceSpec; + +impl IssuanceSpec for OptionsArguments { + fn get_primary_issuance_id(&self) -> AssetId { self.get_option_token_ids().0 } + fn get_secondary_issuance_id(&self) -> AssetId { self.get_grantor_token_ids().0 } + fn get_controlling_reissuance_id(&self) -> AssetId { self.get_grantor_token_ids().1 } +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/contracts/src/sdk/finance/issuance_validation/mod.rs b/crates/contracts/src/sdk/finance/issuance_validation/mod.rs new file mode 100644 index 0000000..86c6004 --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/mod.rs @@ -0,0 +1,4 @@ +mod validate; +mod test_data; + +pub use validate::*; \ No newline at end of file diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs b/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs new file mode 100644 index 0000000..547d3d2 --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs @@ -0,0 +1,74 @@ +#[cfg(test)] +use crate::sdk::IssuanceVerificationError; + +#[test] +fn test_verify_issuance_valid() -> Result<(), IssuanceVerificationError> { + use crate::options::{OptionsArguments, get_options_address}; + use crate::sdk::finance::issuance_validation::validate::verify_issuance; + use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; + use simplicityhl_core::{Encodable, SimplicityNetwork}; + use simplicityhl::elements::pset::serialize::Deserialize; + use simplicityhl::elements::Transaction; + + let option_arguments_str = "fcb7a36f69fcbfaa6f69fb10276418cc0bdc4df8f5df06800e3b492aff5bf5f5295b2664157a4335c5430e88fe2c499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c14391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666447e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; + let option_arguments: OptionsArguments = OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); + + let taproot_str = "513bcc097c6a379a0c1ada4c896cae70df6b8b59734347e642598db966532d2b:02c6edd467c5aca948c6e43486c99393afa0b51802dad8c300a1b152b8fdda7969:tex1plhc0pau4pasn7lwnemz448ccf0rmhg3v9tkfmsssn83057te7grqwkp0xd"; + let taproot_gen = TaprootPubkeyGen::build_from_str( + &taproot_str, + &option_arguments, + SimplicityNetwork::LiquidTestnet, + &get_options_address, + ).unwrap(); + + let tx_hex = "02000000010247e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; + let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); + let tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); + + let _ = verify_issuance(&tx, &option_arguments, &taproot_gen.address.script_pubkey()); + + Ok(()) +} + +#[test] +fn test_verify_issuance_corrupt() -> Result<(), IssuanceVerificationError> { + use crate::options::{OptionsArguments, get_options_address}; + use crate::sdk::finance::issuance_validation::validate::verify_issuance; + use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; + use simplicityhl_core::{Encodable, SimplicityNetwork}; + use simplicityhl::elements::pset::serialize::Deserialize; + use simplicityhl::elements::{Script, Transaction}; + use std::str::FromStr; + let option_arguments_str = "fcb7a36f69fcbfaa6f69fb10276418cc0bdc4df8f5df06800e3b492aff5bf5f5295b2664157a4335c5430e88fe2c499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c14391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666447e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; + let option_arguments: OptionsArguments = OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); + + let taproot_str = "513bcc097c6a379a0c1ada4c896cae70df6b8b59734347e642598db966532d2b:02c6edd467c5aca948c6e43486c99393afa0b51802dad8c300a1b152b8fdda7969:tex1plhc0pau4pasn7lwnemz448ccf0rmhg3v9tkfmsssn83057te7grqwkp0xd"; + let taproot_gen = TaprootPubkeyGen::build_from_str( + &taproot_str, + &option_arguments, + SimplicityNetwork::LiquidTestnet, + &get_options_address, + ).unwrap(); + + let tx_hex = "02000000010247e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; + let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); + let mut tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); + + let reissuance_index = tx.output.iter().position(|o| { + o.script_pubkey == taproot_gen.address.script_pubkey() + }).unwrap(); + + // Corrupt Transaction + let hacker_script = Script::from_str("00000000").unwrap(); + tx.output[reissuance_index].script_pubkey = hacker_script; + + let result = verify_issuance(&tx, &option_arguments, &taproot_gen.address.script_pubkey()); + + match result { + Ok(_) => panic!("Test Failed: The verifier accepted a transaction with a stolen reissuance token!"), + Err(e) => { + println!("Test Passed: Correctly caught error: {:?}", e); + Ok(()) + } + } +} \ No newline at end of file diff --git a/crates/contracts/src/sdk/finance/issuance_validation/validate.rs b/crates/contracts/src/sdk/finance/issuance_validation/validate.rs new file mode 100644 index 0000000..bd068f3 --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/validate.rs @@ -0,0 +1,128 @@ +use simplicityhl::elements::{AssetId, Script, Transaction}; + +use thiserror::Error; + +pub trait IssuanceSpec { + fn get_primary_issuance_id(&self) -> AssetId; + fn get_secondary_issuance_id(&self) -> AssetId; + fn get_controlling_reissuance_id(&self) -> AssetId; +} + +#[derive(Error, Debug)] +pub enum IssuanceVerificationError { + #[error("Invalid issuance count: expected exactly 2 inputs with issuances, found {found}")] + InvalidIssuanceCount { + found: usize, + }, + + #[error("Primary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit.")] + InvalidPrimaryGeneratorInput, + + #[error("Secondary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit.")] + InvalidSecondaryGeneratorInput, + + #[error("Security Breach: Controlling reissuance token explicitly sent to external wallet at output #{0}")] + ControllingReissuanceExplicitLeak(usize), + + #[error("Potential Security Breach: Unknown confidential outputs detected outside the covenant")] + ConfidentialOutputLeak, + + #[error("Failure: Controlling reissuance token not found in covenant")] + ControllingReissuanceMissingFromCovenant, +} + +pub fn verify_issuance( + tx: &Transaction, + def: &impl IssuanceSpec, + expected_covenant_script: &Script, +) -> Result<(), IssuanceVerificationError> { + + verify_issuances_input(tx, def)?; + verify_reissuance_output(tx, def, expected_covenant_script)?; + + Ok(()) +} + +fn verify_issuances_input( + tx: &Transaction, + def: &impl IssuanceSpec +) -> Result<(), IssuanceVerificationError> { + let issuances: Vec<_> = tx.input.iter() + .filter(|i| !i.asset_issuance.is_null()) + .collect(); + + if issuances.len() != 2 { + return Err(IssuanceVerificationError::InvalidIssuanceCount { + found: issuances.len() + }); + } + + let primary_asset = def.get_primary_issuance_id(); + let secondary_asset = def.get_secondary_issuance_id(); + + let valid_primary_issuance = issuances.iter().any(|i| { + let issued_id = i.issuance_ids().0; + issued_id == primary_asset + && i.asset_issuance.amount.is_null() + && i.asset_issuance.inflation_keys.is_explicit() + }); + + let valid_secondary_issuance = issuances.iter().any(|i| { + let issued_id = i.issuance_ids().0; + issued_id == secondary_asset + && i.asset_issuance.amount.is_null() + && i.asset_issuance.inflation_keys.is_explicit() + }); + + if !valid_primary_issuance { + return Err(IssuanceVerificationError::InvalidPrimaryGeneratorInput); + } + if !valid_secondary_issuance { + return Err(IssuanceVerificationError::InvalidSecondaryGeneratorInput); + } + + Ok(()) +} + +fn verify_reissuance_output( + tx: &Transaction, + def: &impl IssuanceSpec, + covenant_script: &Script +) -> Result<(), IssuanceVerificationError> { + let controlling_reissuance = def.get_controlling_reissuance_id(); + + let mut potential_leak = false; + + for (i, output) in tx.output.iter().enumerate() { + // Skip outputs going to the Covenant (These are safe) + if output.script_pubkey == *covenant_script { + continue; + } + + match output.asset.explicit() { + Some(asset_id) => { + if asset_id == controlling_reissuance { + return Err(IssuanceVerificationError::ControllingReissuanceExplicitLeak(i)); + } + }, + None => { + println!("Output #{} is Confidential and goes to an external address.", i); + potential_leak = true; + } + } + } + + if potential_leak { + return Err(IssuanceVerificationError::ConfidentialOutputLeak); + } + + let secured = tx.output.iter() + .filter(|o| o.script_pubkey == *covenant_script) + .any(|o| o.asset.explicit() == Some(controlling_reissuance) || o.asset.is_confidential()); + + if !secured { + return Err(IssuanceVerificationError::ControllingReissuanceMissingFromCovenant); + } + + Ok(()) +} \ No newline at end of file diff --git a/crates/contracts/src/sdk/finance/mod.rs b/crates/contracts/src/sdk/finance/mod.rs index ef85222..8c74de5 100644 --- a/crates/contracts/src/sdk/finance/mod.rs +++ b/crates/contracts/src/sdk/finance/mod.rs @@ -3,7 +3,11 @@ mod option_offer; #[cfg(feature = "finance-options")] mod options; +mod issuance_validation; + #[cfg(feature = "finance-option-offer")] pub use option_offer::*; #[cfg(feature = "finance-options")] pub use options::*; + +pub use issuance_validation::*; From f88bcbe1faefbd1cea6a6fe436707d53053f4a82 Mon Sep 17 00:00:00 2001 From: Sdoba16 Date: Mon, 26 Jan 2026 16:25:52 +0200 Subject: [PATCH 2/4] style: clippy lints & formatting --- .../src/finance/options/build_arguments.rs | 12 ++- .../sdk/finance/issuance_validation/mod.rs | 4 +- .../finance/issuance_validation/test_data.rs | 53 +++++++------ .../finance/issuance_validation/validate.rs | 77 +++++++++++-------- 4 files changed, 83 insertions(+), 63 deletions(-) diff --git a/crates/contracts/src/finance/options/build_arguments.rs b/crates/contracts/src/finance/options/build_arguments.rs index badf8b2..f8db9b7 100644 --- a/crates/contracts/src/finance/options/build_arguments.rs +++ b/crates/contracts/src/finance/options/build_arguments.rs @@ -375,9 +375,15 @@ impl simplicityhl_core::Encodable for OptionsArguments {} use crate::sdk::IssuanceSpec; impl IssuanceSpec for OptionsArguments { - fn get_primary_issuance_id(&self) -> AssetId { self.get_option_token_ids().0 } - fn get_secondary_issuance_id(&self) -> AssetId { self.get_grantor_token_ids().0 } - fn get_controlling_reissuance_id(&self) -> AssetId { self.get_grantor_token_ids().1 } + fn get_primary_issuance_id(&self) -> AssetId { + self.get_option_token_ids().0 + } + fn get_secondary_issuance_id(&self) -> AssetId { + self.get_grantor_token_ids().0 + } + fn get_controlling_reissuance_id(&self) -> AssetId { + self.get_grantor_token_ids().1 + } } #[cfg(test)] diff --git a/crates/contracts/src/sdk/finance/issuance_validation/mod.rs b/crates/contracts/src/sdk/finance/issuance_validation/mod.rs index 86c6004..439071e 100644 --- a/crates/contracts/src/sdk/finance/issuance_validation/mod.rs +++ b/crates/contracts/src/sdk/finance/issuance_validation/mod.rs @@ -1,4 +1,4 @@ -mod validate; mod test_data; +mod validate; -pub use validate::*; \ No newline at end of file +pub use validate::*; diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs b/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs index 547d3d2..e7f1de1 100644 --- a/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs +++ b/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs @@ -1,62 +1,64 @@ #[cfg(test)] -use crate::sdk::IssuanceVerificationError; - #[test] -fn test_verify_issuance_valid() -> Result<(), IssuanceVerificationError> { +fn test_verify_issuance_valid() { use crate::options::{OptionsArguments, get_options_address}; use crate::sdk::finance::issuance_validation::validate::verify_issuance; use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; - use simplicityhl_core::{Encodable, SimplicityNetwork}; - use simplicityhl::elements::pset::serialize::Deserialize; use simplicityhl::elements::Transaction; + use simplicityhl::elements::pset::serialize::Deserialize; + use simplicityhl_core::{Encodable, SimplicityNetwork}; let option_arguments_str = "fcb7a36f69fcbfaa6f69fb10276418cc0bdc4df8f5df06800e3b492aff5bf5f5295b2664157a4335c5430e88fe2c499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c14391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666447e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; - let option_arguments: OptionsArguments = OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); - + let option_arguments: OptionsArguments = + OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); + let taproot_str = "513bcc097c6a379a0c1ada4c896cae70df6b8b59734347e642598db966532d2b:02c6edd467c5aca948c6e43486c99393afa0b51802dad8c300a1b152b8fdda7969:tex1plhc0pau4pasn7lwnemz448ccf0rmhg3v9tkfmsssn83057te7grqwkp0xd"; let taproot_gen = TaprootPubkeyGen::build_from_str( - &taproot_str, + taproot_str, &option_arguments, SimplicityNetwork::LiquidTestnet, &get_options_address, - ).unwrap(); + ) + .unwrap(); let tx_hex = "02000000010247e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); - let tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); + let tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); let _ = verify_issuance(&tx, &option_arguments, &taproot_gen.address.script_pubkey()); - - Ok(()) } #[test] -fn test_verify_issuance_corrupt() -> Result<(), IssuanceVerificationError> { +fn test_verify_issuance_corrupt() { use crate::options::{OptionsArguments, get_options_address}; use crate::sdk::finance::issuance_validation::validate::verify_issuance; use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; - use simplicityhl_core::{Encodable, SimplicityNetwork}; use simplicityhl::elements::pset::serialize::Deserialize; use simplicityhl::elements::{Script, Transaction}; + use simplicityhl_core::{Encodable, SimplicityNetwork}; use std::str::FromStr; let option_arguments_str = "fcb7a36f69fcbfaa6f69fb10276418cc0bdc4df8f5df06800e3b492aff5bf5f5295b2664157a4335c5430e88fe2c499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c14391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666447e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; - let option_arguments: OptionsArguments = OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); - + let option_arguments: OptionsArguments = + OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); + let taproot_str = "513bcc097c6a379a0c1ada4c896cae70df6b8b59734347e642598db966532d2b:02c6edd467c5aca948c6e43486c99393afa0b51802dad8c300a1b152b8fdda7969:tex1plhc0pau4pasn7lwnemz448ccf0rmhg3v9tkfmsssn83057te7grqwkp0xd"; let taproot_gen = TaprootPubkeyGen::build_from_str( - &taproot_str, + taproot_str, &option_arguments, SimplicityNetwork::LiquidTestnet, &get_options_address, - ).unwrap(); + ) + .unwrap(); let tx_hex = "02000000010247e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); let mut tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); - let reissuance_index = tx.output.iter().position(|o| { - o.script_pubkey == taproot_gen.address.script_pubkey() - }).unwrap(); + let reissuance_index = tx + .output + .iter() + .position(|o| o.script_pubkey == taproot_gen.address.script_pubkey()) + .unwrap(); // Corrupt Transaction let hacker_script = Script::from_str("00000000").unwrap(); @@ -65,10 +67,11 @@ fn test_verify_issuance_corrupt() -> Result<(), IssuanceVerificationError> { let result = verify_issuance(&tx, &option_arguments, &taproot_gen.address.script_pubkey()); match result { - Ok(_) => panic!("Test Failed: The verifier accepted a transaction with a stolen reissuance token!"), + Ok(()) => panic!( + "Test Failed: The verifier accepted a transaction with a stolen reissuance token!" + ), Err(e) => { - println!("Test Passed: Correctly caught error: {:?}", e); - Ok(()) + println!("Test Passed: Correctly caught error: {e:?}"); } } -} \ No newline at end of file +} diff --git a/crates/contracts/src/sdk/finance/issuance_validation/validate.rs b/crates/contracts/src/sdk/finance/issuance_validation/validate.rs index bd068f3..d629d0d 100644 --- a/crates/contracts/src/sdk/finance/issuance_validation/validate.rs +++ b/crates/contracts/src/sdk/finance/issuance_validation/validate.rs @@ -11,32 +11,42 @@ pub trait IssuanceSpec { #[derive(Error, Debug)] pub enum IssuanceVerificationError { #[error("Invalid issuance count: expected exactly 2 inputs with issuances, found {found}")] - InvalidIssuanceCount { - found: usize, - }, + InvalidIssuanceCount { found: usize }, - #[error("Primary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit.")] + #[error( + "Primary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit." + )] InvalidPrimaryGeneratorInput, - #[error("Secondary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit.")] + #[error( + "Secondary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit." + )] InvalidSecondaryGeneratorInput, - #[error("Security Breach: Controlling reissuance token explicitly sent to external wallet at output #{0}")] + #[error( + "Security Breach: Controlling reissuance token explicitly sent to external wallet at output #{0}" + )] ControllingReissuanceExplicitLeak(usize), - #[error("Potential Security Breach: Unknown confidential outputs detected outside the covenant")] + #[error( + "Potential Security Breach: Unknown confidential outputs detected outside the covenant" + )] ConfidentialOutputLeak, #[error("Failure: Controlling reissuance token not found in covenant")] ControllingReissuanceMissingFromCovenant, } +/// Verifies the issuance against the provided transaction. +/// +/// # Errors +/// +/// Returns an [`IssuanceVerificationError`] if the transaction or script validation fails. pub fn verify_issuance( tx: &Transaction, def: &impl IssuanceSpec, expected_covenant_script: &Script, ) -> Result<(), IssuanceVerificationError> { - verify_issuances_input(tx, def)?; verify_reissuance_output(tx, def, expected_covenant_script)?; @@ -44,16 +54,18 @@ pub fn verify_issuance( } fn verify_issuances_input( - tx: &Transaction, - def: &impl IssuanceSpec + tx: &Transaction, + def: &impl IssuanceSpec, ) -> Result<(), IssuanceVerificationError> { - let issuances: Vec<_> = tx.input.iter() + let issuances: Vec<_> = tx + .input + .iter() .filter(|i| !i.asset_issuance.is_null()) .collect(); if issuances.len() != 2 { - return Err(IssuanceVerificationError::InvalidIssuanceCount { - found: issuances.len() + return Err(IssuanceVerificationError::InvalidIssuanceCount { + found: issuances.len(), }); } @@ -62,15 +74,15 @@ fn verify_issuances_input( let valid_primary_issuance = issuances.iter().any(|i| { let issued_id = i.issuance_ids().0; - issued_id == primary_asset - && i.asset_issuance.amount.is_null() + issued_id == primary_asset + && i.asset_issuance.amount.is_null() && i.asset_issuance.inflation_keys.is_explicit() }); let valid_secondary_issuance = issuances.iter().any(|i| { let issued_id = i.issuance_ids().0; - issued_id == secondary_asset - && i.asset_issuance.amount.is_null() + issued_id == secondary_asset + && i.asset_issuance.amount.is_null() && i.asset_issuance.inflation_keys.is_explicit() }); @@ -83,11 +95,11 @@ fn verify_issuances_input( Ok(()) } - + fn verify_reissuance_output( - tx: &Transaction, - def: &impl IssuanceSpec, - covenant_script: &Script + tx: &Transaction, + def: &impl IssuanceSpec, + covenant_script: &Script, ) -> Result<(), IssuanceVerificationError> { let controlling_reissuance = def.get_controlling_reissuance_id(); @@ -99,24 +111,23 @@ fn verify_reissuance_output( continue; } - match output.asset.explicit() { - Some(asset_id) => { - if asset_id == controlling_reissuance { - return Err(IssuanceVerificationError::ControllingReissuanceExplicitLeak(i)); - } - }, - None => { - println!("Output #{} is Confidential and goes to an external address.", i); - potential_leak = true; + if let Some(asset_id) = output.asset.explicit() { + if asset_id == controlling_reissuance { + return Err(IssuanceVerificationError::ControllingReissuanceExplicitLeak(i)); } + } else { + println!("Output #{i} is Confidential and goes to an external address."); + potential_leak = true; } } if potential_leak { return Err(IssuanceVerificationError::ConfidentialOutputLeak); } - - let secured = tx.output.iter() + + let secured = tx + .output + .iter() .filter(|o| o.script_pubkey == *covenant_script) .any(|o| o.asset.explicit() == Some(controlling_reissuance) || o.asset.is_confidential()); @@ -125,4 +136,4 @@ fn verify_reissuance_output( } Ok(()) -} \ No newline at end of file +} From 095a5105020954fa9983f12cb8af8a5eba7f967c Mon Sep 17 00:00:00 2001 From: Sdoba16 Date: Mon, 2 Feb 2026 13:56:56 +0200 Subject: [PATCH 3/4] Delete redundunt struct and better error --- .../src/finance/options/build_arguments.rs | 14 -- .../sdk/finance/issuance_validation/mod.rs | 2 +- .../finance/issuance_validation/test/mod.rs | 1 + .../test/option_arguments.hex | 1 + .../issuance_validation/test/taproot.hex | 1 + .../issuance_validation/test/test_data.rs | 99 ++++++++++++ .../issuance_validation/test/transaction.hex | 1 + .../finance/issuance_validation/test_data.rs | 77 ---------- .../finance/issuance_validation/validate.rs | 143 ++++++++++-------- 9 files changed, 180 insertions(+), 159 deletions(-) create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/test/mod.rs create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/test/option_arguments.hex create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/test/taproot.hex create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs create mode 100644 crates/contracts/src/sdk/finance/issuance_validation/test/transaction.hex delete mode 100644 crates/contracts/src/sdk/finance/issuance_validation/test_data.rs diff --git a/crates/contracts/src/finance/options/build_arguments.rs b/crates/contracts/src/finance/options/build_arguments.rs index f8db9b7..123e513 100644 --- a/crates/contracts/src/finance/options/build_arguments.rs +++ b/crates/contracts/src/finance/options/build_arguments.rs @@ -372,20 +372,6 @@ impl OptionsArguments { impl simplicityhl_core::Encodable for OptionsArguments {} -use crate::sdk::IssuanceSpec; - -impl IssuanceSpec for OptionsArguments { - fn get_primary_issuance_id(&self) -> AssetId { - self.get_option_token_ids().0 - } - fn get_secondary_issuance_id(&self) -> AssetId { - self.get_grantor_token_ids().0 - } - fn get_controlling_reissuance_id(&self) -> AssetId { - self.get_grantor_token_ids().1 - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/crates/contracts/src/sdk/finance/issuance_validation/mod.rs b/crates/contracts/src/sdk/finance/issuance_validation/mod.rs index 439071e..1233f8d 100644 --- a/crates/contracts/src/sdk/finance/issuance_validation/mod.rs +++ b/crates/contracts/src/sdk/finance/issuance_validation/mod.rs @@ -1,4 +1,4 @@ -mod test_data; +mod test; mod validate; pub use validate::*; diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test/mod.rs b/crates/contracts/src/sdk/finance/issuance_validation/test/mod.rs new file mode 100644 index 0000000..3e0488a --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/test/mod.rs @@ -0,0 +1 @@ +mod test_data; diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test/option_arguments.hex b/crates/contracts/src/sdk/finance/issuance_validation/test/option_arguments.hex new file mode 100644 index 0000000..c314790 --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/test/option_arguments.hex @@ -0,0 +1 @@ +fcb7a36f69fcbfaa6f69fb10276418cc0bdc4df8f5df06800e3b492aff5bf5f5295b2664157a4335c5430e88fe2c499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c14391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666447e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000 \ No newline at end of file diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test/taproot.hex b/crates/contracts/src/sdk/finance/issuance_validation/test/taproot.hex new file mode 100644 index 0000000..e2ead20 --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/test/taproot.hex @@ -0,0 +1 @@ +513bcc097c6a379a0c1ada4c896cae70df6b8b59734347e642598db966532d2b:02c6edd467c5aca948c6e43486c99393afa0b51802dad8c300a1b152b8fdda7969:tex1plhc0pau4pasn7lwnemz448ccf0rmhg3v9tkfmsssn83057te7grqwkp0xd \ No newline at end of file diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs b/crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs new file mode 100644 index 0000000..f73ad9e --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs @@ -0,0 +1,99 @@ +#[cfg(test)] +#[test] +fn test_verify_issuance_valid() -> Result<(), String> { + use crate::options::{OptionsArguments, get_options_address}; + use crate::sdk::finance::issuance_validation::validate::verify_issuance; + use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; + use simplicityhl::elements::Transaction; + use simplicityhl::elements::pset::serialize::Deserialize; + use simplicityhl_core::{Encodable, SimplicityNetwork}; + + let option_arguments_str = include_str!("option_arguments.hex"); + let option_arguments = + OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); + + let taproot_str = include_str!("taproot.hex"); + let taproot_gen = TaprootPubkeyGen::build_from_str( + taproot_str, + &option_arguments, + SimplicityNetwork::LiquidTestnet, + &get_options_address, + ) + .unwrap(); + + let tx_hex = include_str!("transaction.hex"); + let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); + let tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); + + let (opt_asset, _) = option_arguments.get_option_token_ids(); + let (grantor_asset, grantor_reissuance) = option_arguments.get_grantor_token_ids(); + + let expected_issuances = [opt_asset, grantor_asset]; + + verify_issuance( + &tx, + Some(&expected_issuances), + grantor_reissuance, + &taproot_gen.address.script_pubkey(), + ) + .map_err(|e| format!("Verification failed: {:?}", e))?; + + Ok(()) +} + +#[test] +fn test_verify_issuance_corrupt() { + use crate::options::{OptionsArguments, get_options_address}; + use crate::sdk::finance::issuance_validation::validate::verify_issuance; + use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; + use simplicityhl::elements::pset::serialize::Deserialize; + use simplicityhl::elements::{Script, Transaction}; + use simplicityhl_core::{Encodable, SimplicityNetwork}; + use std::str::FromStr; + + let option_arguments_str = include_str!("option_arguments.hex"); + let option_arguments = + OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); + + let taproot_str = include_str!("taproot.hex"); + let taproot_gen = TaprootPubkeyGen::build_from_str( + taproot_str, + &option_arguments, + SimplicityNetwork::LiquidTestnet, + &get_options_address, + ) + .unwrap(); + + let tx_hex = include_str!("transaction.hex"); + let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); + let mut tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); + + let reissuance_index = tx + .output + .iter() + .position(|o| o.script_pubkey == taproot_gen.address.script_pubkey()) + .unwrap(); + + let hacker_script = Script::from_str("00000000").unwrap(); + tx.output[reissuance_index].script_pubkey = hacker_script; + + let (opt_asset, _) = option_arguments.get_option_token_ids(); + let (grantor_asset, grantor_reissuance) = option_arguments.get_grantor_token_ids(); + let expected_issuances = [opt_asset, grantor_asset]; + + let result = verify_issuance( + &tx, + Some(&expected_issuances), + grantor_reissuance, + &taproot_gen.address.script_pubkey(), + ); + + match result { + Ok(_) => panic!( + "Test Failed: The verifier accepted a transaction with a stolen reissuance token!" + ), + Err(e) => { + println!("Test Passed: Correctly caught error: {e:?}"); + } + } +} diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test/transaction.hex b/crates/contracts/src/sdk/finance/issuance_validation/test/transaction.hex new file mode 100644 index 0000000..e139dad --- /dev/null +++ b/crates/contracts/src/sdk/finance/issuance_validation/test/transaction.hex @@ -0,0 +1 @@ +02000000010247e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000 \ No newline at end of file diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs b/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs deleted file mode 100644 index e7f1de1..0000000 --- a/crates/contracts/src/sdk/finance/issuance_validation/test_data.rs +++ /dev/null @@ -1,77 +0,0 @@ -#[cfg(test)] -#[test] -fn test_verify_issuance_valid() { - use crate::options::{OptionsArguments, get_options_address}; - use crate::sdk::finance::issuance_validation::validate::verify_issuance; - use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; - use simplicityhl::elements::Transaction; - use simplicityhl::elements::pset::serialize::Deserialize; - use simplicityhl_core::{Encodable, SimplicityNetwork}; - - let option_arguments_str = "fcb7a36f69fcbfaa6f69fb10276418cc0bdc4df8f5df06800e3b492aff5bf5f5295b2664157a4335c5430e88fe2c499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c14391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666447e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; - let option_arguments: OptionsArguments = - OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); - - let taproot_str = "513bcc097c6a379a0c1ada4c896cae70df6b8b59734347e642598db966532d2b:02c6edd467c5aca948c6e43486c99393afa0b51802dad8c300a1b152b8fdda7969:tex1plhc0pau4pasn7lwnemz448ccf0rmhg3v9tkfmsssn83057te7grqwkp0xd"; - let taproot_gen = TaprootPubkeyGen::build_from_str( - taproot_str, - &option_arguments, - SimplicityNetwork::LiquidTestnet, - &get_options_address, - ) - .unwrap(); - - let tx_hex = "02000000010247e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; - let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); - let tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); - - let _ = verify_issuance(&tx, &option_arguments, &taproot_gen.address.script_pubkey()); -} - -#[test] -fn test_verify_issuance_corrupt() { - use crate::options::{OptionsArguments, get_options_address}; - use crate::sdk::finance::issuance_validation::validate::verify_issuance; - use crate::sdk::taproot_pubkey_gen::TaprootPubkeyGen; - use simplicityhl::elements::pset::serialize::Deserialize; - use simplicityhl::elements::{Script, Transaction}; - use simplicityhl_core::{Encodable, SimplicityNetwork}; - use std::str::FromStr; - let option_arguments_str = "fcb7a36f69fcbfaa6f69fb10276418cc0bdc4df8f5df06800e3b492aff5bf5f5295b2664157a4335c5430e88fe2c499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c14391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666447e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; - let option_arguments: OptionsArguments = - OptionsArguments::decode(&hex::decode(option_arguments_str).expect("Invalid hex")).unwrap(); - - let taproot_str = "513bcc097c6a379a0c1ada4c896cae70df6b8b59734347e642598db966532d2b:02c6edd467c5aca948c6e43486c99393afa0b51802dad8c300a1b152b8fdda7969:tex1plhc0pau4pasn7lwnemz448ccf0rmhg3v9tkfmsssn83057te7grqwkp0xd"; - let taproot_gen = TaprootPubkeyGen::build_from_str( - taproot_str, - &option_arguments, - SimplicityNetwork::LiquidTestnet, - &get_options_address, - ) - .unwrap(); - - let tx_hex = "02000000010247e71872bb48043817401452a240bd62b71e2fc281238f22734500deba8062e10200008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001cb099b2e5aab3b14397c50c4a76aac7dbadc984e2ccd2354d18b38360ef5a4e10600008000000000000000000000000000000000000000000000000000000000000000000000000000391c4baad811a338680dbcb604d12a25d5f572c3de85eda0fe7bd1a14b07666400010000000000000001040acd801ca88503da6cb3fbdefd1d9719b2f30c22130a673990ac331f9c31c4d18d0818b8c0a63b902f27bd4bc2e39ebe503ae787bb1f09757cd3e6c4734cb5d4c449029ee02144db462faa513f09ccfcd3e47bb121200fd3ee65809f0c36153a40e776225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f2060be29769950488b86587bf642cb81aa18be2c905f1ad323ee49a2ef5082074f82b09d906aacce8803d5718539d8ad8fc76b3733bf3bffe3239d03b899070891fe2960364f73da445ba97cd0991ff59a86bc7f2f2422d964db4ba08678b6913a3e87f7f225120fdf0f0f7950f613f7dd3cec55a9f184bc7bba22c2aec9dc21099e2fa7979f20601499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000007636400225120d46b80c1cbfac814f80e2d69ac0120ed3fab79b31445326e6e9fde1113f5d54301499a818545f6bae39fc03b637f2a4e1e64e590cac1bc3a6f6d71aa4443654c1401000000000000012400000000000000000440fd67a574e05ba788c8433df31aaeda51b1d190fd24dffb539e584b18461bf493571ee5a628dc4b68664cf71e6424a99c7e6b13b37e20ecab2156a8b342d03e8c76e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0000000440fb1b2df0bce5c43ef35923b81493f53427fa4355a41290277cffe1d201fea2015f94e0b9e97533e0ef6c641ceb3d62dde6ed76729b5eb2e7b42238c1f826649376e06922d3d7831516611fba7dfd5ca2b0c39696aa7b0a9fed4819cf7e3879da4a49b9015a0a15c38735d772f07a13a9e8c81c672ff1b725794653e7b2a65b5569ecb5da314478a8c43860188599c502d8d8c399c5510915d0998008ab858317852c27b030a85d612fd7152321658700adbbf004300c4020d08e0537d066b7cc1e7631ad43e2b8515d63c69ef23749a364981385802b8b4821bfebc18a8b308fdd3efeae515861cb4b553d854ff6a40ce7bf1c3ced2524dc80ad0083040007f6689fde926b3f582187af0027e7b6a8a3737cc5c5a54357582caf7e76cba2dcae069b510d6e399c2ea2a5d2296d01ef80609a82128ac2a0c65a7fe0f9137626c54c1c39968212312d5de8e8dc3c0e4ed5698e6d643ad14d50a358a303b064d4455cf58cbd657d86921f2ff072f053b180f7b73e1599ffb3e75e9d2869a60bf8fd4e10603300000000000000012e279300db745b9b529f64b5e2dceaba12db7f696d173356f195f5e81489025aa5b2bc06ffda6f4b4bd90ca6c7ce7e7ad8c4415a1825cfe18442ac2ec4950a3fd31c89a07bfa1a955789be416c6cebd57a070cdb2a138859e5d8dedd50c1b08b9727aaaf769e6e506c5ee9faa859b86122a3eee8782822f10b1244774b68183d12590c94d59cc0b391e5ee8804fb1e12aec11cb500294656e043dbbf296526bd2c4845ea6d99310ab4b513f3892239a083cd0279cba2694f78ada9c50b33c07a25942e10ec03b16a7ae33bdb20a537a9031dea8559d5d9a9393dbe92dba0b2d69ba3ed7a2ca066c9fe96f3b1cb1ecd74793d97d86c87c6fa2aa93a4c6200024ded994dd5416b272a1942b71e2711fbdfc5fe772ec27edc69322f96cea68b061bcf84628330aa21d43a4f6b6259acd84c260e74fd65c674e42b2c982c0002c51728b3f78f3630fe4a8e7011d842d2526139a1f515cb78db33ad52f7d7c08ae255826d18bdd20d6bcac46431f4d101b9aabfde491c4ca404f7223505d07ecde07bd8ced8ed4f580b192eceb302ece4a4063a56b43f9125cd0d2b43d7dad59d9956b18b7f519f13ddd8eea3b2d56b382b40ccf1f6c0ac60197e3b0cbd9ba668339a44aebeac6770e4dae081c251452dcfdd1a5bd1a6ad0cd5c44e9182ac1f5f3d54b1d9e6d96b55145fc19398ca46eb4d4b61cba500b479b203e889a315f9fc73c7a066f78cd44c36c05a6d8f8f58a92a76875881dff076d5b99aa547bb87c1dd143df05f4fc378cc82d23ab5a643eb7edfb647a958ea97eaf563b4676aad24c0fbb9d0923aeb7ae65a81519601941a920952aaa98da5977c4c22523093c76f78fb1683e19fbfa6e65b414044bfad9d335d70a21168a5c9a276f1220c75a9f62089b11e8c26d25b513b2906c79169e942b0020af3566fd46806a3ed29e1c368e1767af2d0d57cc86f142264898ec15d8c5afd02bf5cfcb6b2d85ccfc7f487f430f0fed85956c3c59d4c061c8ea8984a10c6c07d2bfce207efa32455bc39bd6dc355fa55c43dbd7ed9254ed306a63fda47cbf7bf5d51412ab194e4a3be1172b38019f54dce2e9464c5b7f368053e57cec113ca27d3f112f835051f8510bbb62b90f954c42bce2fdf7b5460986c04cd334c8d51939b86d115c6aeaec0365411e593f01f269c942ce6ff9c7bf4e9c4ad547fc1fa8b24e8f6646e82e36bea79e0b673dfc1d9c836fab7bb0a9243b392db1e34e0793cfdcaa19dfb88cbd33a9545aa466fddd004e488deeb3cf99261f697cb7730906ccf6f60d014d0b8b156609e7a78a20724c833584ee1c7ec4bcd30d63a1754095c9e978e65d138c76bdd25d7e9e8e0f1f049e75f90940dd952be3937449ba94cf20706c2f94c62b024ec1c0926d25d307cb2d8916f4cae9054a71885fd36a1a225fd10aaa7666e8ddb78ce41ed6e300ef2ab539a92de0e5720ea894c6012a554f52aefc4e8082645df89e75673a7a7e1ef25aa1165d7b1ee53197bf2d867c548e5acab9d47a0cf6edb685fbd186d4231fe493a9a1ba8e5455b1aaa7cf425aefcb7bd3c170dcb74e56a35bbd4cde5cf718150d0467179acd2f3fa3a8d92c5407fda0b2812e33c07b5105d5ddb0e1774a588292376340e306b68f854a9c37ac1cbbeb1756ad8bbd9d6a54252e26f59b29f5787e9cccbb863593a9b26ab5284fcfe89f117ba1da1e7de8300db6657be7180893ef777e17313ab481cd670b63adcf53c752e43e8d40f29251cf248325d1a593a947c99b885fd255aaa63b2a20e4abc47ec5acb5c5f8a3bd206dbafd8d75cba9dcccc55b86291328ff252d7faba33ac3c48b08fc59976f54ceb34be3f7b172ad1fb5d2a4c0639b065419b2e3519dbce82ddb8f8b2ebf282437a8e5bce539b79b60f3f41990843ada1750596d33a822d53b063a2415f40abdbdeaf1115561cbb2cb377cc6f360bd789452628aa8d37e3fb07013bce889e3c409c7ceed84144e00b44e1fb66905cf37cb4df3e7b3ccbdf242c4e7098089df422d612872382dbc73ae856395d11fdc3853492d5b0f4433c0e3279bbfaa3e6e015861d92c82cf37606edc71c9f3348a955d764c9b7ad4362a181b4db4e943dfdc132be620ddb5e972d81e70c3667767e26f98ab093ca2c2da0dee971e628e530d6d3b98195009ebda6976902b8b0c8bfb81ea2ca145b9ce9ac2c34b8e30c3e265cf4abc7ec1d3f9471733c4b7d32f51c03fbb282ad261b60111aa3eafb511039632a6eaf2bd0a9cb7065503e448c3d215f0d6810bb2c563799b6041f230edba52e6756556f8d1bbffc5cf89068b7e11bedcf4c6326650f4b144b1b76499aa960a7ceaacf2a9b59abd20a6244421f492df03c6a6efaa59af40cecb85df5feddb7f80fbf0bfd267eb136ca0b51da88570abcec68fa05243118d22442fa2460952bb217120e12643fb86991313afa8994d859ad4080bfc9b9896cd1c73f6224b233ab1d4745a8ff31fc143e887bcc8ed153c332ba54409d3e7ddef68a7b1b95eee61dd3ebeab763ce867ebf4d3d70925fb6ae9b45de7311d70a3ec0e118974d03aeb8b4dc712333ede498d338da8212834248c5681e091ca35b910f1c46810549be4e3f605adcaefea3e59a9fa1b6e38a803076cbacc9c955fec0076b2e1fb267c814618470c6c71fe63c80a11861214e0721fa966cd11ce965533701130469ebf7de2fee32d9522397bc7939b3a6f57ee557463b25679c0496e6d6e5cce3703fd16617ef790b46690c8613104974a862fa4ac1c3da578f4120fe0d86a47f3c44dab88bd1777273f281625196f5223050769dc8d58f3baa0e93c540102baa6a5428e40b60d9bbfd43d9740e5a9349539d28e60f9640c4679367ba03dc7a36ba15828fe3c04673ee58c98dcbfde1f1d609ccdf4cd18dee330900cbfd8bdda0e5f5cdb3be0a2ec43a056683c7fdf91f6237eb67eb032fe8128d5168d384c8050c31f1e9b7e4c73334dbd2b663a296682ec9448acfc5f230c1730ed46c5386da2ba5e5f6a4471f1a2519e8e33ae64f9b1eecef0fedc31db17fb840fd38fa384dd9cbd182c942c9e02f17a2d0dfcb034afb06337291bebe92c8359b419d432ae9f5472727004a302277a851753ae75f38d5dc7a7b368164d64b8c0e3189e8226652467e36c4788023772b2efc93e3813e5f3dcef2b636cb85e50047892a4e0dde2ede1298976154d46bbb8ad99e10386d19d1da4a0b2e304cd5a0858dabe71580af9ea974d3a5df27a21c63db54f4a97516bd7f7347602b67415f44b5a082adb78eb1e5ccf55b105e294d643b053831a7324ee0db4d9c84c69e79be5cfdea9db2364bbd2b3aa0631018a684eb3414f05573d35c6ad224b5961eaabc5c09d4511d93d7dfbdc90b4cacd06a572e57f85e16b1e7a8017fb3b3f9c9ec8bbca684c1556786f49f2ba7179dcec0f6ec707316b0657f8bf2e09a080733432349c705c7c75bc953cef942e4b789fd5988624bf1e0d9fa0b3ba46cc11409ac25f2d61b7cb029a0ea0b225c531413e24f2a4ff161b5cd61c678ac40d69180dd63f66d1193770a8acddc077c828f0b2af9eaee3cca085d9d170b3454b9aa6b68d46a741074b7894f5d6e1e22bc19bc1b6711c9d74f706fb03d1e8c5270db6448c59dbfeed94cc32288114f572da2711d2c560ecd0315f72c3589ef242bd38c1d7dff1b7bad40aaeceb48346c12cc2b9a7c8a38c68fd4318c72eb6e5b1f28f506397b3a420d6f2cc34066e0fa3e6d2a4b24a78996378f2cb809405e3b9d1e508a9bcf1df0640731aa6cf6d0a5a7533f77e70d632730d2631ca107d471c27f99f81266ba8679e4b4857e8814a194e1792baf94317541d0393760dce500e64c62a40c4d29e57c22d95d062a131047f37c1906443cb7e7b3493b1e90032cff695bf49b39507d6905aeae9e7cf38850fc58aa45aa98ca7333a2ba3c41959655196a6a681ae8dc62bf948cddcdcfc3bf77dfe07b5a1727bc2e2779ced48cd05e6e40f2c827f091a3180bd7a5e9b40300a6f511d626ba0577875c7907609516b741a0133121c17928a87aa8f6254bf13800da5961d648530bf9465f7756243bb2d1948d67f711e49017e5d422160eedcf9aafef8897637b8b96f3b7fad43fe7a342105dd2e4b14058848528a3dd19a4bb8f600494910533c88984d58dcbdc049304ac2a0a324de348cc0f0f582155b9838977666b9cba77a5bbf8661c052cddc5f3b8d0b3fa5ef9d8e13b72b546935b6682b9ec8ad1a9b2a8fcb3177d87139ed6c4721f15964b55cbe641572ad80c1c2477a4d3c33adfd4d1639fe814f8d288234ce0fbbed02f9052b93d21270986856af2102b6ca08dc07d4c9eb13f15f97e8662ff73b500be77a553b2c2ee66fe55de8a4883bf5e9c3fdea985d6bb08b44669dbeb0652268ce498d1cfb3a2c3374da812e7e4a431d70483eae1c08ba7acf9230d8bbf468a684d6e87e673ee6466d0e244132752cf0800f495cef24fd970d66bab37128c671b34aa261b5f833eebd0723ebc20dedf60afe374636834b0fb935060a0a0308cf33b620ebb87f7591bfc7503fd1cf453ba03b6956c1ee6410a6a1742434910fbd54c8b13411e43fa2f03624b23f8731848b5471a98659f514d2223f0012fa50dd7827e1fb71f2f051a2371a43b464c5991e73598c5d1f230cd386ff5512c0b925e291c83f72867b2cec9d8d712e4c93c74f7823b0d72cbb807109974deb46ffb60c42dbae3e2b39178fab43e7e6f406d7462e1dea851789e678a1d02f511c1c14f94b475cb59027a631897ab79f5e4e98a9051a9775f1eded3e435f2c75908c465356bc715388e4e81756f7d3236b50be0599f517073ec74627972bf587c021e7b8116e6ee82b222183134be70efde5ea71c2a751ecd78282e61218fcb418fbb6841e2ab9b1c58bcbce998c3f88b6bb82f329cdf6d67d6eab7b7ed0142d0c39b7daf97b29c3b6f910ff832f74a82a0023d28df4e504cffd103eea3a780c0999ab763071fb97bd5979333145904b20143aec82d84e25c5ed6db981a4aa71903dc21c49f8984b749b4889c3216a1670d7ff88a90b369d88d11b0df4048c0b650fe304f920725d78e98f1df45cd5f5a81bc10253ccbe83a04044ee759d7b7e4a6e68b433ed2f8ad9ac79a5e91f8fb607d41ef5a77193a4a74ab16e18e1108d79075eb5ba90d4a8747cafb2a0a7ba7e5ac7ea2a7c96679bdac2344999fbd9a45781107ccb3524a5897eaabd710550fdd60f6baaeb7e1c32587b5ac82d2eeabdc856636e5d1ee3e798fa1edbb860f052f7b9c9f646d1f6e482ef03f768a4683fb1f276ec7cc3863dcf1baba777c9321e723f6001eeb8156ecce05e05ac0a4a0b0474edc15ca458f1525cdbfc932b58dedc3b894267eaa201d7aada67498cdbbf644328a5428e759c69f135db34c94a25f11bffaab5565eee685a0d2a1674e1fe9f8f920d8d76be67042666105ed7d71291e6843a7a2f3a62093c0e76fdc2271a94d53b98e2d3a4c51b541be2e5fbda45b44cb60a6388db4a77a61720140f54507317a8451c184cdd6826ff0a802b4579e439e31fde72b37c92acdb40a81a3bfc55c6787c4bab7cdf8ab66420939d48322f4a6bc316d05d533aa8e083757b27c4c41f55e7089727b4a80c8a50d8edbc4adcd20993a435b42eebe63d94cbeba86920d9623b493833947ee333b897ff2ebb533b0a55ca700d3e7d8e56c83073c3ab2d36c573b89a7e8bcbb2262ef9b12f520cdad6644f25b40cfd07a6f4e725ba41c89bb190530b004a966e88a159bb04af00832422e838754b0b82bdc503717de0d78e4c4bb0973ef98b57c517fa9f9e1b5fd8e2965c7b7ef3cec8f4581bf6f7365cde7ec74ba60ef4bb7d07437014f4cd6c97fc8df8304000e5b7e9d2520c06394edbfc3c6481cd917ebcb93893fcd621d6d98ff2d1c2f4093fa9f971168148f3be1474e89d1919e8aaff273e8b0b72eae2af7a3ded125fbd808c753cbd4bdaa25737154dc4335c8e75eee38b39a007ebcc21e042671f032ebd37c3267cc8074a172a15df838665f7003d79bf15fd5a186873a6c643ce6efe0fd4e1060330000000000000001e1cd0f01e8f01bc206edcf1042e48c920a700beca85dc20a00676696287d64d9037acd2c93e77f8b942d50f1429d684ebdd15a40c63b74dca52ce515a55616bf26b193ea8279e83c0bfaeeecc9224900cadfb0260b159beb3cdfeb63328493c1e1948037f819bca99a476d37fe6ea77eb4630763783c0c451489782c5d27dce3a33537d6c403d49c305d8e46fea39e9afc84e3ca335d2ea7a103e927e8bd5f076c05ab784e5ce39325d07ee179571c7c94541c67680262c6016c54d0ba93d7149d523431371bf8b7f18d27d9cb4e2955803e69d952a51ac794152e5f54434ca32a3d533ef7d4521c250829bed27a1e2b25d30f46ca605fcb6fc09d02a4c4bdf0f0e41749c4df549280a4f6d2f7ab2afbb6952cafa929d3757b35d25a589e37b8b308c2258c5501100e1b6c97953af2234b64276e2e4271fbcee5fe294ad00ec66f1204a52aa8ed64a8d12cf9aaa1d0a8d889f9d94b08a6ce21190a51c05a2db6ab4b707d7158c682fad814ff81afa9f5df1947e018d85ebad7e3c6933bb083af90f3788849553560b4fbbfbfd98c7ef81a755b703b887cb492e6624b74499ccb22ef723fa11584eee7886a80be93260c03876e95df5e33e68702ffa7a08e2bc45bb5d6201a2a3765291c2ce8333a785cb919e65a88a8a06558f2a1690a0af062beb0eb705e62aaf19c7c5ebbdc2808049bf3dc283d3e16f5d1ba2ba556b5a25cdf3a9804a667fa620134acfed38f3c73ce97c753b73b3ab407f7fbc5e51e07cfad309d9315134717b84243f960003a30a7ad913c92cc242bdde27e2ab762ae3098792749c57a6669de56d3c601ea1b1eebc02b19146bf457f76c816de9d60fc75602c90100df4844530c82bd4e72f426461ae08bec0279a413219189686f0f761cb007c631d991331c4bdf4555ecb4f64c4db1722d5018e736cf9245521a96356b96f81c967b8151e876b87c7820fd519eb420f33a290988a8ae60cd1d4a08a19f9ec100ab7d224eb6187ac075f0e06618952ffd34a100b761573888f3e8b42197e5fa1d59b8e03b2dbe0aa9e82b028c7acfc2946499308d1338e7c88ae485af96be048af3786d45ae59ef8ba0efae969fa224f441cc84059ef923c48e8c88339d2d939ceec83e59eba456d40d9a9233c2c6301f39c94b578843ffe309c3651b837752b067d814ffaf2a08938d2da42db0c46ef7385381e46f3a725e4def7a378433959445bd948ff45b3e26c8cde9614232f4e0231d360aed3124f14f1894d42c55daee80a48ecf926a63aa04ea07a7c022ca17620c5e1e7b8b8550ecf48021ffb56a6053ed4dfcf07729cf899c031a36d57676ced4edf8fbf9c4d6c45cdd36cb478d371e7a7ed1a2bd103393440eb3bea0cbfc9ff452bfe05b451ce7ca2f15fba65b4d1a9fed2deaf863b6ff79730e5343c834f0b3121329b35d5bd37125e1f91aae2252be0eef675965e91a8bfac8f50a83a570703a31b1cbead430c51d55887d11e798b822c1d1f6278bba2df6ae43639d7986d8abbc2f1194d8158ac48d7c13b5885bd06213157f884942e834a126a77cdf831ffe5930a2cc3042070c3db3dddc6f558c3bad6d690da69ef82ee4e8ec7ab07b4642c7983103c7f3a807233c81aea388fe196d0bc8dd072cb6c1449b1e8d2a88637f54269c1dd9a77c5b28a9dd247e91a96498a65804f43e75df32c36aef0d3e04c6a6c7603c18093653d9b86b0dce24ff78f959926ca794b8fc0b36d92ce97fb433191ad6f619c1a94fc9385ba0da3c0b12434b76c7e02c22e783ef4bb4c803c7c1eafe57680d645ee81f631da2cb62c72785eb4ccd398d363ebfb4b5a3808cc69b7bc038ea025004b903e8f4ffaf5c78694ab38b50a6ff48398b49035a67acbac554085bbd96cb2129877c89e807d939017e9b853920e0a80928c674832a56f1d980b8c05f657c0c573ba6cd086ad8aa860587b68428ce2825eaa2ff1ebd9ca5dc7c4121cd169f93bbf99d137bfef8834a6a91161b9d27592f19dccf956194eb271c60b915abca8b364abc40b34ae05c6b97e62da244f5f5499afc6667577cd4d66fa7a4613146ba2aea51222f3198c12f04745b6a1f49903e5d4c62daea29aafe2fa9c2775d0aa3f9e473eeea8fd3a98d2bde0520e766bcac3aafa32f4e61d8e64fe7ad2eceb85b820e7c161c67fae8a9c905db678f7226463f6992d4aac587aa71662b04da340604093496625222a5ce9e7e7bd2b6ac3ef76ea665706919438c1fc4549d90eb088718198d6adf06e5d6047fe2c5a221b529ab534ae6c605f28e658dfa45e9455b43c79180620e84130b0a8108ee08208c62970b12b4bb0b9b17f85b5b8f157d3c72d9b4e44659f88fc53cc8c0df557fab76382331d2d814d61270581d952f7565573114745b8588ffd7cce021276eed7f1fa8ea1351f80ea33f06e201e4926c2ee50b1ee2ea697551ea4db453274a4f7d166e8a96588ab879e753630d41a515729bd3b85f50adc65b275f44c83fb090555c22df1b2584c36bf3abdf55b5e01b312a5fdade1173eeadd27d3c5df051ae13a137a1987ae7d9117d73f9cd742d67572f66d43986965347ea8f3a13eb7c210cda5f063feaecd89652b1d22ec6b00ed7ad86e2e204674d121ecfda526f1cd9dc0d335d606c499a66f2b52fd13cafe5d56954a3682ad4571fd87b8cf821e44e0163de8979d7b4c645b86b09efabdc71f641dea89b892c0bc58868b51facfaaf5ceb5c79cbd15ce64993edb3154757a748f961797dc36de63cdb7450adbe6e0ba83533db3471c2cfe244984e6af81be09efddd7bf3a2b2b74e170baece80fad439b6f17978ad59a2555282d1d5a286b749d6dd1d7b77b955e95eb09ee0cc8a51075af3c626cac743c0c4f5d4bf08072c0445fbd9213075415689e49b2abc7937baca899f7011c342004695daa5ded0dca213e4581da2c64dc8147d9f10040af86e3446fcd4c44958ad051742c995dbdda5cdfbfaf7fb360a278845210e0acb07039f57b72f5801cde9a7af47cc9d5f63031a8e727cc8f452516d86342be076cd7cfb9707eddc29c28c0e7d8b206984a157923a707c36999d9c3f2f41991eb2e4c2c87a0ba1f700c7de4dec276f76050d0e22941f057b44d85434655305a242a01665570e2df47a1d4f5020e021146d4012a02972c36cac4bf329b7930396674f1df69bb3782ecc099f8dd3832c08c9d9ce1149a8f70c911b7ea1a26c973498737fdc75d292209122184ae8cb086bb64bb5efa881e66249b5f56b1473e14086f5e316f82092d319719e28a261b1fac41fbaae3f1f3782ee89a4e65da0717312c12a0baa7e7994e03519915d7091d50db843b24b426c3896600f0709e170306438b9bd9127309dc1684075ef0723f6631edcd773882cc398348b9d6374745df76c2b7e506c55e05d69db155dee754928fbc9d53a57233a999f7ccd1f9e92e3d246affe2135b690741f33fa455f35cc832b5d1c7cdfc3eafde04b6bb5fa0b1908823499a0361230b34366ecebf3ab6ccadb7a9851f561135d6fbcc6ab9d44f6ec4c7c89d24246c262b64d612b4b6bcebe75c25769f6a5d0b32d3f3be88916791144229b3d5f08b81c868cdcc0aa64f49c6a1bce9aa4a050a855faa1ba9c9ce723600d9c03f8ef93870f9466243fd12f41e3d4d52a3abf19c92606cf8c8427f1699d6848bb371ddbc310d568c43a8512bb1e6216e93906bbe687bb254937e00fa813bdee5ae835b8f4b538c089869e2809d071306dd66c4f1d9e9c36cfd041ab151c50ed7d51f1c9eba568d30cb7dc460fc1f3056c0434ed4067ed8512901274ed282d2fd9cd9f623a7041389276ef3d7246b01471f8520f945b4b82552eec9a6baf8bc928b9ff78acc0e4f1f61e628300516e8a2bbbde5724da34901ca8452c3d80f3cdf11e63fd49395659753f830e1e75c73dd4bbdde17884e9f08c67c881beb1bd3be7fc2860071a7186ac8ed5a62451d359a7ba97f45a58222800cfdd818c40b512fe3eb952fa86b9f5a6e2f03fbe47168fbf10f42f4058bc7c394de0460879fe63fe1bb6d54de98118733f8d80dd417c1c441f6d73e8dfd48f378f68795e65093c408d441e1e964ed72005eb56976d398b3e8d00ffeef4efeb32f351e546b7ad624da994cb9002d55a95b94e2a08e3defd169f2d08c2bc3ea254249b0a3257f8b31f720dec4965aa164434e943c43f8d36ad5548422a0906b2319e7771320a4410f05e10a00937fcea93a149110a4cee86b55a48adbb4a409f29f984ac38ae089dc534dc9717cc46a9716669a60f2d5998ef092db71a28cdc5e212e12d976e4e324dc237b70f95af7ef9257905df6c79c0b36e98c997b28cb1c79ceec919eeb69ac015559a90d681c23dcf97f5eeab04ffcd2475611b596f58dae7ae468d94d16f6f0d3e0d9ec2b00b2e755fa7fb251c45c76259ca6367493c52734912c82584aafc869508fcb99215904ec39ae48a530cbd4ca9a45824eccdc7a14069917b39b3e549489d1d8cbd40407cf6af5b6b01818002845161d5b9942b274ae86ceb96e1439cc83b666184380764fb736cf81c29ebeab7ccac5768860e7ae1efef4cc90600b14be357150ab82280183f90c70bf2fc5e5bf66ebdc65a974e60616745bae6f64715fe63c9442b7500e3275982469e1e4d8c6082f1ca5496c090b868cf489c449580914652799f7357d7713f98a9a5d6b1590becb92f176016899a305146c86d3cb866395fc6c42a1b141baf2f9b0688716759f53d59e94c564885bf69cbd13f52eda2ccdcb4945acf41199b2266dde78549ae60e96ed0f1a6db0aceb043512d46cd48b661bed21d9458c30e72c4705024ba7d0b3523e7d730ed9e0970657aed42dfcb7d9de473041f6b5d8bb9a2f7ac0f4caa36ea2230184fddcb58dde9ee79d7c74a1fb99f885ba92f52b51f3b136e0b7f76395870db9c1763db65566abee19dfd481573f3762f95760fbbba29d565636ba52018f6252df5ac9431ad8ea118e00e4a169cd454de69c613e6aed48d1958634619cd4eae0b53ef70cbf0bf7db1939361a0ab831b04c0040c29152cc31344b50c45bf602a7c77db5497be1d9986b21671bd64eff32ab7ee7f287293876fa60774347daef0b7850538d02b94a65c4d0eeeb3ed108bd1123e7e2127341a8510cf20d97aeac28dcd95c8934931fa0a159531691b328d623bb9d399f41f8e26381a3c5a20262d97bc49aa8189e0884838fb53b479b92bb795f0ed4e1db232652d02df93624f03be27738b78974b64bd7bdf13009fb7dee59f1a9003a0368d16b1618854880958885b696da0b9dc67eecadde0755fb43ec464a0398787a8647f4a7fd071469c1ccfba4ba82e0e916ed48320806189eed374fd77de246092f4c51f9d87dfdeb763aa255cd5dc9adec7e4f098bba9cd840a168dd92de2866586014759a61710fcc1dd649b8db82d309e2bb510a7eccc471f192b629a0820b17d465d4d2b3efd3c6c27ad088a7e4640dafff94e784ce3aec2887dd463aed8a76ba313e6458fd6b0a07a4d3217438a3022a834e7ec89548ba6bdd747bd758d606170fbfbd4abeae84f2fb17bb21f4af68c69ff5f0c1d2d85bd7aa17ca47e49dfd752370934f43406b6bcba0878000a40ca6a996b73e36eb4071569aff9182ff7c4f2420278f65908d8f1506ced3073d7dd83633f454876f03f4961b13140206ea1df9e3615394a26f32b8cfec6a8969e46da75aba4c297ba50e9b37d711514c90d3463f919f15003108c8ea3590ce99fdff1a47c068df5d7f57e7ff11176d23283b7343ea4f16a14993c878aab9fe274249f962fa4ae07f8bb4c5abd5a2c8f8e5a3ff1aa3fd90ed9bf567605bd1ade1eb48f341743d38763402839a556e40e952a4f8043d66600000000"; - let tx_bytes = hex::decode(tx_hex.trim()).unwrap(); - let mut tx: Transaction = Deserialize::deserialize(&tx_bytes[..]).unwrap(); - - let reissuance_index = tx - .output - .iter() - .position(|o| o.script_pubkey == taproot_gen.address.script_pubkey()) - .unwrap(); - - // Corrupt Transaction - let hacker_script = Script::from_str("00000000").unwrap(); - tx.output[reissuance_index].script_pubkey = hacker_script; - - let result = verify_issuance(&tx, &option_arguments, &taproot_gen.address.script_pubkey()); - - match result { - Ok(()) => panic!( - "Test Failed: The verifier accepted a transaction with a stolen reissuance token!" - ), - Err(e) => { - println!("Test Passed: Correctly caught error: {e:?}"); - } - } -} diff --git a/crates/contracts/src/sdk/finance/issuance_validation/validate.rs b/crates/contracts/src/sdk/finance/issuance_validation/validate.rs index d629d0d..d99a08c 100644 --- a/crates/contracts/src/sdk/finance/issuance_validation/validate.rs +++ b/crates/contracts/src/sdk/finance/issuance_validation/validate.rs @@ -1,27 +1,22 @@ -use simplicityhl::elements::{AssetId, Script, Transaction}; +use simplicityhl::elements::{AssetId, Script, Transaction, TxIn}; use thiserror::Error; -pub trait IssuanceSpec { - fn get_primary_issuance_id(&self) -> AssetId; - fn get_secondary_issuance_id(&self) -> AssetId; - fn get_controlling_reissuance_id(&self) -> AssetId; -} - -#[derive(Error, Debug)] +#[derive(Error, Debug, PartialEq)] pub enum IssuanceVerificationError { - #[error("Invalid issuance count: expected exactly 2 inputs with issuances, found {found}")] - InvalidIssuanceCount { found: usize }, + #[error("Invalid issuance count: expected {expected}, found {found}")] + InvalidIssuanceCount { expected: usize, found: usize }, - #[error( - "Primary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit." - )] - InvalidPrimaryGeneratorInput, + #[error("No asset issuances found in the transaction.")] + NoIssuancesFound, + + #[error("Expected issuance at index {0} (Asset ID: {1:?}) was not found or mismatched.")] + MissingExpectedIssuance(usize, Option), #[error( - "Secondary Generator input is missing or invalid. Check Asset ID, ensure Amount is Null and Inflation Keys are Explicit." + "Input at index {0} is an issuance but has invalid details (Amount must be Null, Keys must be Explicit)." )] - InvalidSecondaryGeneratorInput, + InvalidIssuanceDetails(usize), #[error( "Security Breach: Controlling reissuance token explicitly sent to external wallet at output #{0}" @@ -29,12 +24,12 @@ pub enum IssuanceVerificationError { ControllingReissuanceExplicitLeak(usize), #[error( - "Potential Security Breach: Unknown confidential outputs detected outside the covenant" + "Potential Security Breach: Output #{0} is Confidential and goes to an external address" )] - ConfidentialOutputLeak, + ConfidentialOutputLeak(usize), - #[error("Failure: Controlling reissuance token not found in covenant")] - ControllingReissuanceMissingFromCovenant, + #[error("Failure: Controlling reissuance token ({0}) not found in covenant")] + ControllingReissuanceMissingFromCovenant(AssetId), } /// Verifies the issuance against the provided transaction. @@ -44,53 +39,72 @@ pub enum IssuanceVerificationError { /// Returns an [`IssuanceVerificationError`] if the transaction or script validation fails. pub fn verify_issuance( tx: &Transaction, - def: &impl IssuanceSpec, + expected_issuances: Option<&[AssetId]>, + controlling_reissuance: AssetId, expected_covenant_script: &Script, ) -> Result<(), IssuanceVerificationError> { - verify_issuances_input(tx, def)?; - verify_reissuance_output(tx, def, expected_covenant_script)?; + verify_issuances_input(tx, expected_issuances)?; + + verify_reissuance_output(tx, controlling_reissuance, expected_covenant_script)?; Ok(()) } fn verify_issuances_input( tx: &Transaction, - def: &impl IssuanceSpec, + expected_issuances: Option<&[AssetId]>, ) -> Result<(), IssuanceVerificationError> { - let issuances: Vec<_> = tx + let issuances: Vec<(usize, &TxIn)> = tx .input .iter() - .filter(|i| !i.asset_issuance.is_null()) + .enumerate() + .filter(|i| { + !i.1.asset_issuance.is_null() + && i.1.asset_issuance.amount.is_null() + && i.1.asset_issuance.inflation_keys.is_explicit() + }) .collect(); - if issuances.len() != 2 { - return Err(IssuanceVerificationError::InvalidIssuanceCount { - found: issuances.len(), - }); - } + match expected_issuances { + // if we do not pass expected issuances, verify at least one issuance exists + None => { + if issuances.is_empty() { + return Err(IssuanceVerificationError::NoIssuancesFound); + } + } - let primary_asset = def.get_primary_issuance_id(); - let secondary_asset = def.get_secondary_issuance_id(); - - let valid_primary_issuance = issuances.iter().any(|i| { - let issued_id = i.issuance_ids().0; - issued_id == primary_asset - && i.asset_issuance.amount.is_null() - && i.asset_issuance.inflation_keys.is_explicit() - }); - - let valid_secondary_issuance = issuances.iter().any(|i| { - let issued_id = i.issuance_ids().0; - issued_id == secondary_asset - && i.asset_issuance.amount.is_null() - && i.asset_issuance.inflation_keys.is_explicit() - }); - - if !valid_primary_issuance { - return Err(IssuanceVerificationError::InvalidPrimaryGeneratorInput); - } - if !valid_secondary_issuance { - return Err(IssuanceVerificationError::InvalidSecondaryGeneratorInput); + // if we have expected issuances, verify exact match + Some(expected_ids) => { + if issuances.len() != expected_ids.len() { + return Err(IssuanceVerificationError::InvalidIssuanceCount { + expected: expected_ids.len(), + found: issuances.len(), + }); + } + + for (idx, input) in &issuances { + let (issued_id, _) = input.issuance_ids(); + + if !expected_ids.contains(&issued_id) { + return Err(IssuanceVerificationError::MissingExpectedIssuance( + *idx, + Some(issued_id), + )); + } + } + + let found_ids: Vec = + issuances.iter().map(|(_, i)| i.issuance_ids().0).collect(); + + for expected in expected_ids { + if !found_ids.contains(expected) { + return Err(IssuanceVerificationError::MissingExpectedIssuance( + 0, + Some(*expected), + )); + } + } + } } Ok(()) @@ -98,41 +112,36 @@ fn verify_issuances_input( fn verify_reissuance_output( tx: &Transaction, - def: &impl IssuanceSpec, + expected_reissuance_id: AssetId, covenant_script: &Script, ) -> Result<(), IssuanceVerificationError> { - let controlling_reissuance = def.get_controlling_reissuance_id(); - - let mut potential_leak = false; - for (i, output) in tx.output.iter().enumerate() { - // Skip outputs going to the Covenant (These are safe) if output.script_pubkey == *covenant_script { continue; } if let Some(asset_id) = output.asset.explicit() { - if asset_id == controlling_reissuance { + if asset_id == expected_reissuance_id { return Err(IssuanceVerificationError::ControllingReissuanceExplicitLeak(i)); } } else { println!("Output #{i} is Confidential and goes to an external address."); - potential_leak = true; + return Err(IssuanceVerificationError::ConfidentialOutputLeak(i)); } } - if potential_leak { - return Err(IssuanceVerificationError::ConfidentialOutputLeak); - } - let secured = tx .output .iter() .filter(|o| o.script_pubkey == *covenant_script) - .any(|o| o.asset.explicit() == Some(controlling_reissuance) || o.asset.is_confidential()); + .any(|o| o.asset.explicit() == Some(expected_reissuance_id) || o.asset.is_confidential()); if !secured { - return Err(IssuanceVerificationError::ControllingReissuanceMissingFromCovenant); + return Err( + IssuanceVerificationError::ControllingReissuanceMissingFromCovenant( + expected_reissuance_id, + ), + ); } Ok(()) From 10d1f771d10a6714a5f295f84c8d7574fa35f372 Mon Sep 17 00:00:00 2001 From: Sdoba16 Date: Mon, 2 Feb 2026 14:02:48 +0200 Subject: [PATCH 4/4] Formatting fix --- .../src/sdk/finance/issuance_validation/test/test_data.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs b/crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs index f73ad9e..860593d 100644 --- a/crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs +++ b/crates/contracts/src/sdk/finance/issuance_validation/test/test_data.rs @@ -36,7 +36,7 @@ fn test_verify_issuance_valid() -> Result<(), String> { grantor_reissuance, &taproot_gen.address.script_pubkey(), ) - .map_err(|e| format!("Verification failed: {:?}", e))?; + .map_err(|e| format!("Verification failed: {e:?}"))?; Ok(()) } @@ -89,7 +89,7 @@ fn test_verify_issuance_corrupt() { ); match result { - Ok(_) => panic!( + Ok(()) => panic!( "Test Failed: The verifier accepted a transaction with a stolen reissuance token!" ), Err(e) => {