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/22a3359360c93695bc8c5ebfbfa28c9a to your computer and use it in GitHub Desktop.

Select an option

Save SahidMiller/22a3359360c93695bc8c5ebfbfa28c9a 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": "Secp256k1 Verification",
"entities": {
"signature_data": {
"description": "",
"name": "Signature Data",
"variables": {
"table_p": {
"description": "",
"name": "",
"type": "AddressData"
},
"table_g": {
"description": "",
"name": "",
"type": "AddressData"
},
"compressed_key": {
"description": "",
"name": "",
"type": "AddressData"
},
"table_g_hash": {
"description": "",
"name": "",
"type": "AddressData"
},
"table_p_hash": {
"description": "",
"name": "",
"type": "AddressData"
},
"signature": {
"description": "",
"name": "",
"type": "AddressData"
},
"ep_inverses": {
"description": "",
"name": "",
"type": "AddressData"
},
"sg_inverses": {
"description": "",
"name": "",
"type": "AddressData"
},
"e_k1": {
"description": "",
"name": "",
"type": "AddressData"
},
"e_k2": {
"description": "",
"name": "",
"type": "AddressData"
},
"s_k1": {
"description": "",
"name": "",
"type": "AddressData"
},
"s_k2": {
"description": "",
"name": "",
"type": "AddressData"
},
"sg_plus_ep_inverse": {
"description": "",
"name": "",
"type": "AddressData"
},
"ep_result": {
"description": "",
"name": "",
"type": "AddressData"
}
}
}
},
"scenarios": {
"base": {
"data": {
"bytecode": {
"table_p": "<0xe16d35740c8a4a467824f7f9200ec630d8bc38b54a7c6873542c69c85945426000abde6c6b6787d4b1e987a4cefddf3e0ebf404ff75dcafa3c2450db561a05a01500006cb4b20e0a16772e06e57f1255802d49882440c999d1b041ef1c7e9f72135300f2a23b9ec4336899dcd72d52284e973c427c03cd4cc828e1ef83d844b4e6dcab006bc64331ac2c444f63b0a75a0398a8635ae0e6e1f5444d7fb127aad28dba3cc600f8b688b882595fe42e1f2f212c512258b69911148fa2c2aacad25f6242002048001146d01362bf9d9df1b4b6f460583af30038e4133f4319407a970161ac27b135002cb0e2fcfbcfd6b8781ecd8bd3913bf2bce730ea189ebcf260dc9148f47119ac00354c7e3e5c3f39607ecd79c76aa61b4fb58684504c07f64bc0c4309fdd7ccb4800290adf8a09f2ab0930fcbadf62f13c3fca9bd894871047a6aa0683c7ef0a667a0089f09781cc1d7a2691d4428c22ccda58f1c7461112d6a6efbb20fc6456a1457c0087d0a984b3ba09ce8b6e9a588a907f04aa50011db0bdbdcbfd33e49da328180200b729fd7cc7d6ba8a437e25baa2d976280a5aaea91d5203cb2d26c1669892ae510029809894840ada5efc8428b14a12f20f725573b8a369e76b9514028b18397cea00f9881fb958248daeb134ef755cd381901b907d918ba01811f4799abae31296c700e86a1a2a6ae1957d982a6eedf2de738c68e5e6b29d07d0cea5dc2d2625281b7600ccd71c14db69fbcb7c76955f55fd619ca65ec0b8a7cd151cb45f70817dba5619005598f3d183c024dd726d1cb5548195c183572df51ecac8668b8f8f60581c3a49009d78ec7c2ec386c40afae985932458f9fe326752bd0019f072b6db65a194b364007aa4a14594fae4d1445a3e10b6b6727914976e8bc99bdb9d198bb28e9dd1422a009deb13cd74e815a0c311339478a3200b812a5910dec262c30aca37161b744e8100709b1708054d80f54c080667fcd626fe1d8dd654c024b0058a10b77fde79ee7400f7e9c91b2ae16dd3947411dc1153462994544370546c0145134fa72f25f3ab2500c87d46da5c2b1ff1797ad906f60ed0b5a9ca892249a984bc8832faf2bf9110b30078016888163bdc435edb87f5be0f2a260e76cb5567a90a95a66c9a6e7d3bb5e500e8b8234e30c6a917ad6be4a88cd2228ec5a589bac5f024bb8a8ecf5864b6066b00452e4b52e57bcad171df17800f3abe0d34393047a23a0ea15272988aa4aa2a0a006b284252019b66357d1bc11f1c7b5ca03cc7fe6bcc9cf91d5eaa38a52369affd0054c3d5218b20eb49da1165f19b3b9686a116338c500a6c244a12004a6f60950a009ce028f40fb55864de64cb01b882b067cd073744ea2a8de39a14d3fdad653a7f00>",
"table_p_hash": "<0xc552883b2b0ed9a373e1673801d5190f5d74ef2cb5035eafc57de88ea3508fbd>",
"table_g": "<0x9817f8165b81f259d928ce2ddbfc9b02070b87ce9562a055acbbdcf97e66be7900b8d410fb8fd0479c195485a648b417fda808110efcfba45d65c4a32677da3a4800e59e705cb909acaba73cef8c4b8e775cd87cc0956e4045306d7ded41947f04c6002ae5cf50a9316423e1d066326532f6f7eeea6c461984c5a339c33da6fe68e11a00f936e0bc13f10186b0996f8345c831b529529df8854f344910c35892018a30f90072e6b88475fdb96c1b23c23499a9006556f3372ae637e30f14e82d630f7b8f380013cdc4e8ab94fa748475e00e90136ccc04140b9304491e58f3800dc1f1db93e40022997347dc7be9cf40febdbf33ae67d94814a58e09e24256b755d4a03e99ed5100e4ef40b269d5a8cbb79a61dcbd848be828515c0a25a7b4559320071a4dde8b2f00d662aca63a7da8dc40680dab1b2788f726c4c9a6dda9dbd4d6e3e5362622acd80056752960147a052f8ba168852f47f682d3355235143a4520a4ee5e75d57bf9ff0097f275b0360c873ca0e48f51f6f080de60c5457f0196bef320b6fbac7a7712ae00bcf9c4caeddd2be99ce330037e9b413d0e7aeaf265f398a3eab45d6e64f0bd5c00da647208282608a5b5e7fd13b8d013a8db541a866d8d17a3605925ba40caeb6a00012a0ae1f34e78678a88afe505dd1b0a2f3c0fb73f84f3af1d35ca5ce1e5012f0004e9bd6cb72cdab517765bbad613e2c2b4132d132a083d2949995341a7a84d5c00becc27fc0d115fc314e7574c979697e0bd9a559f8a17ad0953f6c7f0e284d4ac00379c4fc62a26cc050f8e5f37a488d8ade9613b7671093864fdd9a7b0218933cc00c747e2472a8ea652b7c243199bd442345daee61a7b7c473562c8f3479e4d43a000d76873033be5be3c59a177d82e4c796f694ca293e6c7b6a327bc195442ba3a8900cb08a05d8917ecbb9178c1e50b984956ac5ac6706b24f45e1e41a958f8e74a77001bc653c9c9741d30a8d6f9dfe2b12d3765b3b7d756dd4302195e6beb32a084d9005ae8af7070f4b0c55b09209641f47c683346734d008fc3151b56e748d51511d000272306f4131b056b526da8d95d8c237915d87be13745b6a8d7e015c8fd4ff3a900a85a40198fdfeddecd580e61c6fb75b0518674c305d2d1c78b2875d9c27387f20081ed03db52cbb5291fa91f52da061a3a47afcd65eb128275890a888d2e90b00a00e423e8601a249be4e6498967637baa26328ed3077fe664fd9c715e899edf9f49005b3fa103d4405fc6bc953f7ac279424664d4b3a7e444f09051854eb5c4f6c2ca000e087ee2f8bcad449ef7853c6f94e53111f45f09e35a465a96ea437d4f4d92d700586ba2f69fdc04c5a5d396d82baf40eaef6dcc28c22e8483a6726ca872281e5800>",
"table_g_hash": "<0xc6cbad7e7f813295c00a2bcaefa011fabb439ffc5fb9c4b5202efe3f17aac3f3>",
"compressed_key": "<0x0360424559c8692c5473687c4ab538bcd830c60e20f9f72478464a8a0c74356de1>",
"signature": "<0x8317ed28da8314fbabbe8130ce0fc0587cc93c066865590b894b862c797150fcaeb8a9d4864ebf0f7c5fed960413de25c603604215f90e77422c4205d9e8d1b963>",
"e_k1": "<7864736307666366111784762752558699776>",
"e_k2": "<-73861540762074852686390990423319724226>",
"ep_inverses": "<0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c1f85df3bc64ebab5e37a99eb0c82b0faeafc7f6ed9f8b794c1c8049a768a00e6793fb1bd4182dcbea03bd13f0e17913b02823bce920b8259d4e1b0131a3a57003e83a1ec9c6c1b8f47305393b67e92071fe07321ff1a913d4dd3d93ef1bee7c0006bda85f0d1971ebf5d92bf89e531bf5ec1fafd4b27b79fce3d36b7ee9af80e4700b5cffd6f6b8212eb521c5af4ec132fa69cd360341f5ba002d24ed9cc694e0853008b5bcc34ae1551696b43343a08c24e5d2400dbb4b15f5b4cc2bcdf5b6ebaf305001290bc8ceb5899039c4a48a1ea39a45e12997f9fc7cb327fdef905fd9b32d1b800e8256a08fad2bb01a1ce8ec1d28e111181113bd837b22edb4912814174b2754d00465db3ce949297d2514aa0c4c25ccee66c35139951e7e5532c1e891f16c1cd410001e42c61aa92dbad7a7a5c56a7430d03b41c215072c9fd55cfee6b51c04f1bb700910a26bf5722781a432a1d2dd2ac2a04bf133183a7b616654746c555f73117590012e3cac236517fcbf82c87763c2f4a37c80fefa89d3853ac029f59f46311a597005c36aa4e1d4c8eaa0e9faca78ebc61def55019c3689c4c1f5584d92755a27fc10032e5fd576b7d5f46d5839c95aefc9db635509a89111cbcfc0c47623712ab8803009d2fef2d17d08954ab3d380c45d9f95502ad4758f01622842c69456d9106fe070063a6069bb40c401d356bf3bbf63874897f6bf77a1b8b18343bf9ef28922328200029fa3fffccabd9d04732d0a4bcfd68f1b2efb40a661c46875485f9e13894b3b500efc9b44dd4f13541696adcb46fae55fd415c344b948a6c0af4a3668bbf06beb000c8edcad845a87aaeee0c297456d12e63ca1c6ca19ffbd23ad46edce9b3ab8c570011a65995e901154daa1f91cfb6048b561b37a2eaf8dc570647653e6e4da5f85e0047bfa6d7feb9080ae6e0cee2d1be03b1783e1a5a2961af89e611fc6ae82c6ab300a026f545bd47e45bc2aa7f4d71f38e4d20a24488d7b28626e6799e50b92b25500006cb33f9d4d58064f56da06c70c6f83c814dec5d6b1d047e38adb87accaf7dad00ccd0597cc5ef79fd1822ffeb7852646beaad6a97747c4649fa77d189f2654440004da6fa4994c18dcd1aed534f3aba28f5aacfb7bfa156dcc6f1046d44e723ff3e0047b4c6a7bac238062984a192111afc106863c3a56d922352adb32787b38c891300496303e6b54ec5e08ca3e12e3ca171003b2065a6bc6358ac8523696509850b3600773cc23a94d6b4ff48576e27ab1037eb3e5bfc335b6376a8dbd460ecb081643100a82b3deeb51df8e8eb0fb1fb7c57f3dca13c7658f04e3c81a67df1ca213e5144000f4ff385c951c50c12aa1d838cd3afccc0df60a8436c3bf557721c1cbaee7cb500009af2c98d55b64489e1e6a3feb1b5a3d060588e4888bc8d4eab454018604ae900a1a40ed6ecbe6e7f58c27e616bffc95cfabd4c16fe03034e9d8c8334d14163ea00245c82bd9dac9a2acb1c68057666f67118e695a23d2aa0530ad3b0d3c8dc862e006d6768bd9b072da8523dc0584242f0196fa20c308b234e7604649af9ce867af700cf913acddc6677d2377f46b21ee0af459ddfbcfeb303bb4be00f31d006536694002ddceed3b0cd2290fa3ba85f36ee80a668c1d2f82f9ab64147335800201ba7cd00bc7a88d5bb175474bc90872f6e1dd252b73ad36c3544bafe243438655ec741f700fa41a1d5dffa782588bd12d9bcada0059896f6b77ab0c5825c86370f1ad019ef00908f31a2d083c4f0fc0298d57dd8cf72b1b4075b6d88c0cf8b906ee6b637519000fbf64697601efb87f0a462eca79e2a8b1fdbbcbd40d138a9128e93b21a73db31004043b626ecd98e9a662b30030bb5bec601b6d2a5737db82d0385f107ace43973009fd9d8183c2429a93b979ad046e683844f61e0005e3c744eebe3573b424f578900333953b351aa4813d6ffc2349b797df5f5fed1373b5ffe583efe63e1c6f3ad3c00f3bf0d4f751dcb068fc3c82e073c3c150ceddd0eec2739ca2ac3ef030a439d240065d6f8c5c823c011525e0b13950c7ad5a4a2983a99d75115f3d912840e4a21be006f778dc6208b9a918281e9b07386acd40b61d4de20f7c337d6d1cce588e0befc00654a2b191887749c805d42acbdffc44fbf91337810095efc72a6d867dccd586f00f786e1aff5bccb66ba419841210518eb533cd197d1d2ecb86f89cdefa108d4be000003307dc2e03c2a3fdb2fe9bf0a578945a4b206e8126516391bcd27c7a46daa001e4d83af82f51227faf7a03bce10f65adca6d368c0339c4aebdf6510ba85b14200465847454eddca5c9fa7b188f8c23a3306e21acd9f23a246471062dbd5c7705000b9871b5c54d19e6adf989a9eb3b6414457eb74ab312f86b897ce3ede76de6a2f007d295e5a85f9da319cf1ed84431c78ef4772c03b6ae633da7f6efe594d3e7c3e0065d36e24de464c65a4aac257377e8d6f2734500d35ab0119748c29bbfd321f1f0098ecbccbc604c090ca39b5d3276bc4331d07d522d4d45a94aca874fd828c005d00459dd2ba1ad55e76325d31acd14d6efaf9653240dccb7dd821cd4f84bb8b5e9f007c90bac3d884a7ac106b12c7092911dbddc4db0a96b0aba289288b2f3d818eb900e3a9d490fa9a514143da258a099b4bb99d65c3f9ec14dd8980b3f91e784d9ec500e315aa7c78e563a0a372a84134f7ecf275e35f15baf2cbff8eb237a09bee3d770098f271a3e3802eaf7524714b8c2005b63f024cb808984a6ca40981c4cf37e4ad00c6d2e8734828691259fbe32fdcdbf5cd036247822624c78f6d6c4f8bd5c1e246002325c5867fc6a5658142991b7ff5d86ac56bcc058beaf46227c92b0e38b06d5f006b9d41fa70081fae6f8e035607c75ee2ce1bee3bf9be4e0d510a18fe32a62b02003fcdd9cccb09bae23ffa508d076b34cabfb2bb46fe87bde6202bb8ba24820b2b004889172c914392f574cb5e876c310838ea837a19ead601158bc90402109c8fed008a61ca45137f5420f21a30c85b587450cca8e050905bac2f7782c4e1e10ed1630048324278b0ffdbe16545b9cd551c37319d895a5f5939be258e889dfac86f5457004a865867aba18ac5f5891c07d566f823685cdb9fc7c49c75d4a5f82c30615a7e00695bc9bc8b66c39a8bd9ca4c352a04d24ca8537e8069d49d9d0241b88bb5f625006b24d6d4fcd2004f64985b356eef9df425211aabb6edc7a0d461264654719c3000eb017663d2273d1f608eb852479bdd83b4563c0c1c6a7d83a01f4211d3418cc9005670bb95deb692a08d8949dabda24ebd85ad862bcdd83de34b0b3869e4c7c42200dbf82392670b180436504b8b8a19865b5641140e8bb4390d3c2d11cb8b656f8d007b74c1fdc542fac5f08e372f7f2cd8934d1b9c0932b04592bf343a6d18f57a0c0017d2d208cedca97eadd513e474f7f949c16d57dd4ebb915a86ce16bc9a0580c6009a2f7389a91945ecbf2df041be132e6f00906600d3bb2d770540f53516d2b49b003d3acdcd9171c64cbc7ce03a9e5b0c939c11e262a9bef55333010bd76a453dec009281d4d1ea09c638b0c7099d1a7e1baed23855b6b1d31da86825ced644c0224400334014d7d97181e52f877badd24e5743f43fbae3cb7333b7c24c9d9a1c486c5800720f28f0f23d206fe805a7f2f8214f32a3f1a962cafd4745021ec76d1512e07f00a3b83006cee7650193f0702c83ce4cf6fb8599020bb62b6876b09d4eefd7d67c00660dff252495e60aef76b193c9a11f3c124469aa35c224909a5ab1d00d28fbf6005bfca3b1aea941e9190faa4fab33edc99e636c978b1ea791de93028643d843c800ad5a961f0f6db67dd51c58b0d39051b4b46672f6c0d6f1791601fb67e6e5ea5a00adf4f73a13d827a5d949cdda0f6027236a7434d7a1dafc39e6c061f885dbb87000aa3010590516ffd7bb2feb819b6578d0c41123c99ec75bfae53317335fe5587a00c6589912a7cbc9b5e4ed7fa603755c44b00a63f9d94828b4c8e9a8b27a484ba0000e35e43e08c006cebe8d931c80705c87ecba5b7d413a230536ecd1a821d3337a0028b1f04e62e931ef738d34f8a2f1f7af957e5f7bd18fc57a597c19271f05b1e7008c2fc4281d796c544c91fc8122ab53565b5220ce84adbd95f269b26ffb99e5690076a30f93fec01a6a9f7dc3d7ce94dec1c843ebbca16efba212192c5f71f7dbe200448b3cc1b0782a9296fa87b6e4d917c73bb1e3c9fe527780d7bc3bc7fd47da3f0047ada434ebce667e8e9aaf7b3570f8819302813cf235e2d439b431a8dc002f580061289c93f0f12dd298b36aa5f7e07950131467b6868bd2ad8f0a503164cef0c200ab7224cd155c52cbe32deec91fb2eb4221d0a05a3d0910e8b03996ae6a192c1500bcc3565a6ee077ab6575655aca568a843a0fdf46302064b74517d0c4629d1f820021b7f1ccbdbb21626eb50db67cedaabfc43ae5b418662bc05931048ff21067a000c15096bc69e5d3cabc198a2ee2146c9115fe8e51d131f2ddca9170a0f486c64700c0966168e0964923539b23da3a571cc7e69c4e7e0dad9d7e0c92d87010df520f00217969c94a642eaf666e4e266c03d09947a006d59594ec04ab0dd7dc543d560d00abdfee3660418359416b9e99fb97729bcd2ff98f5c7785142038061bbb6f26d300221482b92cdf8284a96585adece4e9b05d66344679d052bf88e4af479ef5992000da6db96b7dfc8b10196d32c4291cf7917cd38faf3b126888e0cf622be9ec11570031ed308205a4c937fd451f5635f1c1518fd7b4997f4fb542d220d2b5dac9b08a006adadaf342e3551a7d9501abd13a80e29d4d5f70993649468f2754c7e525898c00de83634951d457e50d4e2f4f144ab8c314edc03fcce9a6dc5cc13fc1a63ab74a00e57ab662bfe5e855ace3f56108b4b5ad17355fb547199a70d9dd355311c970d400b65ae42e42aa9700419dc5cf13d1299fcf39e26b857782e1ce2c9144379734bf00753188a63005bf861407015d403b2677991cc07fc5ff31bf44f9d8386f75814b005cd38a6a563d03b1321b07b40e2e4043ffc96a4160b0668c4ced5090d31a666f00ffd0ab0d1ffceec315d94170319ea4ba1900462736f3aa3f7007be2b54711db000da8b7b22e591edc70afe6412f16b4d09a3df4e420794873e6816a72155df56c100182305e6b75c891c28c6d7064cd555351017cef7162a30d2a0ef2ca5fde901a900505b0b2c6f6a371dfc5084846f2adf22b43e27a52f03a115bb9932d69f7db8e90002036695c641991800228e5d69c12c3139b3dc08c9322a0fb4a64e84b3a6e9e10041075d35a9bacf4e813bd79a4a179a7bfe8fefc52eda6e27fde6026eee57876300da0f87e53fd754689c4aaa2006c06cd00939ca66580130a91c262e8bd8588b20003f098518fb2ba8945bc2cfe2245563a201cb6f7ec93c6d8f6eb0c6fec8c0645d00840266d797957c744f730533dc5a3197c1a17247998467be7dde0cff68c2715f006d751135852fd16036025018dcb162da3a78d8196cc171ba3ba4d8572f6e1894000affd087a5da904874a0c71f22961a929df8c0ee5a1fa290c113226a12eb9ba200ea24a137492729c457bd15654c07235473a241dc16eb632fbb1529d564ee4dce00cf33392e9b007b28bb0f248ddd3725f7510c856a6d1657801767e67c224918e600c4d32dc5d6ac78396023e87e05f19743c695aa1e4d56dbdb1b9f18150355b8ea00a9ebb5c90abaa1ea869283bef299722f22a3c190bbcb43740c0495a3f549afd800ca80b7a4c6bf8a5874e875c080827fb19647066612a2b6caf704dd0ed839635200023ad9a3b280f13cadf82f205fd800d9ef6de23d5ba3427d5844aa0c98065d420024fbb237ea241cf7061c6d93f1bd6426803e2b591f5abe98188162ec2f3c9a6b0029c1635de203d821b30806415929d6a18375b5282423696fb65ee54b626c76a5001f95125dda192b11f961da37c0fff0ef36e7d54617132279c0a65fbcf70e635100c888d57a589574087a1e299f5d9dababf6477f6c9066061772228ee76a01b2fa00c92036c4056e11b76e56fbab9e438945d873bd8d17c7ee95c4a04271e4d8231900555042eaca34ddc317e7062a1a99cfc8a73c7ee19a530b29f860ffc767002e54005b2cf37105779db5f8c197b4ed13b1cd1e9f74c631a38cefccf1a29e2ab4367e0099baff62f1a6a0dbe7c8fd8815b5f44b7402356134010a9243c0a713c2ac87730018c565e2a3efc5aabd607c967894eacf9c73c8f38ceba2fd82c2ff9a1da793ac00ec81097761f7c1985dc805f835884dc123f76b797e2a773b78debb22ce8ce3d700db4f6a8f40d89a3dba4b2acd04c79ea19c88e093c6e983557c545d97ada9dc830079576267bb29a2a9eb7bec012a8ceb61dbed5a11bc36a574a1832e08836e918a009ff728f3003eda7d2f94a9031522187757cb67f7ee309954ac331e79b6c3baf700363cee9f24cd9d94592cb99604835b05dc844a3ce1c2a782699504cbe230cabd00f6e28a93950e3aa3618ceb7c537c8fb88e25118720b312307fb2872f891e4e8d0019e7419156bfd258d0e2e77e6b8894c354ef66cd09619b1511c81bd87b7dfc3900ba06afaa04fdfec124ef976295076b9c8439850978866be1f7206e6cc3b96cf100bd5772754b64a4e5ba073c0007586e01bc3bc8ad1a86a1493d54ad6f53dab1ea00828780ea0dd028870b3bec09bebda24271810ad6b5dcefa6a2055afc0f4dec0b00de4f321d98f45ec14616b2f2add4c92dfb11494368952455c075a50852635695001b046dbd593c941be6fc2ec7bd8bd8355a2aefcab716af331d6c101557647a6500a0d7040cab31ac75fb14ec8ff70148745f9d564fbe38637cdb5f402bbfd5067a006715339bbd9f7240da23d391ba446d02810a4a71f8fdb4e3663877b93433bcad0042b9039fa7928e6b80bb6a5f956b0bb48fa014c744c3f022453185e80418c4d800a3b0d7314b10ee2beef40d4fc35f3496225749acd82c7c2b094fe81e3ee0746b0060274243bbf1f3e7551940105a5a7b8e85e3f1661222a23d41eb278c65a2c2d400fbf41dfb64752f8f2de21153c410809b6db2de864b5870192f1f6b2cda777821006804035415ece34ff28251bb99849a2e383a71229e8836fc9ecbc3c661ef452e00b60144c7b2df7c713be37f2f057d07fc82bbb7ec9695f3035665a5f2eb5fcc7300b959677435f0904dd794b033c598b89e7e97b2f4c7fd701b761082d037758ae800ee3b9a347081940d2683ce4c24320516f08f8de8955ca9b3d3fa1c66893ab9c6003ae2509f868da2865b29142b83a7b9673b9ba46247c545dc9175b9fb229a0144008ae75f5e489916732b896cfb6ce7be53f7c362af751da91e836088b3d6d9ab1a0000acbb693f602982bce7b9fc17a33f5535fe7277a829bc51de90f6e696f50e8600d9ceeadae26996f76ffa3eae14b7ae0fe7b9658518e7c457a1a416bf4e41fd1c006f2a1797d5031cb0b010c68fbbd8458ef7ec0c15329f2e65cee59be9df6e65660006e48d3fca8ec087840aa575859b736a01f8bace249884c0e1100bf9804bc49a003f8e5d41f92b118cd369f08a2d7497aea3b76bafbc9a7c278542cf993aba50f3005b78cc2c19cb9a8eaa8640e3d2ae6b067263811347bc8363e84595bdd99fbfb400e7c3fffd177d90bec1ce3dc320f7382b25a36c88a6406ffe3a35b654ee6c535800346270e0b6338b95f891bfaac109486815a19b714a6d77d74459746e02743d1600830ac06ec1d06b096ec36c2942d0cf9b0ac650455e00a415718b67ee150536a00074a1e60f3899df3438cf3d16f664895cafe4257d07702a995842517a1d2f8f6f00d788a4411d1230cdad79ff522d8f201e46c12257638d69bec4d9beaa2a4b4cd70052f1bbeedcf705f43caa68e6b68734de4795cc7566ef7fd444d52f3be8afd699007a2ebe282f8f120e68675bc5d671fc74e751c23312e0db0d37e00dafd4a1d10c00506d595315938c77c71de67d4dae66e6802fdb14fe829ce9c83ee2ddbc9398a700de26794b46c99e16d8d6b559995178829eafcd68a9d92e67e455e688afb8804600bfdd295a196f7c054004aebb1b7894a03a26c825713be97b88eb3e3a7fe2f18f005d89a9f3769e211e25118c0361fda5c040ffc4975d637621ff2d61d0663f241500689d5518fb905a1e232095f4d52e70b94985ca8d07936e9933ac900212a901430018ce6928f50e1b588d0a3cb2a56eafba1f8bc3accc3e776471aa1b26a44ef5b200>",
"s_k1": "<79285608344998451611419182734918732772>",
"s_k2": "<142793177962804809472589577301746160741>",
"sg_inverses": "<0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e2caff098d98bfc81c06efc48c505763dec04012257c624b6a487cf2b058a064009821262fc111fc0373dedd32881ad537b42780387f9830e6a6c0057aed114efc00a7d4ebf784985af0e6e4c27fb5c073a71b21df5d3dbe736e4619831fcd82d77d002f95a3b111e7dd8c6ad6acf38e0fbf05792e6cf4f377136e5a701d876713739100279bac30c75f1d882e00c34016d412bb07cf49c83f0f0f7767539788aac6644300b455406861632e645a1b342c6860c62ec92f35d19771fee863ab77fbf71c34ef006e5120c214bf316fb7935e67817e73cd46cb64416d50084a9af45fbb00b897c800881b22534fb317a4c858e1dc534c46581220153f6b11efb39c06f096259dece2006cb4e5d7860adade23def3e7feab477a3e36d345404f6a3687245047b8979a0b00628c1e86b869e405b8acbf1f3c4a9cc740fde7c9dd511e76fb0c343f11a671aa008eff43a462a8316670eebe6cf7601e1bc6bedcece92b01782f144f7333e2439e007695cd871731227583d1e5279f7672f94cf9666a2bcfada79435adb907ad6d9d00b5674d00b4ee25799ed1c6496649a49a16e2d49510802949edb853a9e0b19781005faa00d823e998874ceddbc2c2e21faa79346e5105841abf1019f54ecb5f429500507845efbbd362e0ef2b9a38762c0e03aa973febf0a5c3ddb53658dcecffdd10002de0ad35e7ec775dda69734b253d010439b9e69c75795795608a3fdf9f991685000b274693047d5d18a2cba13a1ce1797037414acf3ed600ebe4e25cb87e7f25ab0010e1be6a0dff0c586638bf80067a5e67aa179c1b27b4b3f8441fe7e97ad8ded00093fb83e7fb3f1adbbd0349715ee115e8117067b26391a8a419c0d6132938e4a000414952099c9c600ed8037d9127b036da635ef2c78738f78ed9ca91f5420ae72000656c8849cee7e13fc6c62d045a10c83e0ff09c6a19a088fb9b97a6b383bdd4e50097ee2c50600c13ba4e7514f0f1f2c5d8767475ffa5d0ccc26c69064f14ce966f00eed50411256b6b2eedcb6b20ed08e93b62f35d167f3774a0f79dea2ba7d5422600a62df173d6c702dd2a1b1fe69e67bf7a9166d2b941eb6c107f74de75e6809007006b93d78ce36541200ac3a3a55d9bdd65e555e659e329d6ae6baa8aff8f49d699001298d7ec69e06aeb36735b25b5883b5b24c8c8378b1214a34b9259707eb506ef008d7f70e041d50224a77022f0d0941100e147f4299a9501c78db18de89f85d145005885f9f0b834210693f043cb2dc6a3e6a0685093439e0138f6b840deffd9530500d0f009caac1c6ad86b723199cc529080168d1e54fb830121adde351d772688b200901a65d8cbce5b985d72a9605721cb2c395bdb00c570f3f9e62eb8f116cd315e0034641b4665e9cc60e55d3c08a7f0072be38351d938425b8d6c537dde882c063d00f96ef5a2db93b14fa201b0443a7e925e6a44d58276d66393b7b6baae7d8828c7008bb720ee970d285b615f7bc709e2515437ca17d482133ce2b63cfe292c386def00f992169a9dca130ffae042800445fd5a712fe804641a72a6fc612e186b49eec0005f0c182170d9fd8733fb033a36b1096a75b31f20fe75adc3b49bb42d3e58f495003146e566fe4b3b03e8bf6277acead68107f82cfa4615d381465a24a50323266d00303ade6c077054102b89cf75ff8debbbad7584806227fd28e5031919604d7d170077404b4cf1da833255fa86a525a35d395688e3b526f5fff70b3863acf9e7938d0093ced94a42236276dc09ec11ec2e4765870b496d8a1d07cb1003612cdd03befe0085c8c3749cbca1a114b6a916ad4514abaf8dad2f4e718abe19d8c1319d1a9721003d5557c51e1d27c699951d760a5b923f153a537f3f43272ee5ce3a9ecf05105900236948e4e0b5b3d838137f76746b3b3405e2134cc33d510d5ca96ad5cd00e1d100513838284c9764deb9101ab540175eb5be994fd2c0d57e804e4a6bec5f5eb1bf00860b6dcbcd67ac811247d02c9a12326aca43ac51b0c8bf13a614bbd59f95a944001e95971c4c898921927805ccc2b0073c9914d374a412c984a8ab14fab219692b0029d4b817d10b303fc22b0df18a16dfa768e90f1c13a99a0cb653148d7d48e80e0076d38b84b80d55c71cd8ecdea0288104f07892368a44c6a50b37875ddab2146e00d26211150de1538144f355951ade26c7e9249a65550b0b1ef6a251485123938d00d23a0137a1db9d4018c65c4be0a60570db1b68451111e6a9f467a471ccbed94b0077c1396bb99691c26b945aa783db4518c7506c4b761e9ea09ee33e5d9e9cb58c00eb545ce246c5e3eff70ddb3575b3bf8bea0e9a7c166667a1cc705f517ccd794c00aff9ea813ae8db21f8617aa837733a01120adabbda990f04012088610c12c0f80089c8556eb76a219afb850af849e0ecc51acb7e1dc2d99e63be1d18acd45a5d8e006d8881c5ae6c0ec7d3052fd1330d60ca0c260c1aae7031c0073f2db718616aff0035228f329d984f3d437887f17f205bad8ebc22712e0bc4004c91fff3672ced5a00cea3ae6b5cb86419b870bd7e58ff2df471ee305657c7ef0a7ba683d91cde6840006a00dbcc6e1d89a62239a944f3ea4c9d9745ccf6a0c4877b76a45374d66aba7400994496e90039622af7072db70e24e66f5373285397a7923421079aac421dd46d00d04d4a86a9b7f9c8ffd702bbcc41a26608a055c0b1dc6f27351dd41dd08ab7f5004ec93215131655118fe568dc5d1b6097d6c35ddf58b08fb286cc5a67f0b11ed100489edd71e2300b0a44e9334f56bc63decdb04223a9a69d5e0c902543f8f07ccb007dc4643035207e9e0a2722479d538c0a39ffb130ae9b9cb2ce8fc19b2e34f4dd00a1e4c60bd9272879918d2d26817bff2c0b8a7944f9e530f0eec56c092d727212003adad72e6648e03cce90b609059d1ae4fda3816d5a211ec62bbbf88dc1239c20006fc55e415dc55bcecd3b165b9e077b1755671d709afc818d9fc93f3466b6261c001f6798d5e5b975c19306c62aaf2386ce699b34e63459c8d3582b1c3344caeb4000b228ade54e5c79ffb0be13acfe56268c86d732521b0f6397621d9010434fb3cf008f096776efeee8e0e5153b42d972d65600b362ac80d794b4c1ef3adb9300106800fd233ddeea47ddeb3016ce5583ff25bd2f42c48cba354af39622ed4a85ed30c300350ae4dc8e25384e4ad04914f744296d1f0ec3e915996dea5fffcd03d759763b00b4ed1aa926380f82ca12042eafa0f00624351aa4218ecd8f73736e230ce417d500031ef160b1ebe6a28236e9126451d985fcc5e7138902be1317b48562d9a215c1006fac4a456ff7ed72f44b3f703d13727d9b47216f7fe63f5561df7f30c5126e81004c4ca6cfb6c8ffa384effdb32eac4be21d28dd2ea970c3406266c430e5051f360049fd7b1bad8ab7602ad4d3e8ca36d61b154856c91a7cab6b202ae0295ef203e000729b2e84c83d1e5b04c0f566e63e3ab02868395bde23668a8ea58489cad95cb500d9aff30613e2e2b29aad6079701fafbf7b4522218b6c6341c10cf15b9156621400a5974e8e40a76dfe230c80c607adb71b79fd866412cbdc009a750709f7f826f000d3fc9a54ed04cd3a702c9fd6c1460b2070e4dd135e9c8f8155f1378970623ea600fefd8c11dc7b084f08b74f54ef6fc05759708847b16491699848d407fb74cf7700b174bfa3af75a99b46d6d93dd01df395f9844e5194493ef9c472237f536ee2a500c460a4134f9266b3bf33117b5882a439967679b892e57c2ebd3905c4ccbf529a008fc5b88d612d43083ef56108f01806690adf10c504ac6cbb4cf1f7c08fc743b80023e2292df6114033eb2b1a946fa1a52502fba65446334d291783f49b8ea41d6a0065d186c321fb09142c0c510655e073af5c01699e7ff667f3293359ecf04cb650008ba16a2eb047695150aaa9e81e4118be406ed3a8073402220d75364faca9b49900c02f07270a40ea11b5f49c8967e55fdf26b9c4cc6f03b9970c38ffa6d094b34c0080c950746c3a469188092bd514bb67f11832facd58c3fa0a747446e792046c4e00baae0fc34f0a9bd49f4d81a72c3535967efd1faa6a6dd182eeeab6c2956e0c9300664258b2721853e4d89c6bb1f54c794d717edc674aae630ef53c857f3d912349001a1ff34ccb2b51b17136b2ce051e111476785dd5d1349914022afe9c1eaa210d000646916119ad93cf0e2bd0b6e4b772c64ba4b94cd16c4762531492db1823069200cf5d7ad398e2b1423aaaada6e704bdc7528d602844ab960176e7b5bfbbf55ece00b3276b145132a316c7522311dfa0149e146ea17121b9a58780455e4b17b8824f007252abbdcbcf6464d2c96316a4495e507329bb14833a7fce6b5560789bd26e26007692d0c6e39dc22428e2451978b885f96e897ef51e97fe7c143c4a55012030820040938f5260dc845f9f8b861bcdb03a22b56ab43171a5f0ecbc03be8866e9129e00cecb155f70d445b95fab892754fc6b2f1fc7aba59ff90e5767cf7cc9722b1276009a0adfe0d7c685d82ddfab88c08fac0f1438fa6bc81ec5a92e1632cefdb3006a004a5d488cf06b6f5ad80bafe8e06a9ce8427ffb43ec791e75132a26765f60d1a3009306f2df33cfdf37b5fc6e191b0a458a4d986ac59f0a52d15dbf009423ec452b00e16eb9e5bc9fb5088fa51091c556677226635fe1365f75970b411e7fec76216400a1bdf48589b72b139969ea051644ff121fdcd22e7678bb0584fd340500751b2e005071beec245e7445c6cd5830b9a98ec7f0b40c7e7a40c6f5eeb861c1a8298beb006c636c1b665e1f10bcfb3e4fbe9cfa136886ecad3b3e16fb64dca82dd8f7b9de005270a27ea3611b7545637540716bed4aed8b6472d1f28c369e56238a715e65e400c7862e095d052dfebadd7f062e9eef802902e2563fe0b60e5844ca4d051492b300ddb7a9ba5bc3137816c22842faa47f4e21ea6a720a3aee8b8040978a1043b93500b4e4340ae8f7ea0109f2f19ed16ed067e02c6b283339bc0096c02f9a2c614e1f00cbf6e246b545952f49f2299b761dfab77fd7de8779ee454640493873fa2414f0005eeadf05cc6bd0fbd9f6b3c6f75b599ca637f1319c3285c41964c7112e3cef430063116e058d169536867f4906496c9039b8290159b845b565e8ff6b3355dcbc5a00443cf269dcb7c260d1004ae754a035980eaf06aac489883f4918b9164b01eba1006725bb31512addc8f0d45d08ca09d7a8255d4d81662edbb47a5f6dd0609908c000bc53d66297fa5ab35a44043bae9513632d6f6d2872e0e7cd7cb056219e6de931002da75a5772909e5a9d05e19c5530bbc9e588a20281bacea70c502d1bf44525fc0069025fc7bd169fc3ea45092957fae09c727975c9c1ecb29d012ab826862edee6004e9e5371252bf2c217ef610dfb89db33f2d44325f4b6c2633e56b16d23457eaf0034e9209087940cf541c9128e1aa3d23b5fa4e2ac207ea421eacec421041f6d830024b0145b1c2eab00f7b590dbb65f1f5cfbf14d43ffd4e10286f350a1f639226300630516def9781040c5010b69d2a2f78a0fadf277c0c95e3ee84e5140c1fb9c9a00a97f0b5469180fc21fdc873c972688c462a88d332cfe3f7a7f5a05f750cbd752007e906998a1bc9799782989271877d6ab1cae9489ef82eb9941b52397ce50a8a60084b96924292c56bed8880c8b742c621799c876b0a44920a31653e485f03886e700ff0f5faaeac9785cbe573d40504ae3af066f2b7b152f39c2f6680182107cb13a008347e4a87df5f5bd2d814e22f8fd4bf11317ce0b388aab3adc4ed26fccd4698300a4f3891b5d15731f238ce668488b492c3b036413bd5f9936d0cbd9ae231548e700229a485bfe9b672906a8677bd00746a03ce52313224e3953156b2b4f54aadb46008342df410626cc8c270583cf4eb9b0e599f9f104db1fe7555591d57dbed13b4800cf5483b6dff0b1d4c0eafa70c149ce963d470b65a4865f99f804829e2bca83ad0022c62d568437c9b3dec0b990bddef0d80bfd169f25304a2cede017063ad5de7000b41dcf7a7c3704a4bbcb8862e4da76a982f95b3319f82987b74f8c8fa523b10f00f61fa22152c214a8794baef497425f45531b6438579e9d398c3749d203049081006ee01f193f830d964bc6ed1f9cafd01412cd0532b2880a46dbd92d05853fd76e00155dac1fd7453a97fe4ac60d3877ddac06f16ca2422dd384d80020310c74c56700cb9936ae690bd4f295d18ca9a93884d76f9a898514a23938f242a20d8670330b004475eedd12b04d0f0ace7dfe6f9dee7346334ebc273a41d2ca78194052ef7fd40001682a52d8d832c8812c9d0c8654bdb907928674614d315b75e00ec3f1a8dc6300fa77a033935ae5c1061cb4e4f4ce6b7f7674015f48497f62faec6a69d89010ff00faa1212a97290a3f968206554866cd806d0129f42292a1075c2f68070d4ee7880054d9ffcf2a883a9c138310ca5df7bbd4a3390e23f2dd162d3b7d293b8cf201bf00a2439e302ba64662af3fee8816fd49fa234b37fa9e92c93b912d8bae228ac846000a96247d5cb3607c131b363914363d12fba8f71d1220770ef5f4ca3caf0ee5e9008b68f6a5a890541074467304b1ee1a7a93e65a024eb1479203bd78556811b38300848d2a01f1cfe0d49cbfe0922c17b7b76ea75c63503cfe43eb38eb7bb9fa780200da69961eca9cdd2ff307bb406aaee094ded47c1192b0a9ab325d1f61e5dca1a400d0c06d331c86d1e8e654714b9e238eaead5abeb2b90fb0ee34b3aa24f69921a900c681812d086a247647698151f1d8048cac1172dbc0410f193c026691c6ccb54200405c7258e3135f9a42f66b7f363e30e365f9a441a56c45ab78a42647432161e9008cb1f945e4e17c1c556f4c3c6753628a4750b64114f2269542d56ca82baa84de0002e1eaa04b514e7d3676160777285911e9a9e99cec78ca90a79691af89bcdb26004640f549c7271513057134cbec203196819bfec222f36a36216e8e8d848c021e008764ee34f0fd01c609b8e37704ab96087b86945a10d294242d29233693e1a6ea00d228924ff8334c87d24307995f1cd1155f01b7e3971b6af143acde475f8c28a8002f78e307fd6b207f5dbd8526982344577da86006c49f2bc6958b1f267f6ef67b00e1ff3f885d9c12ced62d4a5a7d7cb50b8ff61abc5ca97eb6496b2793b816747700c93b227eef2c4551b7c37c7adf4e167c10278a042c4e889780318eb364f3d79e00a1be7c6451507e23e17500895a9c6e9d5342ec34f9101d0dd951fd422307673700918203714b7aa1096f65466ba61b139635ea1b657cb3a18ce266d16cbf2a821500c543add9c404297824d562f313518287dee830ed1f67e80c4fcc3c3cf5a00a5000dddb57ab957531a54d94c15a1a1e61449ed2dd5b2db4a3a9a94a2eaa350834b70060c1437538ee22f8995b0bf3387a2c01e6b1d05113f600ed9978eb4f68525d2b00881913d56501c263d57a80186497e78a29c469d7537fb00fdc3a4388a4db712e00aae0650377c9f1076a8bf26224248272729c81db8bd4e9566f5f62cbd488d5d700ec16b8edd79c7a5ec34ba06b15b1e9478de4fafaada1100ac0682a9f1284e31d00095e68329d7fd3f356ab90de1a1fdea171d52c2ce31825b0e94aff8fc15ad35600181e5935aff8fcf0ccb256f012eff7665d58472fa2376ee4a896ab307e0b83d5008b67d3a626ad3a0feea4833d76f5300e0d08d9a353330e91331cd64f2fd124f0004597cdd2e914ad76a6cab125f8f5263f60cb223357992c74f5470998bed41cd800434a867a6b5c4712f8a2826205d060b3b2ddef347a79ac4031f6fc59cae6eaa3003026d28c3a5b480c1e700dc8281924ca0b2722df2464a8efde87b69f4ae41e29002f51bb62733605e1f645a6ad874f29cf3d10bf3b6835e8582038faf460138bc0000ac374780f5c86ef12f82eab702ae65da4881eadaf44034295af86825efe63af005ed405e29f68338e3477dd6d45e356c9e65c927c04f165bd7e61efc16ad7e6b50099425ac7def4cfcc7fb36d74f7a7f4302b3fccf2090948049d259a022d5c81aa00695660d9091ea23c01d406b01065bd34317888a6c10861a07d11a7ae63460ce30040426f3e20f9da976b4705c827c06bbfeef9080b904b7b87f8128a016005d9c80012fec03b8ddd1a7f88e3791b61ea33c95d7d6a60140566be8c7719e8f11b5f6d00d58321a1bcd80476400fe84c43df123f93e3b7be6deadce60f2548a9e0be0cc100fe581e534131c038cb1a26a0b7a67667e7d1d1295ac3aa8b3c3741d14219e7b100dd22e6d0addda3fc6f3b51c777d769360ebb38e01f47242800d08e69a90de3970058b72b7c14889203d1f71576408416cea8f1951d7a625e1cadef51d5be4610ab000b02be02d2ad5d7ee9a9e4ad121ef0400b669ebdcfacb71b6039089954bc0bc100>",
"sg_plus_ep_inverse": "<89021273211866042506970151501586548671461933433654139778498548368635982525462>",
"ep_result": "<0x5e731a22170c1c534a4e287382908163e4325f44f50c66a580ec62726f2ca803006a52f91d940e00a7cf317b27eaffbc26086402850da9ddcd9b3e4d0898d042df00>"
}
},
"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": "<$(table_p)>\n<$(ep_inverses)>\n<$(e_k1)>\n<$(e_k2)>\n<$(signature)>\n<affine_scalar_multiply>\n/* Padding */ <0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>",
"unlocks": "affine_verify_chain"
},
"unlock_affine_verify_chain_final": {
"passes": [
"transaction_verify"
],
"name": "Unlock",
"script": "<$(ep_result)>\n<$(signature)>\n<$(table_g)>\n<$(sg_inverses)>\n<$(s_k1)>\n<$(s_k2)>\n<$(sg_plus_ep_inverse)>\n<affine_scalar_multiply>\n/* Padding */ <0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000>",
"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"
},
"affine_verify_chain": {
"lockingType": "p2sh20",
"name": "Affine Verify Chain",
"script": "/* Padding */ OP_DROP\n/* P2SH */ OP_DUP OP_SHA256 <0xea7112e972cb65ff420db31a83aea19a58fa7aa87e8153a294df5a1785e37ad6> OP_EQUALVERIFY <0x01> OP_DEFINE \n/* Param */ <$(compressed_key)> //Compressed Key\n\nOP_SWAP OP_DUP OP_TOALTSTACK OP_SIZE OP_1SUB OP_SPLIT OP_SWAP <32> OP_SPLIT OP_DROP //(Sig) -> r, s\nOP_SWAP transaction_serialization\nOP_SWAP OP_ROT OP_CAT //msg, r || key \nOP_SWAP OP_CAT //r || key || msg\nOP_SHA256 //e = H(r || key || msg)\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 //e to bigint \nOP_ROT OP_ROT //e, k2, k1\n\n/* Param */ <$(table_p_hash)> //Table Hash\n\n/* Invocation */\n<0x01> OP_INVOKE OP_SWAP OP_NEGATE OP_DUP OP_0 OP_EQUAL OP_NOTIF OP_DUP OP_0 OP_LESSTHAN OP_IF <115792089237316195423570985008687907853269984665640564039457584007908834671663> OP_SWAP OP_ADD OP_ENDIF OP_ENDIF OP_SWAP //Negate Y\n\n/* Covenant */\nOP_DEPTH OP_2 OP_EQUALVERIFY //Verify result Y,X\nOP_SWAP <33> OP_NUM2BIN OP_SWAP <33> OP_NUM2BIN OP_CAT OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //push ep_result\nOP_FROMALTSTACK OP_SIZE <0x04> OP_INVOKE OP_SWAP OP_CAT //push signature\nOP_CAT //expected head of second unlocking script\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/* ep_result */ OP_7 OP_ROLL OP_TOALTSTACK\n/* P2SH */ OP_DUP OP_SHA256 <0xea7112e972cb65ff420db31a83aea19a58fa7aa87e8153a294df5a1785e37ad6> OP_EQUALVERIFY <0x01> OP_DEFINE \n/* sg_plug_ep_inverse */ OP_TOALTSTACK\n\nOP_4 OP_ROLL <32> OP_SPLIT <32> OP_SPLIT OP_DROP //(Sig) -> r, s\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 OP_BIN2NUM //s to bigint\nOP_SWAP OP_TOALTSTACK //r to alt\n\nOP_ROT OP_ROT //s, k2, k1\n\n/* Invocation */ \n/* Param */ <$(table_g_hash)> //Table Hash\n<0x01> OP_INVOKE //(sG.Y, sG.X) = ScalarMul(Table(G), inverses, s, s2, s1, H(Table(G)))\n\n<115792089237316195423570985008687907853269984665640564039457584007908834671663> //CURVE.P\nOP_FROMALTSTACK OP_FROMALTSTACK OP_SWAP OP_TOALTSTACK //sg_plug_ep_inverse\nOP_2SWAP //S\nOP_FROMALTSTACK OP_FROMALTSTACK OP_SWAP OP_TOALTSTACK <33> OP_SPLIT OP_BIN2NUM OP_SWAP OP_BIN2NUM OP_SWAP //eP.Y, eP.X\n<0x03> OP_INVOKE //(rPrime.Y, rPrime.X) = AffineAddition(sg_plug_ep_inverse, sG.Y, sG.X, eP.Y, eP.X)\nOP_NIP OP_NIP //rPrime.X\nOP_FROMALTSTACK //r\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 OP_BIN2NUM //r to bigint\nOP_EQUALVERIFY\n\n/* Covenant */\n//Verify tx matches msg\nOP_1"
},
"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": {
"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_DEPTH OP_1SUB OP_PICK OP_MOD\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_6 OP_EQUALVERIFY //Verify stack\nOP_5 OP_PICK OP_SHA256 OP_EQUALVERIFY //Verify Table\n\nOP_2DUP OP_0 OP_EQUAL OP_SWAP OP_0 OP_EQUAL OP_BOOLAND //k1 == 0 && k2 == 0\nOP_IF\n //Return infinite point\n OP_2DROP OP_2DROP OP_2DROP\n <0>\n <0x01>\n <0x01>\nOP_ELSE\n <115792089237316195423570985008687907853269984665640564039457584007908834671663> //CURVE.P\n <55594575648329892869085402983802832744385952214688224221778511981742606582254> //BETA\n\n OP_4 OP_ROLL OP_TOALTSTACK //k\n\n OP_2SWAP\n OP_2ROT\n OP_2SWAP\n\n OP_FROMALTSTACK OP_ROT OP_ROT //k, k2, k1\n \n //Verify GLV\n OP_2DUP //k, k2, k1, k2, k1\n OP_4 OP_ROLL //k\n OP_ROT OP_ROT //k2, k1, k, k2, k1\n OP_SWAP //k1, k2\n <115792089237316195423570985008687907852837564279074904382605163141518161494337> //n\n OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_OVER OP_ADD OP_ENDIF\n OP_ROT OP_ROT\n OP_TUCK OP_MOD OP_DUP OP_0 OP_LESSTHAN OP_IF OP_OVER OP_ADD OP_ENDIF\n OP_ROT\n <37718080363155996902926221483475020450927657555482586988616620542887997980018> //λ\n OP_MUL //(k2 mod * λ)\n OP_ADD\n OP_SWAP\n OP_MOD\n OP_EQUALVERIFY\n\n // //Verify GLV\n // OP_2DUP //k, k2, k1, k2, k1\n // OP_4 OP_ROLL //k\n // OP_ROT OP_ROT //k2, k1, k, k2, k1\n // OP_SWAP //k1, k2\n // <37718080363155996902926221483475020450927657555482586988616620542887997980018> //λ\n // OP_MUL //(k2 * λ)\n // <115792089237316195423570985008687907852837564279074904382605163141518161494337> //n\n // OP_TUCK //k1, n, (k2 * λ), n\n // OP_MOD //(k2 * λ) mod n\n // OP_ROT //n, (k2 * λ) mod n, k1\n // OP_ADD //k1 + (k2 * λ) mod n\n // OP_SWAP //k1 + (k2 * λ) mod n, n\n // OP_MOD //(k1 + (k2 * λ) mod n) mod n\n // OP_EQUALVERIFY\n\n OP_OVER OP_DUP OP_0 OP_LESSTHAN OP_IF OP_NEGATE <0> OP_ELSE <1> OP_ENDIF //(k2Abs, k2SignPos)\n OP_SWAP\n OP_SIZE <8> OP_MUL //k2Abs.bitLen\n // OP_3 OP_ADD OP_2 OP_RSHIFTNUM //windowSize (bits + 3) >> 2;\n OP_3 OP_ADD OP_4 OP_DIV\n OP_ROT OP_SWAP //(k2Abs, k2Pos, k2WindowSize)\n OP_3 OP_PICK OP_DUP OP_0 OP_LESSTHAN OP_IF OP_NEGATE <0> OP_ELSE <1> OP_ENDIF //(k1Abs, k1SignPos)\n OP_SWAP\n OP_SIZE <8> OP_MUL //k1Abs.bitLen\n // OP_3 OP_ADD OP_2 OP_RSHIFTNUM //windowSize (bits + 3) >> 2;\n OP_3 OP_ADD OP_4 OP_DIV\n OP_ROT OP_SWAP //(k1Abs, k1Pos, k1WindowSize)\n\n OP_DUP OP_4 OP_PICK //(k1WindowSize, k2WindowSize)\n OP_MAX //maxWindowSize\n OP_1SUB //i = maxByteSize - 1\n OP_TOALTSTACK\n\n OP_DEPTH OP_4 OP_SUB OP_ROLL\n\n <0> <0>\n\n //(Table(P), k2, k1, k2Abs, k2Pos, k2Win, k1Abs, k1Pos, k1Win, i, Pz, 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 //k1Abs.windowSize\n OP_LESSTHAN //i < k1Abs.windowSize\n OP_IF\n OP_6 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_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_5 OP_ROLL <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n OP_8 OP_PICK //k1Pos\n OP_0 OP_EQUAL //!k1Pos\n OP_IF \n OP_SWAP OP_NEGATE OP_DUP OP_0 OP_EQUAL OP_NOTIF OP_DUP OP_0 OP_LESSTHAN OP_IF OP_DEPTH OP_1SUB OP_PICK OP_SWAP OP_ADD OP_ENDIF OP_ENDIF OP_SWAP //Negate Y\n OP_ENDIF\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_ENDIF\n\n OP_3 OP_PICK //i\n OP_8 OP_PICK //k2Abs.windowSize\n OP_LESSTHAN //i < k2Abs.windowSize\n OP_IF\n OP_9 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 // ApplyEndorphism(Y,X)\n OP_DEPTH OP_2 OP_SUB OP_PICK\n OP_MUL\n OP_DEPTH OP_1SUB OP_PICK OP_MOD\n OP_4 OP_ROLL <33> OP_SPLIT OP_SWAP OP_BIN2NUM OP_2SWAP\n OP_11 OP_PICK //k2Pos\n OP_0 OP_EQUAL //!k2Pos\n OP_IF \n OP_SWAP OP_NEGATE OP_DUP OP_0 OP_EQUAL OP_NOTIF OP_DUP OP_0 OP_LESSTHAN OP_IF OP_DEPTH OP_1SUB OP_PICK OP_SWAP OP_ADD OP_ENDIF OP_ENDIF OP_SWAP //Negate Y\n OP_ENDIF\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_3 OP_ROLL //i\n OP_1SUB //i - 1\n OP_DUP OP_TOALTSTACK OP_0 OP_LESSTHAN\n OP_UNTIL\nOP_ENDIF\n\nOP_FROMALTSTACK OP_DROP\nOP_TOALTSTACK OP_TOALTSTACK\nOP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_2DROP OP_2DROP\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