Skip to content

Instantly share code, notes, and snippets.

@SahidMiller
Last active January 11, 2026 18:45
Show Gist options
  • Select an option

  • Save SahidMiller/16786d7eaf81d509ad907705f057f8fa to your computer and use it in GitHub Desktop.

Select an option

Save SahidMiller/16786d7eaf81d509ad907705f057f8fa to your computer and use it in GitHub Desktop.
{
"$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json",
"description": "Generated template using https://github.com/SahidMiller/signatures.cash",
"name": "Secp256r1 Verfication",
"entities": {
"signature_data": {
"description": "",
"name": "Signature Data",
"variables": {
"table_q": {
"description": "",
"name": "",
"type": "AddressData"
},
"table_g": {
"description": "",
"name": "",
"type": "AddressData"
},
"table_g_hash": {
"description": "",
"name": "",
"type": "AddressData"
},
"table_q_hash": {
"description": "",
"name": "",
"type": "AddressData"
},
"signature_der": {
"description": "",
"name": "",
"type": "AddressData"
},
"msm_inverses": {
"description": "",
"name": "",
"type": "AddressData"
},
"continuation_msm_inverses": {
"description": "",
"name": "",
"type": "AddressData"
},
"inverse_s": {
"description": "",
"name": "",
"type": "AddressData"
},
"continuation_intermediate_y": {
"description": "",
"name": "",
"type": "AddressData"
},
"continuation_index": {
"description": "",
"name": "",
"type": "AddressData"
},
"continuation_intermediate_x": {
"description": "",
"name": "",
"type": "AddressData"
},
"u1": {
"description": "",
"name": "",
"type": "AddressData"
},
"u2": {
"description": "",
"name": "",
"type": "AddressData"
},
"signature_r": {
"description": "",
"name": "",
"type": "AddressData"
}
}
}
},
"scenarios": {
"base": {
"data": {
"bytecode": {
"table_q": "<0xf4f2d434f9d7bb9e04fbe9633f647911603704f8d47aff55abb50161314cada0007761acb9beb1c19fbfb4c028570c878da3303ccfc140ee596255eaa8280b7737001f90dae54dac058afa540d2e3ded695fc0acd7f7b33a6233db92b79df6993afd00849ad912eb558a8e72028cb9add7369884dd28ca5124a2bb3600304a90333acc00bc4c575bfa9445d34c4aa4650aec094fe78c67434a3e2e3e73d2ee51d5387bd700aa4e8d56ceb7779d81410c210da8776371b5c7b3b4d1b8188301173b10f0fb5a00d27a2e3af305b74fbafc8bb5ef053f873259430725377a16b58763bcfb3fbd7800a6d1c69bee1fe6ac28fd1b5af07f1e37a5207ae0e6cbeee9fa1dc5aec5129e1800186bfbf7a1474ec2568cdf0367d6684e059a0abf2e5c44cb0db8a5c550de320400757cd7a33d71e73e88f05ecee616915809e23fc3dadfcacd2fe9c8b52d28056e00acb0575f12a3f4c03ea3ea007cea43529929b8bbbff0fb580d54cbe2d9b4330e004be1f8e6f28087fdeae16cc04f6a58d877974cc8bd6ee9332871e5851acf7c5800bfe5d3c1a47f43d8a8546d04fdf37af34b64c0e83e0dda800e8aa30a5f8b10c6004daf39118a6de3f27290f874f1cd533c7371fb2c51e2c48714f108e1fb4d8ade00c41681960baae9305e9ace4c3d89c2b913507dbc04ba3b80d09c3ab59d2c74350028d49206dc169c919b36c00ee8ccdfabfda00a6a4c49244e5e402028f6992e780043612402255135e6647944e43a1d2cd935cc7b91b08a67c08f6d0230e2cff27e00faa197f99a6c44bd8e831aec95fba3a2c50253bf971bf7e7049d2b637812c419007ad1674f4ff63b6e3c00b4f189a831715b88a9f2dd1c132c3e47856b3911df5300304c2a3037df7afe8c4491c18d9be0565efdb23a27d6cdead8c94313e8fa1e910090567e49b0ddf61b18c1e86315f23af59370422354f1386d86fd44faf28028bf007bde162a6d4fa840949c006c9fb1ba84f1110dfd1ce917c1a6d686c16576e19900da31d4ab155a34d6db1788395f43e026226938d0f149b577d66d4cf581da584c00032adfd3e4e2858dd14d2a05d3c7890d72402851dea4c009da25506bf49101ea000b1c6567cbf2f4e18c66b1b8a33127f9c9fc3bb54f8d47e53e9258aa2fda2fa30072c1fb3971ed3b834963ca061d046d226be10f0fe46fb21dfa107839923677f2004df5b12ce82219695a8d1b4e7b7bf139df2110719d9897e952a05026457dffbc0089a2e8baa16dfa857e3738ec5a5cf24529769ed0fc8304eb1cd44ed366393a4b00edc8a327af5bc8d96f1262c9310190ebf23db839e95e155b8f2f3200cfbd756000501cb6d629943b12ffbcb9b3573a76ed66d885b01c3aba65b8bad819da98268200>",
"table_q_hash": "<0xab0fb4427fab99d552ed4b7c977d085aafafc72f036008ff1c15e439f5406e11>",
"table_g": "<0x96c298d84539a1f4a033eb2d817d0377f240a463e5e6bcf847422ce1f2d1176b00f551bf376840b6cbce5e316b5733ce2b169e0f7c4aebe78e9b7f1afee242e34f0078996647fc480ba6351bf277e26989c0c31ab5040338528a7e4f038d187bf27c00d17378229db7049e2982e93ce6ad7dbadb30749fc69a3d2940d08edb10557707006cfde7c61b6641fb85a9adef21b7c6e665f14b1d95eff7c8440a33a6d1e4cb5e0032507da227b1799a3db84f3836b02ad8eca2641ace064b377eff98490c643487005208036b44029350ef965578dbe21f03d02be69e65de2da0bb8fd032354a53e200c6d84e183fc2425c05e00ef3c396fc4e762d86da5feedf19c73c634c5a57f1e000ed33d0c30d4a552124e55b1ffd828cefdf8f660856c884d7d24051517a0b595100a46da1fd44bbd0d18808d8d4002f010d26798abf36bfe18a7d724a90a87dc1e000a991223ce9aab0c6b415b2eb0d744c02e3dd97b82c24d3922c60a4762a171ab000e27fc78f53487cfdbd167e1c70f7001c7903a7fb2d0eec6fd5da373274105ce800a3b28731702806305bef0fa8b8f8f97e60fb017c6630bb25467bbfa06f3b538e00b400f4c1861a5ec5211b04cb3336c7530090f5a6839f066d361833e0bd1deb730093b36fdbc19dddb4db97ce0f9838d2c1ad4cb53a2d74424053b0e9be9d77d962007e95090f6a0a54da786ae7bbf651eda2e0ce6711775df14f24d8e991bdcc5aad00e09e94904b8a9ed7b3f86d2c8ccb0a9e72f8711dd5388987710bdffeb6d768ea00fa48d04d4a225ae83f82dea4ea4f714dc8a08e4a964a0187e7fcc972c944272a003f72c5049406364c6e30481c476cca45b53f22ead11412593e993a2a6b6df6ce007307af44aabb34caee1e75fe29ed0d59104c3b9ddd3c126e90aeaa29a262868700d121bc74d3913343bf485025d02e7416da1cc2b09d373806594c3b88b713d13e0040372ae8fceef8e2da89985eda040d098ac6f4a4af43c824a2c8c4cc9a20999000c4e32486eec500d5992cf8b22830987951d5e520735326465ed917a8bdd51d7400d38144cd22ff9519a75cba352c91eb8e54b1874855837356dc5f389c6ab4700700012c07469d5de1988ad5ea654b282e79fce25ed8f25d80615a49ace07a837c1700d8bfc7efe2bb439cf34dfba1c314ee26724e0fb4ad9140a258a5be4ecd58bb63000b92d224732709575e9c067abeac26f13cdf36437f64767ab962381c007ae7540075b3d0602fc8a71b0890507377ea7171c3e7a2058c1f12427531f429bbf199f5005f9d9be5638c6663f10e3ade92af03ae658288998937fbade7ba1a97c64d45f000364f030dde9ce5473ffab575ce213b2ae643961fe594654e1f2d2e59e33eb9b500>",
"table_g_hash": "<0xe091815f92e5a68a20ceb790dd3693f90bc4835c7873f4f2c595a18ba6c338af>",
"signature_der": "<0x3043021f3f21a8978c3e04ff4a832195f07eb2b2ce3c3d0ad51fb8c45024f12cd3a3c002200977c5d4a2135e1372702dfb35c30ef854e6813de3156fc9d40331639ea8488e63>",
"signature_r": "<111543667941370745661465655967444066060026911715317722460221113267708470208>",
"u1": "<113187669683283811101684187094808144647040500477687745069933863392939812479170>",
"u2": "<61990557578433440308545250341354770991212952683369627396395235297883769632793>",
"inverse_s": "<19483627578975257913549550774861998749420010441795511868235942642245165638494>",
"msm_inverses": "<0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f17f78ae713ea16c33dd7434a8bc92bb7c6ff1b35d48f354ea7baaabe115afe800dfa8086f15a1dbfc7d42f938842a3a878b88daa3d506b4297ff782cfd4671f950035741cbe571b72c6d3a950a9c8fcf408aa445f02719689b995842fa6b043cd8900ef326af18110e116fd87c40cd5ee256f1af96259e233bceebc0628edd82e70de00b09881af2c6e847b90e2cf997594bdf1b466725b915c3061cadcbb792c44171b00b9b7f0106db959b2deba9d443d7c68ff104ac8b4196fa55a02a3946b8018c3ea00ae13b31d6e4cbd76e27ef2ba2c1015b2003f617b7b2b9a7c755b749da4f42e94009fa90696ecb6b97b2823d0ae953040618e01e82733138e004c43f81214dae78600c8131d9bbab0fc9444b6248949161fc298fcf2a285779622bd696e2b74d94a7900b176145370c338b5c25b0f1161a52443f2e7386cb20a04f0fbfb3e3b48cb52ef00b5e260efad03d3c5efa79aa2b11360bb10b42b2b32a234215a911a526ef19b3000f3298ac8fab193ab63685222d6d4ced48d60d56bef2b4fb9c338f3db522c874b007d063cb0184835bc7f870d5335dc8498305676ea79570f4d6a4a9acfa1c6586800eb0f74ce4672be038090689b4b4652cd76467ca936678bdbf945c1c4d13755c30077f041164339fd43165ea2945b5087471aad49b45679a8f2b1f9ce5e6284349100bb362ab39554221724450425cce122a24049affc188ef58d14cde3324e096e9600bb705b02b299f9ff138ea37b94f604bc4ec9987b71899e12961319ffb464d7b80063d5e5cf021273371b76bf447fbaad4ec199717bc3cb484c026cb0adbe0ab4dc00086076ddbc17e48d1067017777c486b86436e47e203ad78e1e76c99616a5a32c00d9562cb2914c0436ec5198362db8644e128dca0739e5444a646e149c2ad74101006964a5cc525a4db0433fe75edbcc2b6cbd43eb8a59fad02ab1372267b3235eec0091c4492ecf99c6468a4ff1314ebac2e961ab403cfe3e0cedb22922e7ea2c2ec3000ed97879ca552b6445f4b82bebf1a3306b59e3140d9dc815fb925ad6e2aaec820077e82d5b0f82aeaa738d7b71eb2f316eb96e0f8f478d91c694a535284c675102007dec4b11a813aedb920f68b478483eaa4f96a689b7927548e3fe870860ef7a0100618563f09e595f48f2fa37c11b23dfd5811253d7c503447624e399404527c42f00c5da351f7b1f487234f172a6a8f9bbaadd3425e50fb15ea514e4344866b3b004002a2f86d964f950919c2f92c65d314801d0fab303fe4521a395baf73de8ea43860080c38666fd4ae4ffa7e1e53533b0ad48badb91889b8ca3c6bd4d4880652372e50039c6c0d7b8e5408abca81836df756568beec19a67c0b41fb58095861fbb5aa360054bad184e0e94e42edc987e86b09cae1c1c4f45c454ca0a36927549ea9c91d3f001de2647973abecc83c8ded57f6d593f5fe6939f9cfe91f3479b4383632c68d2b0021265ece17927580523a80b6c6fcb295f295a4ff94cf01a6080243a6c75a27b800e842826882a770b6689416468c4dabc5f9441e40c8486e76a63cba398eb77eee00b99d48b41007618886b21ad3d9559cfea0d47fb40e9e4ba3a29da76502ad5a8200027cf29a11787faaeb0b0309bf0ebd6db54f6385da09601d4eddb00a963c7a7100eef6e5c3a6d668f1a614e769ed6e86702ff378afd6d9d1f2602c2218bcb1a3c300befee509350d07128f4d16694e35c2027f2e8c0bcb0191ca80f92210bb8a319f00cb2ae65bc099d51ecd83f9c27640008499687e7d1eb7942bfcf208c7e058cd57002f9a2d8e2893e6b9f627d70512f6b60f7dcf252eb21978b92dfc0796bc3d391400742c774ba1f0e7363b20a8e1675d670070335685fbf5372fed1f734c1d4562fb006dc59299e3de5bc749959a830c3e894a1ad2e7bb64768cc8990becf5b49f60c200315c3e30c46bbd563cbfe5c17d37c9a33a07584224ef5e5c3ded4316afd96f8300220c73c90d51e42d6bbe551517d872f69df598514b5829d68ffdb965a452de0b00886bb5eaf7d1c0d0d924f1af51e6c5ddfd7207d37731b7a81395657b8a7f01f900980b6d81796992090fcf19f7bd1c12741205e4c18466ad6741b49d1ffaff74f2000860f16ef3e82ca9c2ead62e50da9c0b7dad637df8af1fd132b411aeabf5eb56008d0f433320584d79689c67ed8e3c629dddaf41479f1108697ffb4186899d8bdf00a1c57af0e449779adefa5a86feef37c626de4e49950eaec9b348a753fefbca3800810288b8de4f78f45170867a44db8d2295f0c096e1b3ad5e994e53a4b38cffbc00aa7cd45c347881fc0c804286b6e9f9e46fe21b9124a9049b1d3d28464a8f509300a70c3154f8f1fe8bac83adc2396cb6b1ac63f6b1260a2dae756f9bf148a6be77002470c200be046754ff83e3e9a0b298fd1a1a95ea19e1dd594c4eb4df4666b15f009cbfdc2e7d1f9aa315f3074194ef3211fbd4394bb5b3bc1fd1238638143e977e00e7df5a7e60311724808d04287b5279032c5c28900b41cdb0da601ea3e7f9a7d3008ee3b6568a473212c63e3622d14623680188f903fc8a98f721940d44ab65716e0022823b7540653ad0fe833d52dde0cbf2763bcaa69b50e6ac4a8e6f02769e334b00fc9b822261107ba99adb4bda94ba147e2a3ff9fb4becf856bfacc344c4abe28f003e1f8059cebc28c764dad3104f3796f57b0d5c6dc47026a074c2a06a46489800001ec4445e380e5159d8279ce2e27ec0128166932f7defa23655334771f5e3006400564f3cffbef6bf866eaf9c3d1fea2251bc6476456d580af1e4130fb0dea5c76700f889b35d596af3c576fc6a8088f5e3dd7cc915f333a6b7e24c5e31fc334bc7fe0062659d30f3faea0ca95247bde0404280753d28b262faa78bbd91708d74c938fa009eb8f6ed46dd8bf9b27040a754c88c29657ae86b65490f747934ff2e3f4952560042a26c2e465788aba336fbab138f0cc6f7690888df254e74d27eaf98801efd700085a4aec54a761af8a8ee8b78b99e15bff926d04c17287a3e673a61250e839d3b003706a2236215e57faee7b2e7dcd8da356d951dba59f711d18c3047e49047f0fe009e65752e7ad7f42c36567b120a7e8b0ec5c8907fef8e420d59b81089d920291a0027c2c7f1d7782028a1e8b05676dd228852f60e87d434de0acf92c7c24a24224f00025608248ddd82fe6c7a1ee48f2e8fbbf3751d3ff73e13dab7021005a3fdee4200ffb9174169b24fb010490cb8fa9d4da426a4d7b5c26a5f2d7558ad9c56b54d4600116c39e3cdf870d73de18439950b509cc515a0f977008c18c96a85e2e1b295b8000a8542f281568fc04f7df8c229ed28cf35e9635ba4236ef7ebde08ea672907db002557509cb2e3b15e475e2fa91eaf4e3de0c0e105134a523f6a940feb157fb5ee005d0605f71a0dbc5d8221a125c516140d4595cceea7ec9983dab97c719e1488740090635ee1d7e4b9d55c3aa253fd917fa8078f8f31be79c4176ed41155908d1308004bfa1adab463a65cfe4a5cbcc4e0744cebd3c91b4b00d3bd58c1fbd3b36ca92e00def8c6165e60a8e8ed731d113ae784860afb6b1a8d90cce03e6632dfbdb263aa004424e2a9e9a2d15df89c27e9befbc177baabaea1194e94ff3d5cf59a51e859b40041c7ecb55668ebf5c7809ee4fdd9261a788539386108e46a9f00075d309eac1200f7262a5b9c1254c80dc6428599222c3c38c4ed98063d43837a99a90fd6e383840043be73cc0dfbebb11933b63384af71f7a99d42b0dacd051a4a685b2ad3e79740005a922001e0c7025208324a05dc47ed318ae052397bd14802a27645bb9f92e1a00049a28bd84055a7f2a2762e386b46a81308fe80ac8314303f55100d189497dc210088e2f98014f920f1c6284695a3c3e865f856b1baf47deceb8770b50731c96e69000453aa78b7103b599dd14e84714215bae888be00a5fb92945c2c1936f3940d170033cdf90243898cff28a073f9faa20028fbe98004a194a27721df2d532235608700dd26ac6097f532ec30bb388bc14dbcbe6754e6b3ad5387c2061900ec4b20915300ad9c1a717eac36999cf009a0cc3763578d88dfce2fe8573f29e00be8a5919cba004303cf895bf2fdbb10714d27831baefdb986bb78fd65310a7c677f540e3eabb7003b2330ea93cb91cc4ed9971d656f8090ea602a7e2c6518c43d33e52d9ef7e10500e14f3c2e579ffc2360846580874b74017a78da8683524933284619a637176803009a95b5c7d6d3fcc0160943bb5d7648e9bc098482732534e21c2a49126c90540b00503463c486d012bc58d270f2cb5e738c29c2bd81a540000b3a09aedcd274f9b800da5173463818542f380fe2e900fb871d89f3bf420f2cbe81011fa7ea02ad6da700bcc3c18108c3ce0fefc9251ce9d7c15f2e4ecee77c8879fb2b0876d54651916500f376b81b152cdd8ad7f2d3687bb1ccd01375320f25009a45a36e174a0b09d5170097915a66edddb1d164072e254be0d62d05b8c2bdf7c2ef9f8cc21aae0fdee61400949b0891edee82e1e7664a2ca476f8150ddecd073f39e4cbc6070fb0134ab53100b70743a5719ca37fb52829fd9a26ece26c434b8645253167ae3b77c04c8b433a002fc52c642799ce6ebb4908b564b011b3bcdeb0e7a309c2f635346641616f9f2800fd3a8229f3c0c1d6bc058af953744a8c63c51a13e9455fb821bc6f1897d470f600a33ecf2ce613b3532e7084a446c6e25b198f8b5e0c289c7664c1cb4a05493c56008a5fb78f1212854b3e672400ff5f3b24b5496b62504b39271cb32b921608fdad00013b99f107b177853ecf73d0416b484f32ac18f76c43f57847cc2656293e619800f54f6d5c80c44e1e611f83f45f156d532bd4fbe1bd501ea332d25b7f0706ff0700ed9f2e7e7fe1136b4446b11510ac100cd506fd6a89960e9225bb7b6baffb71d000da4530c9cf231304389bf5983993e0067bc0bf075e8687c2060c986d195cb00300bb11f4cc1e54aceb3bb2fb4040038eeb8cfb0bb0c72b6333d04caa8bb4757ac5000bd429fafda57ef712575c3ca128640f77354dd2d1c21dbe54f4f28ac3a69cb900dfe69c1abea81b85cc768fb541dad168d08f45f2be06d3d7f589e1b168c0cdd50009e1bb5e47f84d28ea7f119ae310e3c3d665da0ea6538091821f231fbd6f584200e5dadc2bfce4e95216aa88c34123d8fbd4b96d64d17e3260923624b384b9f7be008a628d6205c5671c0e79c223390d22398364140f3b732dd7783cfa0b4b18706d007b3f7257701325e3cb7d1690275f12439376abddeae68f1c972494592c05bb40003eff1a22fccb47a9e485fa6d7f14de82fa5295f06eba0073fa4954c2ffcd087200d86bc5dc14796db7fecb5c6c55dbf625798b891b86f93fa55c0ff68578b455ca000956c7fe77fde2a164d9c3b5b1b259c9eabfe3f4f9b6d53e774f548818db220e005a66be869af415db42e4b8bd4afb75c140d0c12f1631daaf17e6784535ce5ddf00424b8363dd118e259f1307c1795a01e6749f8f577364cb9cd36ed94245bf6d460058968770c21b1fef448f01e4c53512b48e2ced85b5fc851e5470a39331c07e4700641b4c2d0f2e5e73940eb66267097a8edeafff55fa95375becf467e04317dffe008d5e92845b6c769cc9f661a267d65d899e9c9788cf67fe56fe6b27767be13659006469dc703efebddc40b0c38fe53ff49f5cbb24fd0d8fa0ca9955267bd56800b000c0b79c72f5809684aca4c8403027e7fefffb380ef185fb9d19e783b047de09500091645399a9a11c5f8e2a72e900d6071496832f0bfd1de356d203384f486562580078fa6515dc1b08ace13c34fe5c44240c21153cc2446ad42618e9e2f81cba071400ed97d831940d5bd653e8b48cf6fe47c4ca16c494e091d7394e1289ccca334d9a001e24eeab7b0bc1e21fa7a943c820093c67f6cf33a67adac1362518ae6b7c828900e5cdd6a9f4501b944eb1aa80e2340e6478c0d72ab5d69d0289835551ac8047c9001b8e9348a73589036f18f8bd721e97c2a669a5ee480bbaa24ece0e6de4e79f8e0087763c6f0cb6627c5e1f225aa0007b4627c8f722af71c7297561b4580bf069e700a4d77598d392157610fccf1e4c3c8a7939e5ad35aeb002af8f418503524a111c005a35af236333924a4596b47039661b834695bfb91554023c679a0adc42520359003eb6215b655f8706ea62efba61bb8cd98b4fc9b0709be2bf312e179e3728e7dd0048dc8a1a21e2bbff10d9e4df1473f440ffcd375961d3a54e69094892a7641340006ceda2e5f80ddcfc85ab53b2fde1acedab56df6b5ef3d6573f45a355c0d17b2d00aa450b4cc59dfd70d636f5dec8571ab083704cd5a11f0591dd4d034da77b3f8700a6f242a1b14ba94621a588e25274f333fac5ea9488edf918481b1ad12ddb91ae00d4745fe35704b932b6436a5de5a34f3c36808a1e33b1ed3c0c3038cfd0c7cbd000cabc981ac1735faa0341558e29e3af6ae398348d8a939093e08492422539ad3700c3a377bf9109a852e1d93a282b1852896233a501c0ef5d1d44b7c27a7f9d4e160061ce3bc629607c721b44d86d0835df038e7010c35ffc000b82898f087413112900bc35216843e6f60f50c5842edf5f8c891f58730f69524910cba8fc740430ac1100170a581470b9393e26945e79b14a5f84ef5d07577be622772a5e31491f59a12700d8fc63c90b2ab9405b4277d02193c34dda64eea8db22c0091f83ecadb92160c7008d0d84216516265809ee0f460d2a5f050e221951f27e5bb6b9d89a8379e0b89c00e564ad09a02c6ee6dae460feb42cadab86b3fe951e0077681528481bd70382ec000b0974faccbaf83b2dacd005a7a8c3c5202fc29d7ec318c030bf7c888cb19cf400ece4637251ec5ce758e588551f8f96480b8386fc08a074133ad6e4e64ece4e7f00e60de1bbc8ff471d52086704fbb1b168b6ac9e35410af6c2bfc98b09d6f74e03005835d7eefe1597dadc56ddb95a667278ee4034476385df0116b01e741dcb35f600267b71e7c57fdbe4385bf9782d42b24438d553521dd43c9e8b8b84031ff9c9bc0021991d1cee2a139783987b9d69d44ecf603984b0cd1cba60fc7dc7ccdc7aeb830049399dbc6453692eeda4ad6383291283f17c4597cc1aca2ee5501862ab67262700447ea90548c38fc830472ced3537b1d8db9cb50de8c37ecc59196db0e70240a800f51b983117abada47da471c243fd0177aeebcd74471b20e9d9ce4a3a0d3ccd7800b44a2055c834033b2c5432c3f9b695129b78c8d1c32f1962e8bb97e3c4bf3933005b464de09a398cbf8d616bf90a64a735bd7467cc20efc9e2b8ce172618f5beb200849b49d5540b13f62c0d14f193621d80de72e944d74cea338dfbd68d62cc35a200d0a61228eae1e0cb912268ddc6ae165b024e3cacdf5ac9bf06e242cae34f0c8000243fbffc2245d5cd24e8e1e0af450132566c765827264af93e5d1e961099d947004e87fb69d08b05c51a005784b13f974b742cc03a8d233fd5d78a7804369159b500511755784580151fcd584d77f320157ad7db2428419a62eabbf5d8f7efd87f80000b4c6d69d3fc57aceefe4d565324709e65dd68a6dc4654c6275bb4d87e72782600b3696c93bae4c42a4fecc5e5f1ea6c7e67439761bae15b5e4464782b55ca73e800dcec84b4911212f52056a4b6d3d532b0e29cd0c4660183a15efc93f263dbb6d800f488040785b57a081c86c9907e9e91e9a0468047259e793250d3c627ec05b780005d91e45222b859a51c3f70d9fe7692d38e130ecdd36b80025992fb1e82895b4700fae23d9c5a9b380603ab82b39b85256df2a787b100a14b5890e0e9b0592bbc26005e384a0380eaec5b6920afc53deb226e30680431c5e61b6aef71259f76860939001fc2721e3c33878a28c8a2adad01a8294513246e9cb8c9a59b59a57b9c8d30c800e824dd7ca84fec366980e7701934f4fbb869a3b2a3c8ec5cb094452d7571f71a008ab2c55835b6f290ed52ddb6d9dc83debfe2f65e80af44d6788e243a9dbdcb45001e311bd0126d32af522035785b2a0ceb59fba3f06eeca8268ddb140d652e790300ede5ce51dc55976cdffb48e9a3276a610927b8842f191a8ca12b14c00e53e73600ec1e42a7e00fe64e114d54e13129987b3a77604810a7fe6b9ad35fcdd75f072b00075448a449d3aba33eabde978c83dfe5d3a7c37c456851c11cbaaeeba4511b3900db4abb665bbf1338e43efff68c1ec755367133182c5eaa26e8610d14141b444100>",
"continuation_index": "<32>",
"continuation_intermediate_x": "<95144296354222012653549124798433267474384807241421146760801997004367732087880>",
"continuation_intermediate_y": "<27682727012224929115623055109961057395687131744656437997616126663579162418832>",
"continuation_msm_inverses": "<0x5d395200d50defee702b749926bfac7cd1f9ed225ade2cb3066e02a84500210700ef8939bd1a17ecfeb15cc27a99f653b25a08744184120d4fc4df3cc89848c41800fd78afc16de5f45c22261002d27a22ed1e72db394b5240aedbec1dcaea9871a800cbb492fa9c9590f26ef776db06555e427d0144f983e2c0bf16336df8ac7abefa0041f663fd0e17881e23f811678691b26d677d1d3d419121b2b42f4566e4cc0e1c00f97375416195f08bf67d1ee3aa703de2a5241b327e2fbdcf75acaef0743f733800f7f95cf2567693a3c0580ac7de108f2e249423fba1861eff6cf8ac23085dfed800d5c155cc44068bc75d6fcdcc953602632da59224debfe439617ea081d20b83a700156a4baee827dd578f5c70a46cc36ea8448f11855e58ac0cd3a2ce5a1d9b84e300cfa165f4019e4a46d05e6a93dec8d2a626be91c964ab22412101f3e3f4ac08ce00ab98245ff0cc6e4527c266cb84701a787be6aebf117e6815bf14b86339c0cb7800aef3ae7c57457c445985dc957d4e9fb66c1e3a0bc284c6978c88bd7c87011440000fddc3cc53b2c529fa1258a29f58d22b14a9c93d734a79c37df7a059273eb7a9007af601fbfc3e27ca741e6b5d891f1b52b3c87557ba8667a7220e5e0d3a60cc4700fac390251128af5162ad8a83091a7ab891ba3521bbeec1f71b3c21520877e58a00222b01eaa92c207625e2d69531a1e5bf1d78943f7b557482dbe6fee0f7f2ffe70086f13cbdfb51d6c933069ab21b36b0dbe160d8dc89d0178b6c2b5c47b64c101b003a888a68ba44908c1c81a0e87a4e291907fb53d565669715d65bd0eddf6e820c000526a04d14d0a89382254e518b8373c64b1751ee2c0e85ca794c586888ddfd0500bcf0149ce72ddd13db6841976ff73c3da9b1af2969500f0a16b56d458398c1fa0043550b23139cabe9d74c04905a9bc85162e306a37db8eb259ebba9812d5ee38500cc01032f6535c724e3630d8003ba0f6059164f758afeb4f5599881a62b8a9d820045b2ce0c6d5587e0b002ae07194cfc8442107f242931b47f7ec0f625ccd7108f0062cb7eb3ece182ad549a7646f17f858df10a91249b759e383ccf83cf5a5667a200cd9b95b62da7e62ae87c882209c70c4d2aa79c35d4bdb52caa9049542044387a00e55a31de06ec4189afe9f78406797e19113ffa006e314b313ddad59afb0acdb100a6d875c3c66ac019a29188af16897f973a991010ab3247bb94c4e6c9fef637cb00443f40001f95e2cd7f4ce6556adbf1973f4fcfb678f06cd6d3b733b8d05d11bf00995ff9066f8c6909fe7f8b6df5f10fadc15e203e4de8bdc1955f2b92ed6f4daf00a9487db0b9f34366322a1b727d48b4a683ee6a500609310cacfa7dfb2e28cc4500e29ef7d9912374ddfa96ad20c2c3cd293746caf66a5db913f496b978003cadc100a70218ffbf7f317653b9a7a393f8f806f0bdd8372617045a6080a716e1b1a933007dd4943c51a8ff280ca18707ebabf877cca9a7972073557a5d0ec61fc8567cbd00b659873dc88531380337503f8c6f5c8a22a497aaf1fd2d88709655dda5db142c00e280258ebb3e5ba76c1440afd6be3503458e47c973e8a52a0f06464aa526afc100d76b03c419f419da2fdb023e06d7d780934bfb828a96ef99d56f5fa2ebe56cf600988e5b1668b06dfae957523c24ac90aa83b976d93c129e4ed9b5954523b6a66d001a51732a3f01044c6a5fdc82dd4ffa12d5f2dd3bdec22e77476cfaf7933825260056fe4b90e32250c4a045e632fee03e0df7accce1149b9fae3d3e1587368bba2700a0f2b654622f47608f8061eed39d07dcf79463c84558d611d59c304a205efa5700ad6f4d48b3a8951648e67a29a8f7cd4d04b2db92c38bab0a09efa5580241f21500b8669e49602796654f39557c87b32a584a8d6343bea7e806fe158ebb77a6100900640c4323fa4ca05ef0b5892e340eaecda0daa184c4215245de3bb8e29f8bb47f00282fba702d1bfecbbf35f01618633685d2a940f9d2f74b3f2af87a9b5ef4b56400b6164d35c8c1cfb497f4f37472a6d6d5e9d784911ba2247c45b8dadfd0737d930051027e41edce88888671e269d79eaece881228cb167d4b400d5ccf658f612a2e00548f279a4a5ce95f7a02229bde00bd7259a10a49072021e5b554eb9387d6f72d00b62382e13148efb600ab770574164a15f0615ca5d27d801fd9e9a8dd182c6fea00eec0d206b0a53a7911e6214678544b1ffb3b15679c38174c1aa484e84d05e47f003b6310ea3f6712c61009481a0bfef5d0080e5043328dd6c244415d04d63e111b0042a2251c3388664b7d932884ce29b6f5958db3a60ff93c3bdadf17e904361e5100e0008f0d98a9476d498af26823b0ba6b5b1cb19b8d172444d0796641035040bc002bbc090802d62ea66943641c6a44af903a7fba899f68275dda9fc85c5173945b00166c20c1ebf312821356e1a688845fb72e627a288ffffe4580670cf2cf068ad1002f2eef4a06ff1b615f2e24a6922f3f71bcb701ae5f4f4bb9b0bc3cf3065279be0080eaaf1edf490502784578c4b0ff6362e957dd3e7a1ef63ab4118e27a1efdf1b00c2a8367efbc36a0fd8ed34634678af7620539cd92df02f2e34aa3e7e17881054006133c87d6e4db037dffe5b47b7b13407007e090a9882abf6ffdfd22bddc35b4d00bb153fd2c424f20e56a3224b610fcaf88dec1f854f4d990f5817b57ac957bdbe00a2e989c5c7f2184a11cd5e990c816f10b0dc588e5818159b35f40132a269cb12000d831fe7a527d9aedca7ac719bf8993a0aa0996e967caa1ffefc5651744f257600460361d5a912f65251830089143ecc53e55813d493acd77b8605dd32a8d5506400f76713d4a79d7b9c82ad1e9ea43965eee596d5c20d8d41324a83a66885e25695008d998629acad4001af9f1aa7570af449f22bd303a0e84d91f89b147890f4da7c000ced3f73624002dc9f64af62d22970aac4a36f3cbae5dfe437e82da55042499900a765583ea1d927dcf70e45e9e8949eafeba5cf01007dd91e621270c9444a148d005b1947003b405e3cb1f3dcee8504949eb42bfae823646a349cfaeb75bba0dd7b008fd61a88e7bca93cf70044f8934f04608e903bd2f624f4a36f8b240a86a9c2c9001ee1d67b0786b1e15a5d1e3dc323fa282f697db23617f7251b4838af3662b24e00a67a1f53f2b53caae07274c3de5b5dfa8f365e49dd2bd6b79599de8d2b6d0908002cc91be011a2595df84cd512b252c671ccc0a41c25b7bc12aef7f0b2cba722580078ea12dd1c67ab4896f7aec65cc7108cd04bdd0f1d0d53240e1e014eec332ff200a0b59b168b0432193af3844dbb3d71f75e661714bc64819bba325e87badf75600033cc3035b70b9e69b23dc1ee0be03201d8f7d57ff5d7e10c2a951404e9f54c1e0011da09da518feeb4506109d8208bf970b5d64556d52b856da42e1f8462101eb5008dcce0da9dfe2b200d7e11b859a01c590f9c07283dcc4a8502039fabc616a2d90014f2b6493afbb0e80a035ca10eb283b262a3c074381cac1a947f87e535954009004760846a67cea331849481347ccd13c0c0b22661a5b92b6e6930f166274ac50e004ce1d2f443abcec2ebf5e450298b4c274324dd19322ac1d827a3728d158cf93000b61c854375dc2006b667cc77d07750c78060a7427451548d8755f81e3344f84a00cad8a3f84b0ce469d6c0e88ba2e83b74a92897b68cbb2b78ad80ab91c869eedf00e9dd960be31c059ee7ec4a4c8aaaebad6a1acb68d40219f11fe4c8265ac5379b00f90341e25572ddc156304873840fe3ff180b6e1e787090dabb0065ba27db0016008691a110386757eb148b25c6da9e9664eca307391442fa6f6d3d3e254e38c6200019bdb739b3ad49aa9ca086b4442c78c70ed5b6d6f9895715548ddece7f12e53c0066483a9b4fc91f508557f333b6736a9eb1653adf9b82d1c8c0952445f968ccd2000965fa92552c568ff64f4754c3155e88b4e15e23d31cc556e1411b7ef2c58b14000c2e58b9882bbc9e71f5cdb0e7a21ab74f1cfde5349808cb9a9ef04c4dd0b675008f5c6c16a4ee5b3cc743068eb932472a613f700fbe784f3d3e75aac229fcea1b0070db5cff44dad01fbc25d9d1be1e323b1fe4416248da553cbf0f40c83045263300f02107bce88854ce1cb61b4fd78eeb1fe5dd72868fed1aa451fa43ff8987a610006998091ea284ce1573beb523e281e8061be807578fbd48db477ea4718444cd5c005fb49767e01b60d935e57fecc27a40af8f24cff28aa22645a48f7a1be45a6583009943a833ba8596b5b723672b271409b7b955408d9619a2a59799ab061f41ffa700d43892910c1dda0ea172e8f9305fd45ef964ec9e16cd42bc210f05a4dfb4e00700cea88762bcecd4122fb37d1ed6d6e6a4353ec79b6e176d1b57aca6c0296cf8ba00cbd62e24fd4daa9c39cf52f8eedb34abd16312127577fa8ab182d5e2f3529009008dcea86419697b26b09625476fca86a4fcfad70ef0de8ca94a93e0eb6b099b590070852238efc53c1f95cdc53774f45194e25ca89e313b85dbbec8c955138a19ce0058b70f762187c97e5f874e18ea4e22b11cea6ce22c6b4fe50a2df98f2d69fffe00a022251e05fc76750ee6276e3710cfc2743cbdf8be2875b0296acbd891a21690000f048b4c1ab8c45ed3ef7470dd44bba3341861eb3df9494c5910bbf4314d4b4e000f7f1774966b637783d5f74cd749fe7aec40898b860fd777673803a54583cc4d00ec9c63ebe189be85e1c88b59903eb8bcb9e83a9d29c9c152b12cbd59095d220900c740eb59d6e40f7ab62f8a99624e9a8bd2ffc4e4f229a344e93f009126a031700019c6c2b1b1503a23684ea205f8c24885fbe1566653231d6b0529f8faecb5a824001e00759145c88c6f55f9c87ed49de0b971bcdbee597dd9da6b6f329afd111bd1006ef6a611787d7f86c8cf9c71ecc6a80ddca652644b6d4c21d3eb76a809d9525800c524fe583534c4ddf185420234bfcc9e3cd02434169d3e56caa05d99bfccaf0000e76fa4653fdd162f4266b7e980c003c40fae5667f50c5d4f008e5065c47924ec00516a623349ba1266c2e55087532f8682f79bf944479f495156c29643661feb3000b460878479d55489363935b7db4d0934ba31006a65842167dde87acdfa8ef90300252c4c9873c62e65841b0da861639881cf862b951db7713b79b4231392b577da00e9592e737d50fbceca5ee2d0b4fba91bd8b80efa7ba425c0e9b0bc92a059612b006e3b87076e66d61248080da0180c47b291384a1c848a3613e81f8b3d34d7686100e6190d7e93ea44c013764e36a927bd4714a537974119ac343cdb7f73d38819fb00c6f62ff95de46c2def95c49f6fa2f789990b0a50a7c6d0ac6eed1327cbffac5000f6cfeedb952ddaf9273edb3f44d9fd4073b27ca763e2b551a8b7aa97893e036b00b1f7d40cc72ea268c407aa11aff7183134018d9128a4873fb70cb8111703b2cd0011c5c943c1633ea2789eb42a53beeb2cdd858cea4b0530ff929684f48fe82b4000024e9a256aaaf1777cfc63bd2e4669cd8cfc63d941219b4110e0a3211155426000c4b6705397c013af6682ac40d3cc17b5cd3608e95fdbbddbb41dc7f49f76c48600ef41a3c53048856307622cd50288dccc1df2e8adfb26da8aabcde8fed2fc383f001648bb9179b46a3a46be684d6f85642499e1c1a580b80905bb20827f4d015f88006f616fd2b3d76ac4b5c3a42d1e5e9b6488f4337ee388050cf258d588dd239956008eb0bcc5e14cc685d3a5975d3452ffb93d74c9acbe1ad1815ae9ab423b35ad0a001d70a7d906add5be2177bc8dc51e3cac65f6b6d2cf73fed2fe8c20bba856e8760052da56c16b80fbc678e32e7c665e91d23c0bde76fd73e710c3efde98f59c9814004022b0979920b8fa7c0ad4d3d07131b64741d6aa9d2782f689368820baf704240067ef91a5290d9e81fbc2fa8c984d501b40e595b8d22b29a4b840abc63906dec500ba401c495c584b7a84620fe394fedf59ad67435ee66f2b3699cf1f211b5e318b00137d7590b95cd866c60135fac7cab0af403d5d48aa06b2bad4a3f814a25c68f600d76415f1757e50d1ca493705d1e3b600d6823ec2b266bfe152e11576c56beaba00311936efc535fe82e0514f037fe4b2d9cd29480e1a00d59ec771f91e70fa3a4f00b31d3d1f35f5d59489c39993c13a4af4e68e5ea3a29bb972c2d01d896916736a00994713815ff962eda8b8b3922e8067629619487ae34117915727ad82858d37c200a7f0c64b08504a0613c4815b3817a1e0a4e608f6df3dbd8658d596c48daf758000398e44d81d8bdca716144130b4f6e81d0e222b944d8c86bb8de4c3868ee39d5800dd8900409166d0c19cb5265501de329ea5e041b76e8c204345a576f4139844d100eca755374a06db59b71bb5bc2182d7a1ba1279d42077c5e05a4d07b3e823c878008aa3accaafed4bacad43ee5f67f5c3539badfe7762db123fce3621186d35de34005fee2035c2e118afe5a6e3f67a15735df87f3affd8b7a25d1305c18e792a261100c50bbc1802d91fc39df83062c3d0cb2d61c4a8d19c7a37da7a5e0a14dc25808d00af1250d3ba5f354125b087e21eb15fa0f49e09c11ce14895bed404372da053cb00099096fc249a9f8a82c0789e6fc4bf677e6124e4dee4984bd8f5dfc67bdee61f00463b3d894f86442a797134bdd29173c053292df29207c1360869648cadeee2db00157cb2fb110d2cd17a2485a1029af1b6f2a2ef90ffb6246f370b2546d6b17968009c224c11643dc9f7bb87a40e894be44c0b7268949d72698c16988dc885412f5300d104e15ee8cace040cd5d444912bbc0e3d6d53bfce3d10a7758a54871fbcd9bc007028bec8b41c0e5ba8fd438c1e2f88748ecea6a31ae135b4ff88ea00863e085800877d5054c012d4f7f4ef630ca561f74f1636e59140b539c92c7a6da697a3308e0015bd12de180e5eda76e88f07d5080b5244b7af149abd762f99f60e89781aa27d00fb66db1aa8863cea24c459c83bf17400ecc874adc8f355c49410d44bd9ed73b000b55351e86a4919dceda0a6995d148ff8acb2ec2a19bd8e124791cf07e1877a8d004cba16b1d0c7de077ab35415f3d47d4420f4ca6dacf163810107498311d12fb7000ed4dfa426a8ed69f5106d67e90aaba7b3c0dfe499034de6db08ed2ff7e86dec00fbecb3daa1cd95864f5b6f743e979fa67f7ab17b177de6ab19489623a1887c8100f809327c60cd2d57575386cf708519d86a778ef156859343ccce42b6771e92c200a138cb4da817d8d14a939c95e8da3cb1c4bbca907c49237c23040e03e3bba89e004337d778fa8a057239e79a44a72f729889afc134795c0a9099d28a1bf6447eae00283e76f7d3800c7f847e27afb8bb8fdf42d4b933a28837da1a8d53f2724d62a7004f9ce9fb64dae2437ab2b136eefd86491800d149ea187db1837228ea355e9af700cd422e2927d6aafc88e393968a2ce3b8f9cd50437000460d95fe6181360140b2006f4f1e3a4168f17f2b0ef771961d99ba9fd3d8f9c915e338d050171970b6ba39003d5113c97c2a5838d007aa090a71626d653cf4376758a2536cf6e2829ff8314500cd2f268986a5ba45b3d8b43db6303229efe7bbfd67a613a69e2c48e86c96a2730084e311b8159b44bde2ef45c37fa78b2e08b355d598b6a38fd20f0d4544e06de200477c8cff1165e79e4e10ff2aa0f40a70ef0e4b51bb0b09147209e6cd6725eb7e00520f12033f4d3a7c49d62a3ef708aa0510734f061d11e4897bcb303d89dcdf8e003ff356f69d94b737cf8b3773a10ce1fb1c5ae1f17ed898bd39bde6357d05478f00ba9decd67462d3a9f8b1dae263768eb1ab844afe0937180aa66df5d0a953e6e0000ee9552d9def273c0041f58d0a570d5f78e42dbd31c8c6bf6275e320c6257ec800f83e439c6183433bbe2294cb353f0ed4dd42e68137a3d5d51e2f8cd244ead9900099af8a2cdea351fca20ae3bccf824e47b1667830772f47902b0e01e8cd0a6b060084b3a4333ca0e85bcf323cf1fe455199e5ec9f7f43891a44c13502be3485d01300bee394403e98b3acef05f26f4aec378224c28a149c9d847ac82ee5c1c7d8fcd4007f3d252aadf2436d2888b6c4b9a59c20b6478462f53333a85fd8a49e5321106200d2db30428f1a70da142c8da83eaf177f778d46914a1020dca812699b8b96dde200a778bda3d7edbee22c166efe73f5ca89c5847f345080d7e8703805aa67d3b40100254ebf141512588417c3e86982e4bd31f51fef51e0fcb5a66ffd5cce1c150e5e00826ce3aaa002a78c761b2b2c0205b3c1f1c794b6edfd05accc0ebe08421cab9c00a3f8ecd27309f9808a336f79a40a781500efd92fbf982e03f67b3eebaa21441000845f3b20c4e0b737fd9affadb17b8fbd577cde39b499a7ab639e62273f9167cf0071dfb5e3ceb46dd65036f0f426c191ddd8f205d94f42add516ba04e2212d15ee005d06ae638c025eb4cde8b580c3b913f8413a79866358cc1518a5023246670ace004634071e457423ca585bc63afd5c80aa48f4c091c395e6d06be522701e8a7b4300e264a196c89456bf88f66e4998968abf7a7fb201ae9c9ef18dd76e41d868934700f727bc23006a16b4e218173721ea450fe18546e4dd1c7bd34fee58ac241c725500c1b3bd54f79fb5d1cfa17e33fd5be4e624538acaac7aa9e30f8bd7582f44d89b00adc6824e4458a199466666045cdf3f031b81027611c27f1069ed3059eac770830028e48c8a04ac98efed06bb50b6dc73058b25a70d8f8d41e930a80ae11edf559700410912c2d7d5bb41143c628d9f2d27ba935e1c9c86d60a81de49395278ae273800da5c11d49c3b966de0ec802c89a0bcfb163e7dd967f7ece3c64e9862733f22c800673e4873655be80b941be3b89672ee1efbf7a46f4821224475685ed6b0110f3200d5a56a4e4d94793cbd912f32a158521540cf8951ad68d63407d8a554fedf7ffa009e0cd0baa6e75dc4df4aaa88a6c9e204da63f795b38c10531c64b7efdc58b00800>"
}
},
"description": "",
"name": "Unnamed Scenario"
},
"transaction_verify": {
"description": "",
"extends": "base",
"name": "Transaction Verify",
"transaction": {
"inputs": [
{
"unlockingBytecode": [
"slot"
]
},
{
"unlockingBytecode": {
"script": "unlock_affine_verify_chain_final"
},
"outpointIndex": 1,
"outpointTransactionHash": "a914f4d581805eec7b52ae2021034b5fc42506bc3f3487"
}
],
"outputs": [
{
"valueSatoshis": 1000000
},
{
"lockingBytecode": {
"script": "affine_verify_chain_final"
},
"valueSatoshis": 1000000,
"token": {
"category": "",
"nft": {
"capability": "mutable",
"commitment": "abcdef"
}
}
}
]
},
"sourceOutputs": [
{
"lockingBytecode": [
"slot"
],
"valueSatoshis": 1000000
},
{
"lockingBytecode": {
"script": "affine_verify_chain_final"
},
"valueSatoshis": 1000000,
"token": {
"category": "1377c51ba547abcd961e82468c81b15449a9777f50a679fa42549b3a9489122a",
"nft": {
"capability": "mutable",
"commitment": "abcdef"
}
}
}
]
},
"transaction_serialization": {
"description": "",
"name": "test 0",
"transaction": {
"version": 2,
"locktime": 2403554972,
"inputs": [
{
"unlockingBytecode": [
"slot"
],
"sequenceNumber": 841206716,
"outpointTransactionHash": "0x101010101010101010101010101011",
"outpointIndex": 1
},
{
"unlockingBytecode": "",
"sequenceNumber": 841206716,
"outpointTransactionHash": "0x202020202020202020202020202021",
"outpointIndex": 2
}
],
"outputs": [
{
"lockingBytecode": "a914f4d581805eec7b52ae2021034b5fc42506bc3f3487",
"valueSatoshis": "d050b65a0a33ef7d",
"token": {
"nft": {
"capability": "none",
"commitment": "abcdef"
},
"category": "1377c51ba547abcd961e82468c81b15449a9777f50a679fa42549b3a9489122a"
}
},
{
"lockingBytecode": "a914f4d581805eec7b52ae2021034b5fc42506bc3f3487",
"valueSatoshis": "d050b65a0a33ef7d"
}
]
},
"sourceOutputs": [
{
"lockingBytecode": [
"slot"
],
"valueSatoshis": 1000000,
"token": {
"nft": {
"capability": "none",
"commitment": "abcdef"
},
"category": "1377c51ba547abcd961e82468c81b15449a9777f50a679fa42549b3a9489122a"
}
},
{
"lockingBytecode": "a914f4d581805eec7b52ae2021034b5fc42506bc3f3487",
"valueSatoshis": 1000000,
"token": {
"amount": 1000,
"category": "1377c51ba547abcd961e82468c81b15449a9777f50a679fa42549b3a9489122a"
}
}
]
}
},
"scripts": {
"unlock_affine_verify_chain": {
"passes": [
"transaction_verify"
],
"name": "Unlock",
"script": "<> <33> <> <>\n<$(msm_inverses)>\n<$(inverse_s)>\n<$(signature_der)>\n<affine_scalar_multiply>\n/* Padding */ <0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>",
"unlocks": "affine_verify_chain"
},
"unlock_affine_verify_chain_final": {
"passes": [
"transaction_verify"
],
"name": "Unlock",
"script": "<32> <> <$(continuation_intermediate_y)> <$(continuation_intermediate_x)>\n<$(u2)>\n<$(u1)>\n<$(signature_r)>\n<$(continuation_msm_inverses)>\n<$(table_q)>\n<$(table_g)>\n<affine_scalar_multiply>\n<0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>",
"unlocks": "affine_verify_chain_final"
},
"unlock_transaction_serialization": {
"passes": [
"transaction_serialization"
],
"name": "Unlock",
"script": "//Sighash\n//FORKID 0x40 / 0100 0000\n//SIGHASH_UTXOS 0x20 / 1110 0001\n//SIGHASH_ALL\t 0x41 / 0100 0001\t0x01 / 0000 0001\tSign all inputs and outputs\n//SIGHASH_NONE\t 0x42 / 0100 0010\t0x02 / 0000 0010\tSign all inputs and no output\n//SIGHASH_SINGLE\t 0x43 / 0100 0011\t0x03 / 0000 0011\tSign all inputs and the output with the same index\n//SIGHASH_ALL | ANYONECANPAY\t 0xC1 / 1100 0001\t0x81 / 1000 0001\tSign its own input and all outputs\n//SIGHASH_NONE | ANYONECANPAY\t 0xC2 / 1100 0010\t0x82 / 1000 0010\tSign its own input and no output\n//SIGHASH_SINGLE | ANYONECANPAY\t 0xC3 / 1100 0011\t0x83 / 1000 0011\tSign its own input and the output with the same index\n//SIGHASH_ALL | SIGHASH_UTXOS 0x61 / 0100 0001\n//SIGHASH_NONE | SIGHASH_UTXOS 0x62 / 0100 0010\n//SIGHASH_SINGLE | SIGHASH_UTXOS 0x63 / 0100 0011\n//SIGHASH_ALL | ANYONECANPAY | SIGHASH_UTXOS \t 0xE1 / 1100 0001\n//SIGHASH_NONE | ANYONECANPAY | SIGHASH_UTXOS \t0xE2 / 1100 0010\n//SIGHASH_SINGLE | ANYONECANPAY | SIGHASH_UTXOS \t0xE3 / 1100 0011\n<0xE1>",
"unlocks": "transaction_serialization"
},
"unlock_affine_scalar_multiply": {
"passes": [
"transaction_verify"
],
"name": "Unlock",
"script": "//start + end + intermediate(y,x)\n// <35> <> <$(continuation_intermediate_y)> <$(continuation_intermediate_x)>\n// $(<continuation_msm_inverses>)\n<> <33> <> <>\n//Inverses\n$(<msm_inverses>)\n//Table(P)\n$(<table_q>)\n//Table(G)\n$(<table_g>)\n<$(u2)> //u2\n<$(u1)> //u1\n<0xab0fb4427fab99d552ed4b7c977d085aafafc72f036008ff1c15e439f5406e11> //Hash(Table(P))\n<0xe091815f92e5a68a20ceb790dd3693f90bc4835c7873f4f2c595a18ba6c338af> //Hash(Table(G))",
"unlocks": "affine_scalar_multiply"
},
"affine_verify_chain": {
"lockingType": "p2sh20",
"name": "Affine Verify Chain",
"script": "/* Padding */ OP_DROP\n/* P2SH */ OP_DUP OP_SHA256 <0xc3f02727de3c5aa4f2e830d5e05d14a941218755d2c10a34c19c1202c9f19c45> OP_EQUALVERIFY <0x01> OP_DEFINE \n\n//Verify starting from 0\nOP_6 OP_PICK <> OP_EQUALVERIFY\nOP_4 OP_PICK <> OP_EQUALVERIFY\nOP_3 OP_PICK <> OP_EQUALVERIFY\n\nOP_INPUTINDEX OP_1ADD OP_INPUTBYTECODE\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop start\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop end\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop continuation_y\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop continuation_x\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop signature_r\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop u2\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop u1\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF OP_NIP //drop inverses\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF //keep tableQ\n<1> OP_SPLIT OP_SWAP OP_DUP <0x4d> OP_EQUAL OP_IF OP_DROP <2> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_DUP <0x4e> OP_EQUAL OP_IF OP_DROP <4> OP_SPLIT OP_SWAP OP_BIN2NUM OP_SPLIT OP_ELSE OP_BIN2NUM OP_SPLIT OP_ENDIF OP_ENDIF //keep tableG\nOP_DROP OP_2SWAP\n\n<115792089210356248762697446949407573529996955224135760342422259061068512044369> //CURVE.N\n\n//DER: 0x30 <len> 0x02 <lenR> <rBytes> 0x02 <lenS> <sBytes>\nOP_SWAP <1> OP_SPLIT OP_NIP <1> OP_SPLIT OP_SWAP OP_SPLIT OP_SWAP //sighash, restDER\n<1> OP_SPLIT OP_NIP <1> OP_SPLIT OP_SWAP OP_SPLIT //r, restDER\n<1> OP_SPLIT OP_NIP <1> OP_SPLIT OP_SWAP OP_SPLIT OP_DROP //sighash, r(BE), s(BE)\nOP_REVERSEBYTES OP_SIZE OP_1SUB OP_SPLIT OP_DUP <0x00> OP_CAT OP_BIN2NUM <0x8000> OP_GREATERTHAN OP_IF <0x00> OP_CAT OP_ENDIF OP_CAT\nOP_SWAP\nOP_REVERSEBYTES OP_SIZE OP_1SUB OP_SPLIT OP_DUP <0x00> OP_CAT OP_BIN2NUM <0x8000> OP_GREATERTHAN OP_IF <0x00> OP_CAT OP_ENDIF OP_CAT\nOP_DUP OP_TOALTSTACK //Store R\nOP_SWAP\n\n// w = sInv\n //Verify s inverse ((s * sInv) % p === 1)\n OP_4 OP_ROLL //sInv\n OP_SWAP //s\n OP_OVER //sInv\n OP_MUL //(s * sInv)\n OP_4 OP_PICK OP_MOD\n OP_1 OP_EQUALVERIFY //(s * sInv) % p === 1\n\n//z = msgHash\nOP_ROT transaction_serialization\n// OP_ROT OP_DROP <0xddac4895627490c28cdbd23936b5ebd9c6b7d5359bdb85d52021a01f7b2f9759>\nOP_REVERSEBYTES OP_SIZE OP_1SUB OP_SPLIT OP_DUP <0x00> OP_CAT OP_BIN2NUM <0x8000> OP_GREATERTHAN OP_IF <0x00> OP_CAT OP_ENDIF OP_CAT\n\n//u1 ≡ z*w(modn)\nOP_OVER \nOP_MUL\n OP_3 OP_PICK \n OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\nOP_DUP OP_TOALTSTACK\n\n// u2 ≡ r*w (modn)\nOP_ROT OP_ROT OP_MUL\n OP_2 OP_ROLL OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\nOP_DUP OP_TOALTSTACK\n\n// store end index\nOP_DEPTH OP_2 OP_SUB OP_PICK OP_TOALTSTACK\n\nOP_SWAP\n\n/* Param */ <$(table_q_hash)> //Table Hash\n/* Param */ <$(table_g_hash)> //Table Hash\n\n// /* Invocation */\n<0x01> OP_INVOKE\n\n// /* Covenant */\nOP_DEPTH OP_2 OP_EQUALVERIFY //Verify result Y,X\nOP_FROMALTSTACK OP_1SUB OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT\n<0x00> \nOP_CAT\nOP_ROT OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //push continuation_y\nOP_CAT\nOP_SWAP OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //push continuation_x\nOP_CAT\nOP_FROMALTSTACK OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //push u2\nOP_CAT\nOP_FROMALTSTACK OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //push u1\nOP_CAT \nOP_FROMALTSTACK OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //push r\nOP_CAT //expected head of second unlocking script\n\nOP_SIZE <1> OP_INPUTBYTECODE OP_SWAP OP_SPLIT OP_DROP //actual head of second unlocking script\nOP_EQUALVERIFY //verify second script verifies rest of computation\n<1> OP_UTXOBYTECODE <affine_verify_chain_final> OP_EQUALVERIFY //Verify second script is locked appropriately\n\nOP_1"
},
"affine_verify_chain_final": {
"lockingType": "standard",
"name": "Affine Verify Chain Final",
"script": "/* Padding */ OP_DROP\n/* P2SH */ OP_DUP OP_SHA256 <0xc3f02727de3c5aa4f2e830d5e05d14a941218755d2c10a34c19c1202c9f19c45> OP_EQUALVERIFY <0x01> OP_DEFINE \n/* Expected R */ OP_3 OP_ROLL OP_TOALTSTACK\n\nOP_4 OP_ROLL //u2\nOP_4 OP_ROLL //u1\n\n/* Param */ <$(table_q_hash)> //Table Hash\n/* Param */ <$(table_g_hash)> //Table Hash\n\n/* Invocation */\n<0x01> OP_INVOKE OP_DEPTH OP_2 OP_EQUALVERIFY OP_NIP\n <115792089210356248762697446949407573529996955224135760342422259061068512044369> //CURVE.N\n OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\n\n//Verify x and r equality\nOP_FROMALTSTACK \nOP_EQUAL"
},
"transaction_serialization": {
"lockingType": "p2sh20",
"name": "Transaction Serialization",
"script": "< // Convert int to compact size\n OP_DUP <253> OP_LESSTHAN\n OP_IF\n <2> OP_NUM2BIN <1> OP_SPLIT OP_DROP\n OP_ELSE\n OP_DUP <1> <16> OP_LSHIFTNUM OP_LESSTHAN\n OP_IF\n <3> OP_NUM2BIN <2> OP_SPLIT OP_DROP\n <0xfd> OP_SWAP OP_CAT\n OP_ELSE\n OP_DUP <1> <32> OP_LSHIFTNUM OP_LESSTHAN\n OP_IF\n <0x05> OP_INVOKE\n <0xfe> OP_SWAP OP_CAT\n OP_ELSE\n <9> OP_NUM2BIN <8> OP_SPLIT OP_DROP\n <0xff> OP_SWAP OP_CAT\n OP_ENDIF\n OP_ENDIF\n OP_ENDIF\n> <0x04> OP_DEFINE\n\n<<5> OP_NUM2BIN <4> OP_SPLIT OP_DROP> <0x05> OP_DEFINE\n\n<\n /**\n * EncodeTokenPrefix(type: OutputType, i: int)\n * \n * type {OutputTypeEnum} = {\n * Output: 0,\n * SourceOutput: 1,\n * }\n * \n **/\n <>\n OP_OVER OP_3 OP_PICK OP_IF OP_UTXOTOKENCATEGORY OP_ELSE OP_OUTPUTTOKENCATEGORY OP_ENDIF \n OP_IF\n <0xef> OP_CAT //Token prefix \n OP_OVER OP_3 OP_PICK OP_IF OP_UTXOTOKENCATEGORY OP_ELSE OP_OUTPUTTOKENCATEGORY OP_ENDIF <32> OP_SPLIT OP_DROP //prefix+category\n OP_CAT\n /* tokenBitfield */\n OP_OVER OP_3 OP_PICK OP_IF OP_UTXOTOKENAMOUNT OP_ELSE OP_OUTPUTTOKENAMOUNT OP_ENDIF OP_0 OP_EQUAL OP_IF <0x20> OP_ELSE <0x00> OP_ENDIF //HAS_NFT\n OP_2 OP_PICK OP_4 OP_PICK OP_IF OP_UTXOTOKENCOMMITMENT OP_ELSE OP_OUTPUTTOKENCOMMITMENT OP_ENDIF OP_IF <0x40> OP_ELSE <0x00> OP_ENDIF //HAS_COMMITMENT_LENGTH\n OP_OR\n OP_2 OP_PICK OP_4 OP_PICK OP_IF OP_UTXOTOKENAMOUNT OP_ELSE OP_OUTPUTTOKENAMOUNT OP_ENDIF OP_0 OP_GREATERTHAN OP_IF <0x10> OP_ELSE <0x00> OP_ENDIF //HAS_AMOUNT\n OP_OR\n OP_2 OP_PICK OP_4 OP_PICK OP_IF OP_UTXOTOKENCATEGORY OP_ELSE OP_OUTPUTTOKENCATEGORY OP_ENDIF <32> OP_SPLIT OP_NIP <1> OP_NUM2BIN //capabilityInt\n OP_OR\n /* end tokenBitfield */ \n OP_CAT\n OP_OVER OP_3 OP_PICK OP_IF OP_UTXOTOKENCOMMITMENT OP_ELSE OP_OUTPUTTOKENCOMMITMENT OP_ENDIF OP_DUP OP_IF OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT OP_ELSE OP_DROP <> OP_ENDIF //varint(commitment.length) || commitment\n OP_CAT\n OP_OVER OP_3 OP_PICK OP_IF OP_UTXOTOKENAMOUNT OP_ELSE OP_OUTPUTTOKENAMOUNT OP_ENDIF OP_DUP OP_IF <0x04> OP_INVOKE OP_ELSE OP_DROP <> OP_ENDIF //compact_uint(token amount)\n OP_CAT\n OP_ELSE\n OP_ENDIF\n OP_NIP\n OP_NIP\n> <0x06> OP_DEFINE\n\n<\n /**\n * SerializeOutput(type: OutputType, i: int)\n * \n * type {OutputTypeEnum} = {\n * Output: 0,\n * SourceOutput: 1,\n * }\n * \n **/\n OP_DUP OP_2 OP_PICK OP_IF OP_UTXOVALUE OP_ELSE OP_OUTPUTVALUE OP_ENDIF <9> OP_NUM2BIN <8> OP_SPLIT OP_DROP //uint64(value)\n /* lockingBytecodeField */\n OP_ROT OP_ROT OP_2DUP //uint64(value), type, i, type, i\n <0x06> OP_INVOKE //uint64(value), type, i, token prefix\n OP_OVER OP_3 OP_PICK OP_IF OP_UTXOBYTECODE OP_ELSE OP_OUTPUTBYTECODE OP_ENDIF //bytecode\n OP_CAT \n /* end lockingBytecodeField */\n OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //compact_uint(lockingBytecodeField.length) || lockingBytecodeField\n OP_3 OP_ROLL OP_SWAP OP_CAT //uint64(value) || compact_uint(lockingBytecodeField.length) || lockingBytecodeField\n> <0x07> OP_DEFINE\n\n<0x00> OP_CAT\nOP_DUP <0x1f00> OP_AND //hashType, hashType & SIGHASH_ANYONECANPAY\nOP_OVER <0x4000> OP_AND OP_BIN2NUM OP_0NOTEQUAL OP_VERIFY\nOP_OVER OP_DUP <0x8000> OP_AND OP_BIN2NUM OP_0NOTEQUAL //hashType & SIGHASH_ANYONECANPAY\nOP_SWAP <0x2000> OP_AND OP_BIN2NUM OP_0NOTEQUAL //hashType & SIGHASH_UTXOS\n\nOP_TXVERSION <0x05> OP_INVOKE // uint32(nVersion)\n\n// hashPrevouts\n OP_2 OP_PICK //hashType & SIGHASH_ANYONECANPAY\n OP_IF\n <0> <32> OP_NUM2BIN //u32(0x00)\n OP_ELSE\n <0> <0> \n OP_BEGIN \n OP_DUP OP_OUTPOINTTXHASH OP_REVERSEBYTES <1> OP_SPLIT OP_NIP OP_REVERSEBYTES //outpoint.txid\n OP_OVER OP_OUTPOINTINDEX <0x05> OP_INVOKE //u32(outpoint.index)\n OP_CAT //outpoint.txid || u32(outpoint.index)\n OP_ROT OP_SWAP //i, acc, outpoint.txid || u32(outpoint.index)\n OP_CAT //i, acc || outpoint.txid || u32(outpoint.index)\n OP_SWAP //acc, i\n OP_1ADD OP_DUP OP_TXINPUTCOUNT OP_EQUAL \n OP_UNTIL \n OP_DROP\n OP_HASH256\n OP_ENDIF\n OP_CAT // append hashPrevouts\n\n// hashUtxos\n OP_OVER //hashType & SIGHASH_UTXOS\n OP_IF\n <0> //acc\n <0> //i\n OP_BEGIN \n <1> OP_SWAP <0x07> OP_INVOKE OP_ROT OP_DROP //serializedOutput\n OP_ROT OP_SWAP //i, acc, serializedOutput\n OP_CAT //i, acc || serializedOutput\n OP_SWAP //acc, i\n OP_1ADD OP_DUP OP_TXINPUTCOUNT OP_EQUAL \n OP_UNTIL \n OP_DROP\n OP_HASH256\n OP_ELSE\n <>\n OP_ENDIF\n OP_CAT\n\n// hashSequence\n OP_2 OP_PICK //hashType & SIGHASH_ANYONECANPAY\n OP_4 OP_PICK <0x0200> OP_EQUAL OP_BOOLOR //OR baseType == SIGHASH_NONE\n OP_4 OP_PICK <0x0300> OP_EQUAL OP_BOOLOR //OR baseType == SIGHASH_SINGLE\n OP_IF\n <0> <32> OP_NUM2BIN //u32(0x00)\n OP_ELSE\n <0> <0> //acc, i\n OP_BEGIN \n OP_DUP OP_INPUTSEQUENCENUMBER //input.sequence\n OP_ROT OP_SWAP //i, acc, input.sequence\n OP_CAT //i, acc || input.sequence\n OP_SWAP //acc, i\n OP_1ADD OP_DUP OP_TXINPUTCOUNT OP_EQUAL \n OP_UNTIL \n OP_DROP\n OP_HASH256 \n OP_ENDIF\n OP_CAT // append hashSequence\n\n//current outpoint\n OP_INPUTINDEX OP_OUTPOINTTXHASH OP_REVERSEBYTES <1> OP_SPLIT OP_NIP OP_REVERSEBYTES //input.txid\n OP_INPUTINDEX OP_OUTPOINTINDEX <0x05> OP_INVOKE //uint4(input.vout)\n OP_CAT\n <0> OP_INPUTINDEX <0x06> OP_INVOKE //token prefix\n OP_CAT\n OP_ACTIVEBYTECODE OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //varint(input.bytecode.length) || input.bytecode)\n OP_CAT\n OP_INPUTINDEX OP_UTXOVALUE <8> OP_NUM2BIN //uint4(input.value)\n OP_CAT\n OP_INPUTINDEX OP_INPUTSEQUENCENUMBER //uint4(input.seq)\n OP_CAT\nOP_CAT // append serialize(current outpoint)\n\n// hashOutputs\n OP_3 OP_PICK <0x0100> OP_EQUAL\n OP_IF\n <0> //acc\n <0> //i\n OP_BEGIN \n <0> OP_SWAP <0x07> OP_INVOKE OP_ROT OP_DROP\n OP_ROT OP_SWAP //i, acc, uint64(value) || compact_uint(lockingBytecodeField.length) || lockingBytecodeField\n OP_CAT //i, acc || uint64(value) || compact_uint(lockingBytecodeField.length) || lockingBytecodeField\n OP_SWAP //acc, i\n OP_1ADD OP_DUP OP_TXOUTPUTCOUNT OP_EQUAL \n OP_UNTIL \n OP_DROP\n OP_HASH256\n OP_ELSE\n OP_3 OP_PICK <0x0200> OP_EQUAL\n OP_IF\n <0> <32> OP_NUM2BIN\n OP_ELSE\n OP_3 OP_PICK <0x0300> OP_EQUAL\n OP_IF\n OP_INPUTINDEX OP_TXOUTPUTCOUNT OP_LESSTHAN\n OP_IF\n OP_INPUTINDEX OP_OUTPUTVALUE <8> OP_NUM2BIN //uint64(value)\n \n /* lockingBytecodeField */\n <>\n OP_INPUTINDEX OP_OUTPUTTOKENCATEGORY\n OP_IF\n <0xef> OP_CAT //Token prefix\n \n OP_INPUTINDEX OP_OUTPUTTOKENCATEGORY <32> OP_SPLIT OP_DROP //prefix+category\n OP_CAT\n /* tokenBitfield */\n OP_INPUTINDEX OP_OUTPUTTOKENAMOUNT OP_0 OP_EQUAL OP_IF <0x20> OP_ELSE <0x00> OP_ENDIF //HAS_NFT\n OP_INPUTINDEX OP_OUTPUTTOKENCOMMITMENT OP_IF <0x40> OP_ELSE <0x00> OP_ENDIF //HAS_COMMITMENT_LENGTH\n OP_OR\n OP_INPUTINDEX OP_OUTPUTTOKENAMOUNT OP_0 OP_GREATERTHAN OP_IF <0x10> OP_ELSE <0x00> OP_ENDIF //HAS_AMOUNT\n OP_OR\n OP_INPUTINDEX OP_OUTPUTTOKENCATEGORY <32> OP_SPLIT OP_NIP <1> OP_NUM2BIN //capabilityInt\n OP_OR\n /* end tokenBitfield */ \n OP_CAT\n OP_INPUTINDEX OP_OUTPUTTOKENCOMMITMENT OP_DUP OP_IF OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT OP_ELSE OP_DROP <> OP_ENDIF //varint(commitment.length) || commitment\n OP_CAT\n OP_INPUTINDEX OP_OUTPUTTOKENAMOUNT OP_DUP OP_IF <0x04> OP_INVOKE OP_ELSE OP_DROP <> OP_ENDIF //compact_uint(token amount)\n OP_CAT\n OP_ELSE\n OP_ENDIF\n OP_INPUTINDEX OP_OUTPUTBYTECODE //bytecode\n OP_CAT \n /* end lockingBytecodeField */\n\n OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //compact_uint(lockingBytecodeField.length) || lockingBytecodeField\n OP_CAT //uint64(value) || compact_uint(lockingBytecodeField.length) || lockingBytecodeField \n OP_HASH256\n OP_ELSE\n <0> <32> OP_NUM2BIN\n OP_ENDIF\n OP_ELSE\n OP_0 OP_VERIFY\n OP_ENDIF\n OP_ENDIF\n OP_ENDIF\n OP_CAT // append hashOutputs\n\nOP_TXLOCKTIME <0x05> OP_INVOKE // uint4(nLocktime)\nOP_CAT\n\nOP_NIP OP_NIP OP_NIP\nOP_SWAP <0x05> OP_INVOKE //uint4(sighash)\nOP_CAT\n\nOP_HASH256"
},
"affine_scalar_multiply": {
"lockingType": "p2sh20",
"name": "Affine Scalar Multiply",
"script": "<\n //JacobianDouble(z,y,x)\n OP_2DUP //Y, X\n OP_0 OP_EQUAL //X == 0\n OP_SWAP OP_DUP //Y\n OP_0 OP_EQUAL //Y == 0\n OP_ROT //Y, X==0, Y==0\n OP_BOOLAND //Y, X==0 && Y==0\n OP_SWAP //X==0 && Y==0, Y\n OP_0 OP_EQUAL //X==0 && Y==0, Y == 0\n OP_BOOLOR //(X==0 && Y==0) || Y == 0\n OP_IF //X == 0 && Y == 0 (Infinity) || Y==0\n OP_2DROP //Y2, X2\n OP_DROP\n <0>\n <0>\n OP_ELSE\n OP_DUP //X\n OP_DUP OP_MUL //X, X^2\n OP_3 OP_MUL //num = 3X^2\n OP_3 OP_SUB //num = 3X^2 - 3\n OP_DEPTH OP_1SUB OP_PICK OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\n\n OP_2 OP_PICK //Y\n OP_DUP OP_ADD //den = 2Y\n \n //(den * den inv) % p === 1\n OP_4 OP_ROLL //den inv\n OP_SWAP //den\n OP_OVER //den inv\n OP_MUL //(den * den inv)\n OP_DEPTH OP_1SUB OP_PICK OP_MOD\n OP_1 OP_EQUALVERIFY //(den * den inv) % p === 1\n\n OP_MUL //lamda = (num * den inv)\n OP_DEPTH OP_1SUB OP_PICK OP_MOD\n \n OP_DUP //lamda\n OP_DUP OP_MUL //lamda, lamda^2 (could mod now if we full mod later)\n OP_2 OP_PICK //X\n OP_DUP OP_ADD //2X\n OP_SUB //X3 = lamda^2 - 2X\n OP_DEPTH OP_1SUB OP_PICK OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\n\n OP_ROT //X\n OP_OVER //X, X3\n OP_SUB //X - X3\n OP_ROT //lamda\n OP_MUL //lamda * (X-X3)\n OP_ROT //Y\n OP_SUB //Y3 = lambda * (X-X3) - Y\n OP_DEPTH OP_1SUB OP_PICK OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\n\n OP_SWAP\n OP_ENDIF\n> <0x02> OP_DEFINE\n<\n OP_2DUP //Y1, X1\n OP_0 OP_EQUAL //X1 == 0\n OP_SWAP //Y1\n OP_0 OP_EQUAL //Y1 == 0\n OP_BOOLAND\n OP_IF //X1 == 0 && Y1 == 0 (Infinity)\n OP_2DROP //Y2, X2\n OP_ROT //dx inv\n OP_DROP\n OP_ELSE\n OP_2SWAP //Y2, X2\n OP_2DUP\n OP_0 OP_EQUAL //X2 == 0\n OP_SWAP //Y2\n OP_0 OP_EQUAL //Y2 == 0\n OP_BOOLAND\n OP_IF //X2 == 0 && Y2 == 0 (Infinity)\n OP_2DROP\n OP_ROT //dx inv\n OP_DROP\n OP_ELSE\n OP_2SWAP //Y2, X2, Y1, X1\n OP_DUP //X1\n OP_3 OP_PICK //X2\n OP_EQUAL //X1 == X2\n OP_IF\n OP_OVER //Y1\n OP_4 OP_PICK //Y2\n OP_EQUAL //Y1 == Y2\n OP_IF \n //Affine Double\n OP_2DROP\n \n OP_ELSE\n //Inverses (Return Infinite)\n OP_2DROP\n OP_2DROP\n OP_DROP\n <0>\n <0>\n OP_ENDIF\n OP_ELSE\n OP_OVER //Y1\n OP_4 OP_ROLL //Y2\n OP_SWAP //Y2, Y1\n OP_SUB //dy=Y2 - Y1\n OP_DEPTH OP_1SUB OP_PICK OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\n \n OP_3 OP_PICK //X2\n OP_2 OP_PICK //X1\n OP_SUB //dx=X2 - X1\n OP_DEPTH OP_1SUB OP_PICK OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\n \n //(a * inv) % p === 1\n OP_5 OP_ROLL //dx inv\n OP_SWAP //dx\n OP_OVER //dx inv\n OP_MUL //(dx * dx inv)\n OP_DEPTH OP_1SUB OP_PICK OP_MOD\n OP_1 OP_EQUALVERIFY //(a * inv) % p === 1\n\n OP_MUL //lamda = (dx inv * dy) % p\n OP_DEPTH OP_1SUB OP_PICK OP_MOD\n\n OP_DUP //lamda\n OP_DUP OP_MUL //lamda, lamda^2 (could mod now if we full mod later)\n OP_2 OP_PICK //X1\n OP_SUB //lamda^2 - X1 \n OP_4 OP_ROLL //X2\n OP_SUB //X3 = lamda^2 - X1 - X2\n OP_DEPTH OP_1SUB OP_PICK OP_MOD\n\n OP_ROT //X1\n OP_OVER //X1, X3\n OP_SUB //X1 - X3\n OP_ROT //lamda\n OP_MUL //lamda * (X1-X3)\n OP_ROT //Y1\n OP_SUB //Y3 = lambda * (X1-X3) - Y1\n OP_DEPTH OP_1SUB OP_PICK OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_ADD OP_ELSE OP_NIP OP_ENDIF\n\n OP_SWAP\n OP_ENDIF\n OP_ENDIF\n OP_ENDIF\n> <0x03> OP_DEFINE\n\nOP_DEPTH OP_11 OP_EQUALVERIFY //Verify stack\nOP_4 OP_PICK OP_SHA256 OP_EQUALVERIFY //Verify G Table\nOP_4 OP_PICK OP_SHA256 OP_EQUALVERIFY //Verify P Table\n\nOP_2DUP OP_0 OP_EQUAL OP_SWAP OP_0 OP_EQUAL OP_BOOLAND //u1 == 0 && u2 == 0\nOP_IF\n //Return infinite point\n OP_2DROP OP_2DROP OP_2DROP\n <0>\n <0x01>\n <0x01>\nOP_ELSE\n <115792089210356248762697446949407573530086143415290314195533631308867097853951> //CURVE.P\n <115792089210356248762697446949407573529996955224135760342422259061068512044369> //CURVE.N\n\n OP_2ROT OP_2ROT\n\n OP_SIZE <8> OP_MUL //u1.bitLen\n OP_3 OP_ADD OP_4 OP_DIV\n OP_ROT OP_SIZE <8> OP_MUL //u2.bitLen\n OP_3 OP_ADD OP_4 OP_DIV\n OP_2SWAP\n\n OP_12 OP_ROLL //startIndex\n OP_12 OP_ROLL OP_TOALTSTACK //endIndex\n\n OP_DUP OP_NOTIF //!startIndex\n OP_DROP\n OP_DUP OP_3 OP_PICK //(u1WindowSize, u2WindowSize)\n OP_MAX //maxWindowSize\n OP_1SUB //i = maxByteSize - 1\n OP_ENDIF\n OP_TOALTSTACK\n\n OP_8 OP_ROLL //inverses\n OP_10 OP_ROLL //intermediate y\n OP_10 OP_ROLL //intermediate x\n\n //(Table(P), u2, u2.windowSize, u1, u1.windowSize, inverses, Py, Px)\n OP_BEGIN\n OP_ROT <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n <0x02> OP_INVOKE //double\n OP_ROT <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n <0x02> OP_INVOKE //double\n OP_ROT <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n <0x02> OP_INVOKE //double\n OP_ROT <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n <0x02> OP_INVOKE //double\n\n OP_FROMALTSTACK OP_DUP //i\n OP_5 OP_PICK //u1.windowSize\n OP_LESSTHAN //i < u1.windowSize\n OP_IF\n OP_5 OP_PICK //k1Abs\n OP_OVER //i\n //GetWindow(k,i)\n OP_4 OP_MUL //4i\n OP_RSHIFTNUM //k >> 4i\n OP_DUP OP_0NOTEQUAL\n OP_IF \n OP_SIZE <15> OP_SWAP OP_NUM2BIN //0xf (in same byte len size) 2^x - 1\n OP_AND //(k >> 4i) & 0xf\n OP_BIN2NUM //Window\n OP_ENDIF\n OP_DUP OP_0NOTEQUAL //window1 != 0\n OP_IF\n // GetTableEntry(window)\n OP_1SUB <66> OP_MUL\n OP_DEPTH OP_4 OP_SUB OP_PICK \n OP_SWAP OP_SPLIT OP_NIP <66> OP_SPLIT OP_DROP \n <33> OP_SPLIT OP_BIN2NUM OP_SWAP OP_BIN2NUM\n OP_5 OP_ROLL <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n OP_6 OP_ROLL //Py\n OP_6 OP_ROLL //Px\n\n <0x03> OP_INVOKE //MixedAdd(P2y, P2x, Py, Px)\n OP_ELSE\n OP_DROP\n OP_SWAP OP_2SWAP OP_ROT\n OP_ENDIF\n OP_ELSE\n OP_SWAP OP_2SWAP OP_ROT\n OP_ENDIF\n\n OP_3 OP_PICK //i\n OP_7 OP_PICK //k2Abs.windowSize\n OP_LESSTHAN //i < k2Abs.windowSize\n OP_IF\n OP_7 OP_PICK //k2Abs\n OP_4 OP_PICK //i\n //GetWindow(k,i)\n OP_4 OP_MUL //4i\n OP_RSHIFTNUM //k >> 4i\n OP_DUP OP_0NOTEQUAL\n OP_IF \n OP_SIZE <15> OP_SWAP OP_NUM2BIN //0xf (in same byte len size) 2^x - 1\n OP_AND //(k >> 4i) & 0xf\n OP_BIN2NUM //Window\n OP_ENDIF\n OP_DUP OP_0NOTEQUAL //window2 != 0\n OP_IF\n // GetTableEntry(window)\n OP_1SUB <66> OP_MUL\n OP_DEPTH OP_3 OP_SUB OP_PICK \n OP_SWAP OP_SPLIT OP_NIP <66> OP_SPLIT OP_DROP \n <33> OP_SPLIT OP_BIN2NUM OP_SWAP OP_BIN2NUM\n OP_4 OP_ROLL <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n OP_5 OP_ROLL //Py\n OP_5 OP_ROLL //Px\n\n <0x03> OP_INVOKE //MixedAdd(P2y, P2x, Py, Px)\n OP_ELSE\n OP_DROP\n OP_ENDIF\n OP_ENDIF\n \n OP_FROMALTSTACK OP_DUP OP_TOALTSTACK //endIndex\n OP_4 OP_ROLL //i\n OP_1SUB //i - 1\n OP_DUP OP_TOALTSTACK OP_DUP OP_0 OP_LESSTHAN\n OP_ROT OP_ROT \n OP_GREATERTHAN \n OP_BOOLOR\n OP_UNTIL\nOP_ENDIF\n\nOP_FROMALTSTACK OP_FROMALTSTACK OP_2DROP\nOP_TOALTSTACK OP_TOALTSTACK\nOP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_DROP\nOP_FROMALTSTACK OP_FROMALTSTACK"
}
},
"supported": [
"BCH_2026_05",
"BCH_SPEC"
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment