Commit f9c75bbd authored by madengji's avatar madengji Committed by vipwzw

add parse public input

parent 62e2139c
...@@ -102,9 +102,9 @@ function mix_transfer() { ...@@ -102,9 +102,9 @@ function mix_transfer() {
##config withdraw vk ##config withdraw vk
${CLI} send mix config vk -c 1 -z 1f8b08000000000000ff6c51795093671a7f9fe4230d1a15224705c508b845442520ba8a42498c8051ea8180656345fc20c190484850504428208756a11e8834d80d663d285854c6455d0705d68a2e5a0b54915a8ecaacb25e94f5316abf9d2f48776667fffacdfb1cbfe37db83cc29532d95c004114ad5325a4ab3489723a1d981c0214800c985c029c503f60f6b02806663f01c14ac346b52a3e5cb3c5a04f05e61021641af33917804b8bfd46368023f505269f00472a6691102f268f0bc0a1e759cb5ce0487c812920c09188dfa31f8b848898ddd641bf913270427c812922c00911b34888335308001fc8d47432add15b7b3ce0134233c55c80c054bdce10af176d1785c62527c745d089a28d1abf8079b343fd421212541a3a50b48456ebff4f4394399212f8a39bc07c41803f3acebe08f164f67201f8a34bd6110e408cd52dac1bc9e0c7ece3024cf9dd8a5c14ab782f26feafd87e02002007e60021642af32507c0ee7fe7d82630a5ac6e8955f7f77ae9a86ed1882efb354ecc410e003f5691aad7a93489ec6d4040c86fd44f4c0eab45e12187da976e973aabd1609719e9bd7e7e3d862b266ccefdb2d88cfc6de6575b87172c060ac34f788ea76ebcedc42237fb17e3e70e34a278d1bf1fdbbb19fa519074fc68439a5d1661d9d28f4df0ba1a552cc54f7f21394be53307f06ceef449bb1206f720e772e3b46a557713507876f79a28a540198ccf85fab4825f2c4d981677fd9213d40a10247f9d27b3bd61b4b2694f9676c6ce9afa161d25f2e3073687ea50d6973fe540a47e2c728dd75fb6bdae3c0714ba24a698e65d72e8c4ccaf5fa65efea7b01ee70cb62462c87205daad9924fb3ee0761c21d6ac70abac3f68da15231e98fb8af9a02ce52b6c444515efeefa4014c6dd7c9066bce00d143eb333276f2bfabc0a677a78fd1679adfa28ba1b5f4b2ddf9fea43f76f331774a9fc5badeedcae79d5dc0af639843faa4b9eb53ff97339da563de9d1b41e7b8393d3164dfe35d04309140e2b3cebb76524987068e87a073743f402a34abe49bc27a91122372b5aeb5f3cff9d956da7474f53cd3a37172c684f1faea14d6d98a48a5c1814ebf00edd9cb5a6e045d93380c287cbd5bb453b3e2c45bed3706d94a3d20605ce6dd2b1376c2ea27df4acd28e6bfb7389352c50e871bf3da95aba54820de3a06d7b952909a7381dc1757fea35a1f041c599b13d55dd40e1969b8e3197fed1558bd5852edc85e27d0c1e3978b5f2c7ae9f3538ee62d8daa91794df8ca4ed79d46cd8d94e630bf793def696d077d81db9a94c360414baca2abd7c6c6eca81c2ee7ee17c5e5653d2eb8d2dde0ecbb29bf13196c2b0c7e06514cc0ce63fb5ef5efafe14eee54b66c2ed53c518b48a1fb3baf3b010b38e7ee178e77a4a310a9f0c99ff55b8b50428347977f9da3fec50e2e0ca079399882b9e287e53985ef807d88b3e675f1dd605ae1bb29ab33c13edd207ac7d81d3eb6225b6b5eeade86df9587238758c33dafa9bfd1a88e318a05013b03eafa2313319d396f795df3b33e482cb368d3fd6d27bad1f79572ed43f4affa1cefa79364061c8dc5d374c4f7136fec55c10b63d6222852736c4d9449b3df27186d673d58c0fd36380c2f3f93d2b94ab3e6d47c71503b67b8dcdcdf89d7c41fc361551e19c57cfa77f3b58ee4180c28a8b6a1f4d59c30614a5c406145df13e81cb02b79e74ceddf8314e38b628eaa974ee65a0509193974bf6fdfd34bafb6484259794203eef73b50bf85b5617f2440e5bca3c17b4b0643ba3e7f7d59f32f2b06671ac4b6f6b228d3fc4db6cb8630a32be1e0abb5fd7f2f82e5018e3ab769a762e7c32f29ad6dece769e65c2ca239b732c735a0770a2daa971c9cae1cf582ef9f99f024e3f6d4841b3ff8a3da136a78370383bbfeeeeb984669c7ae6966bc67dea3950b87052de573513f30ee2d8f57f7cd46e5155e28e3bf11f7df7ab220067b7f576081a62642c595271d29c299d05fe7877cf47e1272dd96538e6ade55447c5bd12e49bfb5de5c7f75d050a076e693216ef1808c52eb7a28775c1272a5053effab25c7efe6be4bf7998f1b3cfde0984800d2f24596bd0e8f99f44c83e8b0e5f2d1344ea687ab556ab0f8b4b550a430c7aa556a7caa0d76ca1359bd8d2b808835aad4a50d13af645fe130000ffff37a667a7c7060000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01 ${CLI} send mix config vk -c 1 -z 1f8b08000000000000ff6c51795093671a7f9fe4230d1a15224705c508b845442520ba8a42498c8051ea8180656345fc20c190484850504428208756a11e8834d80d663d285854c6455d0705d68a2e5a0b54915a8ecaacb25e94f5316abf9d2f48776667fffacdfb1cbfe37db83cc29532d95c004114ad5325a4ab3489723a1d981c0214800c985c029c503f60f6b02806663f01c14ac346b52a3e5cb3c5a04f05e61021641af33917804b8bfd46368023f505269f00472a6691102f268f0bc0a1e759cb5ce0487c812920c09188dfa31f8b848898ddd641bf913270427c812922c00911b34888335308001fc8d47432add15b7b3ce0134233c55c80c054bdce10af176d1785c62527c745d089a28d1abf8079b343fd421212541a3a50b48456ebff4f4394399212f8a39bc07c41803f3acebe08f164f67201f8a34bd6110e408cd52dac1bc9e0c7ece3024cf9dd8a5c14ab782f26feafd87e02002007e60021642af32507c0ee7fe7d82630a5ac6e8955f7f77ae9a86ed1882efb354ecc410e003f5691aad7a93489ec6d4040c86fd44f4c0eab45e12187da976e973aabd1609719e9bd7e7e3d862b266ccefdb2d88cfc6de6575b87172c060ac34f788ea76ebcedc42237fb17e3e70e34a278d1bf1fdbbb19fa519074fc68439a5d1661d9d28f4df0ba1a552cc54f7f21394be53307f06ceef449bb1206f720e772e3b46a557713507876f79a28a540198ccf85fab4825f2c4d981677fd9213d40a10247f9d27b3bd61b4b2694f9676c6ce9afa161d25f2e3073687ea50d6973fe540a47e2c728dd75fb6bdae3c0714ba24a698e65d72e8c4ccaf5fa65efea7b01ee70cb62462c87205daad9924fb3ee0761c21d6ac70abac3f68da15231e98fb8af9a02ce52b6c444515efeefa4014c6dd7c9066bce00d143eb333276f2bfabc0a677a78fd1679adfa28ba1b5f4b2ddf9fea43f76f331774a9fc5badeedcae79d5dc0af639843faa4b9eb53ff97339da563de9d1b41e7b8393d3164dfe35d04309140e2b3cebb76524987068e87a073743f402a34abe49bc27a91122372b5aeb5f3cff9d956da7474f53cd3a37172c684f1faea14d6d98a48a5c1814ebf00edd9cb5a6e045d93380c287cbd5bb453b3e2c45bed3706d94a3d20605ce6dd2b1376c2ea27df4acd28e6bfb7389352c50e871bf3da95aba54820de3a06d7b952909a7381dc1757fea35a1f041c599b13d55dd40e1969b8e3197fed1558bd5852edc85e27d0c1e3978b5f2c7ae9f3538ee62d8daa91794df8ca4ed79d46cd8d94e630bf793def696d077d81db9a94c360414baca2abd7c6c6eca81c2ee7ee17c5e5653d2eb8d2dde0ecbb29bf13196c2b0c7e06514cc0ce63fb5ef5efafe14eee54b66c2ed53c518b48a1fb3baf3b010b38e7ee178e77a4a310a9f0c99ff55b8b50428347977f9da3fec50e2e0ca079399882b9e287e53985ef807d88b3e675f1dd605ae1bb29ab33c13edd207ac7d81d3eb6225b6b5eeade86df9587238758c33dafa9bfd1a88e318a05013b03eafa2313319d396f795df3b33e482cb368d3fd6d27bad1f79572ed43f4affa1cefa79364061c8dc5d374c4f7136fec55c10b63d6222852736c4d9449b3df27186d673d58c0fd36380c2f3f93d2b94ab3e6d47c71503b67b8dcdcdf89d7c41fc361551e19c57cfa77f3b58ee4180c28a8b6a1f4d59c30614a5c406145df13e81cb02b79e74ceddf8314e38b628eaa974ee65a0509193974bf6fdfd34bafb6484259794203eef73b50bf85b5617f2440e5bca3c17b4b0643ba3e7f7d59f32f2b06671ac4b6f6b228d3fc4db6cb8630a32be1e0abb5fd7f2f82e5018e3ab769a762e7c32f29ad6dece769e65c2ca239b732c735a0770a2daa971c9cae1cf582ef9f99f024e3f6d4841b3ff8a3da136a78370383bbfeeeeb984669c7ae6966bc67dea3950b87052de573513f30ee2d8f57f7cd46e5155e28e3bf11f7df7ab220067b7f576081a62642c595271d29c299d05fe7877cf47e1272dd96538e6ade55447c5bd12e49bfb5de5c7f75d050a076e693216ef1808c52eb7a28775c1272a5053effab25c7efe6be4bf7998f1b3cfde0984800d2f24596bd0e8f99f44c83e8b0e5f2d1344ea687ab556ab0f8b4b550a430c7aa556a7caa0d76ca1359bd8d2b808835aad4a50d13af645fe130000ffff37a667a7c7060000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
#transferInput #transferInput
${CLI} send mix config vk -c 2 -z 1f8b08000000000000ff6c517b5493e7197f9fe4330404440f8c8a42422a22179504c5212a77b9ca1c8a0b60865c827c02e19614c56820822001b954f0d0dac12c1aaca0c3b276e87003ad50aa6b6147109cad2268c1b3a3526d1f2ef2ed7c41bab39dfef53befef7d9edfe57db93cc2f5670ab800a67be4d974f2215ab13f4c7e08182d010a20109842029c200930652c8a81a92460ba539590462786283255ca1c606a0921f6cc312e00572e96cc6f00c7df0d98e30438fe62160959c314710138720f03cd058e9f1b302504387ee2b72861911021536c1894ccd3c0f17503a69400c757cc2221d6cc0900300a4c93a7cb154ac31d0ff884c8191d17c02b4799ad4a540a0f0b83e2d3d3e323e4fb85090ac9468f754112dfe4645a21f71206c8d394bf70213c32df12f80b9bc09c24c05f18674f84ac62cab900fc8525c30807406a480bd1f31d244c0517c0f6e72861c258d95b33f17fcd2a0900401830a7082102e67d0e80c5ffcfb197c054b3be5506df9ff9ea05dfd2795ff6697ec5d47000f8b1b21c6536add8cffe0d981232b7c897d1b25e142e6af6e935d6d8cd61cdf7cdff76e0e4d9a05e16a5916ad6f7a0a3cbaed43b5e51a781425e62dcadb9e8ebe3d8b22418bf5adca9c6eeadc468f6c131095a7471072ff77b5b1156ad5b5a14533cb2f9188eb5e7eb361cac2ac719937d3fbadbd439a399f16bf23038ef53a030981f531e597e5b837b921f191ddb6b72121f0d3f7ee2a3ef14e0f2b3479bedaf28571bd46897d2c4e17fa95fa2e7dde53f38fd25b406cb9cdeebf774f2f1408b468e9197f9277940e16dbb8f9aaf4c061cc0d6b313d3ae45df8ca2cf8e2d25079c5cd7a24df0d1d9e7e1a56e8418ba369e5fd95171e6ae251e1124b936251558e2c582be5261fda211743d7cd2eee6846537506872a1df66cbd2d9a7582312da4e0aee6bf1d27d37dfef337c8ad021c475e4f21f5ee80ce95a8354b4f55442001eacd58e985d6b3a88fe5fcb4c2e5947b621b874ba5749ea9381c2cb82ca8cb51d32c00c7dcf8e8ffd8ab661c9d10669c37d751d1a999f5ba6d0a77e6850fbb1adbdf0a2ca6f1a07b6a5e4e6df8d6b43cf4aab7f466cef97a1d3e9829aa83a710050282beebe119e17d78f93b156d666b3d513b8bbb05c9f1e3bb909b9f7c26c444d457c62280b1416393ddb69f3a62615a93e7dd9f5a03e3d6ed099a967429385f8ce9343b70519a952a070fcf76543d776b77e8bf196a2de07b18e2948edfd7c9b7756f179b40ed9b4d2b9647a95219f9bf33b7d2513a11dd8f01d8f67de75e0031c2c1e6f1cfeea9b67b83efa9cb82360ac1828bcfebae3ce1ddd9ee7483b7e5b95dd1c3280a27c998cef3d1c83c23bf6fde6d4d0f6b77f9196f0397dffba47014ab33347475ebf6c43dd998a30c7579ba2d0a42c54e03d38bd04283ca199644a9e9a79a2f9253a3a26e06f2e38dbf2d1c8e17d9aade8faeb4c0778e69c694817b9f561fe87499fdae28a3193f192776bafe0b0ddcea9c76d6a7774141eb9e5ae3d320a1436e57ff0e426bfc50ab3cea6aa07a66b291c936ccb718a0a8b43eef81bf7ca99883ac3ebf180c2d01fe20bc73ccf7c8dda6b5dd567ec92bec3fd1bf4014ba29f5e45d1b0ead09acf74536c8b65138385ffd09cc3cd9a2c4dcce52fcfa2bf6050267a9f31416351947702e1e610a0b08eeffc93a568b51e4b2b0657faeea8dd88071b7a476a32f3aa91772a592afe636a3350f82c5f329794e42041b7a15c356f877608d798abb7b72f3f378baeaff42b7cd4faa5ac983dff92f352da548577dfbbb5a5f6f409115aac7bb8d96252dd8b5ccbb512afbdadd640e1859db6bdf57f5fdd8d95c27aaa215c7614a7786a554578fb6d7436b20af36ef9b29c157bf9b1cb8b39e3ed7e183876355c92ebf0190e896ffcb6b1db2a13ad677a7a8c4e658502858f5b2d52ed732fe6a1ffc61789d1f7ce97a1d9c9ab6b8d7f52b4e30ac9bd9681acca47ac5894765237d9d93b8a7e13f417c66273633cdcb5a2986e3c3e8816b1bbde5d5fb9de16a8a9f6b4dd4191766fb0a3e154a324a5fd01dabaf54dcfd85b3248657d11d9b68fb387d572b9a069ca5557dfc074af4fea27ea5b11cb052957b43d03c7d134a2a262d38d3fcb81c2578ffc9e4bf2a55338fad7b69bcfab96756271bcc79f16afd275e1e2ad4deb665dae3610023cb35d29b43c2dc9373d43a5504affe7146d16a14a4ba393697976707c4eca325f953225239bce93efca942b92588aff9b88c0b8df8544069aeece96cb233332942c4bfe130000fffffc0ee3992a070000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01 ${CLI} send mix config vk -c 2 -z 1f8b08000000000000ff6c51795094f719febddf7ee062b8e4f640562428f7ee1a560a465960478e46b985414281fdc0b5bb0bc26ee5d288241c2208180e2347b6296245a64504ac442523a0099682065302040c686c4982e3487c41c3d7d945d369277f3df35ecff3bcefcbd1271c7f369f036018cd64c852b265cad410261bd8e304680009b0ef13a0760b813da94501b015040c43d54972597290325dadca04b68610b2892de000701881706502287f3eb08504287f811609d9ca7ec001a018912ecd01ca8f0f6c3101ca4ff00a855a2484c716e91a852b69a0c47c604f10a0c4022d1262cd9600c02a899c51304a95aea60f5c4218b69403e093a9ca5027ab78b9bcdd890a45e21e269597a4147a8adc770bc529293225e3c30b60e4aa5f29f08eac6c09dcd793c09613e0be6ed7468438b0651c00eeeb215d0b0510a3730bb12b3b08d9531c00db5fac84f0e2e25f8909fe2b564100004280fd901062c79ea6004cffbf4f5b04b64aab5ba9d3fd255ff55af7c48aaef634566c3505c08d8bcf5465c894a9dadf802121cb7a62f6b8568bc6cac84e72d8d7c1100bfe309c2ee8cbe94597e6f5c3e7caae25a39e32f0eea4f95c0ed09816ece275ade05613debbb9ef54988f9f27faadda35bcaefd6fb1e83aedeca0e96cd844b46cf571d7e9c8fb75df61dd4e1127d83bcb14f916f94349cd9b846816cd17142f58bf0d34e696ad4d5faa94001ed5dc37b9df965a86d529e78a3fbcfc532752ecaaa68d4cf8bc8ead5d3269492eb63dc586cc99566e5b8b0053138b4ea917251de8a609490cb09d6d001a373ca63aff92e7648be6f6eeb6c5212a1106bf1c0c9bc936f7c6ad0e751f6b465c3611a2dbf52d4944686bd0800ddaff66bcb1fb8864022f5e32e96f3bf6b610ad0d367b3e7bee5606347e1569ac3ef30f511eeeb6886ebc3f505b8b8207a331f94d776671cb0475f2d865fb429d3b7e7790666de0d7755812fef3fa86e59e5bf8385aa22a7f366f836b7bff9eaefa486c05347eacf9f1bd1fde31f0c1aefded337bf3a20bb1e1d9a453c56c54079aeb7dd1fa3272728b8e4ddaf2469165666d15362d5d22d2bfce2e6342cebaed1bf517a6d1defb9122a0a6d418683c7f63cdadae3c173d9ca97b5eec51eee1825bbc7071b6a360075aba7ec41f979d6f22ba65814683a100f34f9f04f071aed5d3e4d09f2cabd122fd7c5d99db9326745724d84b34c41068ec1c9bf824bdbba719377e5e98f3a6dde40c565ebfc6bbf47cd40b3788120cb2bf3d5eaff3b7c1ef0dcde3de417d745f476647f44ac7f0c08dc3ad67be3f1a83a68315366eb6cfe781c69a2e876db969a54fd1542fb8e8ca255725064f1fea6b8c588e42d758a387ff1a8a3bf1ea1709fca5b36bbc3fa170f44a7bf2a091340b574dee28352c178fa3435b63ffbf576fcf021a372f4e8d1d546d35462fe1d4f0f268e075742e1c387f74756809ba4962c6db2f58b9e9dc39bbfdde4c11181a8ed641b519c71f2a9df19f7da3dfdc89347642ab2f4ef531bc933f038dcbd44de983390583e88c094355dd11c8ebc95699543d152fda4bdfd30c247da73b9e3ed02809bb7076ff8b7777608fcdd5a6b8dcac293cfce54fd1738ee7a4689a75c378a444d405346eeba8f15ef8e6c513c42de50aabe435bea8f0ffb4aa6e61fa07740c6fbd6bddf8e202d1fef6ec1133618bef34b2ef7efdd03dde7a1fcebe1c0eedff716d041a4decb01dddd9a6061a9b0f7e7efb50dcf745e82c3710bf53536d8905328f9cab1b175bd02c28d2dbf1ca114f2dd9e9c22b8525b96388be0e6dc551f2450a635dfd3d8e2eff3913dfccdadc9cd41f2e071a7d77e10839abf900172e48fdb685ea01aee9bbbccb8e6ffc00cd8cc20e77357e36a625f38d5126877c16df87dbefd5fb3e9ddf1f8f7315ebc3c6a8b776a2e5c52e6e4efecd28a071e08e53f5d6f75336a3d18407f9ed6d5530762ea7bde8f569ff1dda3aeeed9f0a989768c92af3ef74b46696e461ccb586afba3841625cba77d5d6f76eef335c6f213ebded61f53da0d1875d34aa1eb4fc2376a688ef0acce4223c936623da3fbfaf1e9df463d8c85d5ffa6bc91c9a1ccbea6b8fbd4461d041de54d4a312dca9b1700b6ca9bf8d56715eab279c045e4063ecb9785e614f97230e8ddb3c3ad6e7bc84b78ab98b76d3d5ddb8dacea434ece4b7238480be616406c384a7a5a90213330f70f7ee9124ec0b0a979889d5aa036919b21c26229d514ab535a33d6ab95c962263327451c4011923978a15696aa52ae67fa258f29f000000ffff7fdd3e0e2a070000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
#transferOutput #transferOutput
${CLI} send mix config vk -c 3 -z 1f8b08000000000000ff6c547b50536716ff4e728d49094e902aac2b25561418284b6265456b0b0126a9b441a0f252d749f44682101e49da52dafadaa28020529e858115a4252c56684b812c202882e2545e2b415e5b2ab432c802d62ec7b6787712a43bbbb37ffde69ec7eff19d99cbe610b61f73920dc00fa393d4aa64b5e668209d0ccc2902144000307f26c0928a813967461130d904f87bf5ca58f5e1d735097a9d16987c42c826e6341b804d8bc4cb1bc0f2f304269500cb4f6446425c988fd8002cdacb5266034be209cc59022c89e8198acd488890396319142f9781e5eb094c3a0196afc88c84d8316900b03a20968ea3353a4b8f035c426826830db04bab4bd21fd609538452455c9c424e1f152a35e2ed5e1e52b1af4aa5d6d0bb84fe74aceeff34841f2ca704eeca26305904b82be3e62f429c984c36007765c932c20288b0b885c8e50c62e63c1bc0e1372b81c2fd079f8989fe23964d00000281c9258438321fb30004ff3b676e029363d6bd60d1fdad9eb3a29bbeac6b7e9af54c1e0b80bbffa05697a4d61c35df06f8843ca54e31a7cc5a14da041b3dc38fe893d1bd68cd7b45fc3d9f60ca21eba01d535d7db8e9736f9fe61f7bbe040abdedc33cfeeeb2fd3aaedd20fb2a21284a801dc5ef9cdce130e584eec1a3416f25aed212339b5061dc5cf853210fff3af0fdd9ae7cfb254cc53cb7b62ce60072ab1fc97cdb5dd44061fe9c69d274f7ee43bc3b39ee7efa4e25071f74cca40546d6aec52d9dd9afaeaa98a72d6ce99fdd38a7b93c2dc5a09fa2e21f734edcc687d14386e96e5e02bab97d76252c66dba039c193d129c70fadfc3058e17ff1a8b45f858de336b5af18fe188fb69b5fbe2adfd0b09e104bd69171d3ce2d76c7ac51249973cae9ab7a8aa1ed357bde18591841b70b1a7f6f929808141a2a0d1353857fa251d8b23635c0737d2d963eba979f5becbe03d93e079c43f3bbfd2ceede1f8b6908abf0e6606f5ef174f9b0c71ebc58717ddb588cf4355c77a8bce5fdb7e6b3817ad2f392c475c3874be864b4196bf4aace44e189f4353b1795efe21fb0e54e4f79dda716b289def632b52626054dbb83b503b47320e6f0b92d3f27f5ad46e7fc84840a2ffb10a010db5b55da5733caf0bbcce4accfddfed686036fdffa57c66cca5ab4776dab3ee812694b2c598142d904949e4fda72157b1b0a422fd54725e0f1c9e254d2b4f535a4faaff9a8be9c6d050a8da6e18f6c83671e63e74bdf408bd7e22ebcd2656a7d518feee881b20c87967e7f8bbf2f6e18146431fb38867b47df33197a1df19a42c70bb7126d455e5562bde22b831350e8f32bbcb0affc6d099639476cf478908af8c43740f94f5e57150a871c9d1b7ffca0f9d92916d638d71b06b6cbb1fcfbc6f83cfe994df8c398e0fe778d0dafa0f52f8fabef4d1d9301858f5236c9d21c6bd231f7e0e259d7596515c638077c7b76bd60149fb39a2a5cd774789fc5dde0aafb025bb7bdcd98f886a1cbff8af13452596ee7beadb9d589cf27a5b95ff2534d0385fb4becfe12faf505131a8f501bad861417b1c7e1eb2f26877367706382aa3fe2e3f91f2caf4701858e92b6ebc3739eae38d465ad97dce774e0e5c1e7e607136df4c8d19e96ffce376c16281c523e38ff5eddd0250c3d73eb1f51ca251facf41a7d31ece13bd7705de9bae3a50571e6df26c69b5ab39aea6ffbe0af45754319cd521e3649be495dbab14f82ae25937505a3215781c23ba3f6328da0a50175a6f1859bb135724cfb545ef0a6a05b8c9bc34b9e6f4ffafd5333995dce4db5edeee893b87afef0f82a63248d052c7e9155de81636823d08470593b7940e12f56535d99b75dfc708ba3b16d589bfa2e86744bd419d5b39d68dd1023b53bd68a66b285ddfe7bc7dade2c44d89d6c1715a45160b4d04b30d2d73987fc8ee49f8d2fbb4e0085f2dac292a6cbf30ef809727827cab65662c3ccc99108a5fd6ae476dc0cdd16fe42252140598746abe9d823be71f17a8d2e822b8fd7d1328536fabfca91dc2079c0a1f0d74302c8bf030000ffff9d91ce826b060000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01 ${CLI} send mix config vk -c 3 -z 1f8b08000000000000ff6c53795454e715ffeecc0b8e040988a23058864a5482b53328102521308088a3ac1621c836f818a61d1ecb0c844541a7b2045904a284260a078f444243596493838c1288a2294903270d614969122ab40a81948b82afe70d929ef6e4afdf79f7bbf7b77cf77b7c03c2f760cff2018c82e964656cba9251c8e87460b50428002f60cf11e0793b005bc8a104d80b048cfc53e42a658c0f9398a251037b891062c3fe9e0fc0a7250eab13c0f310039b4b80e721e190905d6c0e1f80473be9cb7ce049c5c0e613e04925cfd1814342446c9ebed161b50c3c7731b0050478ee120e09d9c2be0d00ebbc54743ccd68f4670620208466cff3015cd49ae494188d2853e41d1d1f1fed4b2b4472c6c1d1698fb7837b6cac92a15d449eb44af33307a2d3ab2941b036096c3101c15a3bf745882d5bc40710ac0de95b7800217ab710ba9ac1812de1036cfbc98a4c1416fe5c4cf25fb10b04004006ec3b84106bb69c0760f2ff7ddc21b0659c6ea95ef7a77ad99a6ec1aa2e7735e6ec451e80202c5cad4956320a6e376044c833ea0cabe5b428cc1e32e9931d731bc1e8f69a3783852f4830e0d0b7bd864f978651b829585b5e3a970a147a4a07cf7e6db2f9d852d50b01994fbc5ad0283c5f7da275d74eb45eceed1d3dfa592ce1c80eb95eeef1fd68b005cfda66a5557db5f5204eb1b333c5eb3227d1a4cf79792afbc309a0f06ad7878bd7b5fc52d4dcaa341ccb7d7300ed5f0c7f6db0738f155a1fb9ffb7f3ae9e7c3d5bb733e3d77e7bab25ee91876e9835a8e842d9b714c3741ae6e146435327c946e90ea070cb97effdd163c2428ba637e79bcf141933b86f8f0b8ed9642ce03a4bc3bf4c1b4b5d09d147cd799dae8cf9ad360dab4ac2824e279c13e3173702986ab92a02ed6607747707dda780c2b611d76ee77d651fe0a507858af428c3719cb9af3b597d25418be656d2b9297e4795de1d3db1b2f489e30f5578bd2bd5398bd73e83a3a75c859fbf78b97a4935ad7b634bc04ea0f0ada39587beac693d85c6b5dec5af375fdb81eb3a7c73827f74bf8a42d9a2e88969b3a59eecdef62097818583a36855f7e7c6bd23bd973073a8492812bb45a2ddc31ebb8fe71aa380c2a6c3db4a22695b5b6477fbed10ffc26f04b50714babf3f7bd6b754712af495f503dc7fb5ba569f10cfc11941c16da42c99a9deac923b387981c4d6cb22929012decd9bd444ff06289c6a895c7ef9c4f84d6c4b69d6ceb7cd6f43a7b73bdb82c6ef4ad126a62bb1a9eda9a3de9e7d71cc6c606c9e19aecf49fef40d92cde2e2d4fbdf0cf61137848ea8df0972e728a050e1b92c504b5712b1fe56f3f6f3bb4b1dd1d03c57346eb5e93b14d6ce9d58aadf9cf87c13ce1989d6dfef77aac58be6f7884503dae0ca62a197b67f7d160a0b6f46c4fcdbfd63a0b0a7d65ef6d75f8319be97f528f6465d6214bafe68ffea44f9fb0b28e6ef7a6d20df40a477f781d9156974ead14034ae78e99decb4cf55e82f4dd8eed29cdc8d3b3514ed7df85a2550281e6d1b8ea971fa149ddefa83ddbfba775ec4efbf0e78a594b54dc7ad8e9bf66ed3768cea6f8f4b127278e19b3b293231be7be3001d3813dc827f6234f50ab7e3fe68feb872ce63afc12250f874e687be80e53b23f840e77940fe51ad31de9657e5adefb9178194e255fbe4e96133c2858d1aeadb600ad358f0a4b4a2bcb1fc1c1ec146d3c756712648edcef1696c481ae49eb1e53f7ed520955d47f13138d21ad51982d92bf2ab8f5fda2745934ff2d3268b0e0a38b2afc67cbe535d69fd0c8bc693fce3bb8eef4756b962735f571d861665a2eae18e876aeea1300ae3d4c6f964746cada93b5d7726035fde5d7e3963a4ff018ac5ed6e8c7af95d8eec9624d07a7e8ba80be9cea2450bbbb87e4c78d42f67473bcbd0dcf461eac6cd5f3c020a278dcc06c61449bd38d4f04ff1c952b9057685ebaef935a995f8cb9ac8fdbdba8c01428012f8f97a451ef709f4da1014a7a45527dde31352184d88c03741431f8a56c7fd4f3994fc270000ffff89296a6769060000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
#auth #auth
${CLI} send mix config vk -c 4 -z 1f8b08000000000000ff6c517b5493e7197f9fe403a2244a89c14b0563a5e014038905d6c2985c82040aa21525440a09fd80b41069122617071228144cc7451438a0a5038695035527a52d475bb9163a540e058a041d7a86b6bb7070b43e22f8ed24883b67677ffdce73fb5dde976d4dd8814c1e1b807b88d6aa1333d59aa4303a131803010a400a4c0101d65e093046338a812923c08d4c57a5a813649ab474bd0e98338490ad4c3e1b804d8b25cb17c00af400a690002b506c4642b6331fb00158b497a5cd06568007301f126005889fa3c48c84089922cba264b90d2c7f0f604a08b0fcc56624643d530c0036d2143a95d6e82d336be010423327d9003e3abd363d412fcc16ee55a6a62a23e824a14a23f1f412ed95f82726aa35b48f30884ed1ff9f81f0f7cb2981b37209cc1f087056d6cd1521cecc476c00ceca91658505106d710bf2e50c12a6940de0f8c24a985011fb5c4cfc5fb132020010064c2521640b738a0560f7bf7be621301566dd728bee8b7ec58a6ec9b2aef9691c98d32c008e2256a7d7aa3549e6bf012e21cf282363306b5118fb679b70c65eb006efb5ec7a6974d5e4437c1297e8a7fec06a003746482f1a868cb5402137f2f6dcdfbc459fa3a05738683a55398c395b68b746db81dfe1b6f315aaa95fadca2466b63f5dea8e709705b7e398527cf17a505701cef86528ae66707fc2d5f762a90dc73aff0a1446554fe78d1e79f019ce04c4bf54f686751b86a4c7e617ebfb3dd1a9f88bc1463baf1c0b5bc30f616e63cefd3b51b4fb84d27d47ef26bcb5b150b42dc1251c9d4d8f96ee44178e01858ced46e6b45ed58b4c42ab5b50c3d231d40e70e4df45bdd68cbcfe62df94bb5f9f25c49255e9e7f115dcec13e0ccf0b3ace18e605f8c979d130ae6eab2d12935f4ec178ff9ae40e1c87b335622bfbe494c9edb961b3fbb781c3b568dcf1d715c47a395cef434c406ab2cee40341a2ff07b7301f97b0c9ddffa38aec3beede24cf8542b44a1c2747891e7c0070a5f6db3af1b7f1c33886bd639f27ed42aa5989bbbfbead933dddd08edfb474e464a7658d81cd67b7b8eb95251a8735e78ddb7f2181f8d8dce7db32f3ff91cb9b19d3155139e52a0b07fa75c7b0ba01303c603123e5c25edc656438bb0e13da72728c8f9aae469505632b184050a559afb4e891e833fe342fe081e9a14cc62c5eaf56151c5a79ee206eb7d2dbe46d525a0f0daab293e25312379d874f11f3fa97efee33738f17ebda9c6e43087ceffba7fc28be3df65f1576e54d72daeb59bc0f2b23d45f3c36bf93814b7f64cb04ea846d748aaa85c96310714264cb754c75c2efd357a15253797650f75e177792107bd3f698ec2cdaf7fefb6e1e1c7d9cfffc2295e21ae6fd26fc7da78d9a8e8b35db7f1df87834b9a7daf10dcc16efae54068da23a030c9aa612afc6a413de6fdd6d028dff04d16ceff5dee68eccdaa439e9b7da8c0b7966d71f7b2cb5d4dfec9f5ad989adc546d15a309c54db5edaec777f730b8e617dbe145d5e34ca0d0601b0a6bc2d2687c67a6a4a370e1c2252cf0fea72eeaae0720af27ffcb736e824396d7a380426dd6c0ce0677661ef7dd7cffa3d4a567720c1f9c3454664ef5a0b5c1d1e6c175f770a0b0be9fc9589db3b30d5f2b4b87894f67af63c638cfe85a937502d9d5a7fb5ca6276e10a070da46596ebdfffb3bf86eeb95e4a9c24d6bd121f42fbf91f9bcd2846e76fca984523a1828bc5daa38f8b6a2cb154bf7a5bc7bfee3a4b7f1789ef79dcd3d7b6f20e7c1919bbee73debcc64eeafd86ebd1c7dad035d3e71bc2ff48aa23174f78f6fd484b4c4a0dd46d3b74bf6f90e40e11679f38d1a7957048aee756cbe35f1e665346d2d75e7ebeb8690dd32aab810b62bd54c1677ae86efb43d7a1e9302d3f4171eb669b17d8f8b3da31a8bc6cd8955bcafdb3bae01854185dc7581c16f65e2123720e34bc9fe2bf8a8e307595b6f6e155a456eaa2fe7e74a08018ae79fae4f3eaa5567d1214a5db2fd8beaad345af38eb9c53da8a5e903478feacd05675f8434eeb0ec8094fc270000ffff6794568075060000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01 ${CLI} send mix config vk -c 4 -z 1f8b08000000000000ff6c517b5493e7197f9fe403a2244a89c14b0563a5e014038905d6c2985c82040aa21525440a09fd80b41069122617071228144cc7451438a0a5038695035527a52d475bb9163a540e058a041d7a86b6bb7070b43e22f8ed24883b67677ffdce73fb5dde976d4dd8814c1e1b807b88d6aa1333d59aa4303a131803010a400a4c0101d65e093046338a812923c08d4c57a5a813649ab474bd0e98338490ad4c3e1b804d8b25cb17c00af400a690002b506c4642b6331fb00158b497a5cd06568007301f126005889fa3c48c84089922cba264b90d2c7f0f604a08b0fcc56624643d530c0036d2143a95d6e82d336be010423327d9003e3abd363d412fcc16ee55a6a62a23e824a14a23f1f412ed95f82726aa35b48f30884ed1ff9f81f0f7cb2981b37209cc1f087056d6cd1521cecc476c00ceca91658505106d710bf2e50c12a6940de0f8c24a985011fb5c4cfc5fb132020010064c2521640b738a0560f7bf7be621301566dd728bee8b7ec58a6ec9b2aef9691c98d32c008e2256a7d7aa3549e6bf012e21cf282363306b5118fb679b70c65eb006efb5ec7a6974d5e4437c1297e8a7fec06a003746482f1a868cb5402137f2f6dcdfbc459fa3a05738683a55398c395b68b746db81dfe1b6f315aaa95fadca2466b63f5dea8e709705b7e398527cf17a505701cef86528ae66707fc2d5f762a90dc73aff0a1446554fe78d1e79f019ce04c4bf54f686751b86a4c7e617ebfb3dd1a9f88bc1463baf1c0b5bc30f616e63cefd3b51b4fb84d27d47ef26bcb5b150b42dc1251c9d4d8f96ee44178e01858ced46e6b45ed58b4c42ab5b50c3d231d40e70e4df45bdd68cbcfe62df94bb5f9f25c49255e9e7f115dcec13e0ccf0b3ace18e605f8c979d130ae6eab2d12935f4ec178ff9ae40e1c87b335622bfbe494c9edb961b3fbb781c3b568dcf1d715c47a395cef434c406ab2cee40341a2ff07b7301f97b0c9ddffa38aec3beede24cf8542b44a1c2747891e7c0070a5f6db3af1b7f1c33886bd639f27ed42aa5989bbbfbead933dddd08edfb474e464a7658d81cd67b7b8eb95251a8735e78ddb7f2181f8d8dce7db32f3ff91cb9b19d3155139e52a0b07fa75c7b0ba01303c603123e5c25edc656438bb0e13da72728c8f9aae469505632b184050a559afb4e891e833fe342fe081e9a14cc62c5eaf56151c5a79ee206eb7d2dbe46d525a0f0daab293e25312379d874f11f3fa97efee33738f17ebda9c6e43087ceffba7fc28be3df65f1576e54d72daeb59bc0f2b23d45f3c36bf93814b7f64cb04ea846d748aaa85c96310714264cb754c75c2efd357a15253797650f75e177792107bd3f698ec2cdaf7fefb6e1e1c7d9cfffc2295e21ae6fd26fc7da78d9a8e8b35db7f1df87834b9a7daf10dcc16efae54068da23a030c9aa612afc6a413de6fdd6d028dff04d16ceff5dee68eccdaa439e9b7da8c0b7966d71f7b2cb5d4dfec9f5ad989adc546d15a309c54db5edaec777f730b8e617dbe145d5e34ca0d0601b0a6bc2d2687c67a6a4a370e1c2252cf0fea72eeaae0720af27ffcb736e824396d7a380426dd6c0ce0677661ef7dd7cffa3d4a567720c1f9c3454664ef5a0b5c1d1e6c175f770a0b0be9fc9589db3b30d5f2b4b87894f67af63c638cfe85a937502d9d5a7fb5ca6276e10a070da46596ebdfffb3bf86eeb95e4a9c24d6bd121f42fbf91f9bcd2846e76fca984523a1828bc5daa38f8b6a2cb154bf7a5bc7bfee3a4b7f1789ef79dcd3d7b6f20e7c1919bbee73debcc64eeafd86ebd1c7dad035d3e71bc2ff48aa23174f78f6fd484b4c4a0dd46d3b74bf6f90e40e11679f38d1a7957048aee756cbe35f1e665346d2d75e7ebeb8690dd32aab810b62bd54c1677ae86efb43d7a1e9302d3f4171eb669b17d8f8b3da31a8bc6cd8955bcafdb3bae01854185dc7581c16f65e2123720e34bc9fe2bf8a8e307595b6f6e155a456eaa2fe7e74a08018ae79fae4f3eaa5567d1214a5db2fd8beaad345af38eb9c53da8a5e903478feacd05675f8434eeb0ec8094fc270000ffff6794568075060000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
...@@ -116,18 +116,65 @@ function mix_deposit() { ...@@ -116,18 +116,65 @@ function mix_deposit() {
echo "${hash}" echo "${hash}"
query_tx "${CLI}" "${hash}" query_tx "${CLI}" "${hash}"
${MIX_CLI1} mix wallet notes -a 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 query_note "${MIX_CLI1}" 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 3
${MIX_CLI2} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR query_note "${MIX_CLI2}" 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR 3
${MIX_CLI3} mix wallet notes -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k query_note "${MIX_CLI3}" 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k 3
noteReturn=$(${MIX_CLI1} mix wallet notes -a 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 | jq -r ".notes[0].noteHash")
noteAuth=$(${MIX_CLI1} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR | jq -r ".notes[0].noteHash")
notePeer=$(${MIX_CLI1} mix wallet notes -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k | jq -r ".notes[0].noteHash")
# hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/circuit/deposit/ -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -r 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01) echo "auth"
# echo "${hash}" authHash=$(${MIX_CLI2} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -s 3 | jq -r ".notes[0].noteHash")
# query_tx "${1}" "${hash}" authKey=$(${MIX_CLI2} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -s 3 | jq -r ".notes[0].secret.returnKey")
# ${MIX_CLI2} send mix auth -n 5631471018742471897033294565915884019145970028744895604889956301276708177410 -a 7922952968605110993699808851901993086405084846049488287958179300126299607225 -p ./gnark/circuit/authorize/ -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01 echo "authHash=$authHash,authKey=$authKey"
hash=$(${MIX_CLI2} send mix auth -n "$authHash" -a "$authKey" -p ./gnark/circuit/authorize/ -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${MIX_CLI2}" "${hash}"
query_note "${MIX_CLI1}" 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 1
echo "transfer to 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
transHash=$(${MIX_CLI1} mix wallet notes -a 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -s 1 | jq -r ".notes[0].noteHash")
hash=$(${MIX_CLI1} send mix transfer -m 600000000 -n "$transHash" -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -i ./gnark/circuit/transfer/input/ -o ./gnark/circuit/transfer/output/ -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
query_note "${MIX_CLI3}" 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k 1
echo "withdraw"
withdrawHash=$(${MIX_CLI3} mix wallet notes -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -s 1 | jq -r ".notes[0].noteHash")
hash=$(${MIX_CLI3} send mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/circuit/withdraw/ -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${CLI}" "${hash}"
query_note "${MIX_CLI3}" 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k 2
${CLI} account balance -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -e mix
balance=$(${CLI} account balance -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -e mix | jq -r ".balance")
if [ "${balance}" != "6.0000" ]; then
echo "account 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k should be 6.0000, real is $balance"
# exit 1
fi
}
function query_note() {
block_wait "${1}" 1
local times=200
while true; do
ret=$(${1} mix wallet notes -a "${2}" -s "${3}" | jq -r ".notes[0].status")
echo "query wallet notes addr=${2},status=$3 return ${ret} "
if [ "${ret}" != "${3}" ]; then
block_wait "${1}" 1
times=$((times - 1))
if [ $times -le 0 ]; then
echo "query notes addr=${2} failed"
exit 1
fi
else
echo "query notes addr=${2} ,status=$3 success"
${1} mix wallet notes -a "${2}" -s "${3}"
break
fi
done
} }
function query_tx() { function query_tx() {
......
package input package main
import ( import (
util "github.com/33cn/plugin/plugin/dapp/mix/cmd/gnark/circuit" util "github.com/33cn/plugin/plugin/dapp/mix/cmd/gnark/circuit"
......
package output package main
import ( import (
util "github.com/33cn/plugin/plugin/dapp/mix/cmd/gnark/circuit" util "github.com/33cn/plugin/plugin/dapp/mix/cmd/gnark/circuit"
......
...@@ -32,6 +32,7 @@ func MixCmd() *cobra.Command { ...@@ -32,6 +32,7 @@ func MixCmd() *cobra.Command {
CreateTransferRawTxCmd(), CreateTransferRawTxCmd(),
CreateWithdrawRawTxCmd(), CreateWithdrawRawTxCmd(),
CreateAuthRawTxCmd(), CreateAuthRawTxCmd(),
CreateConfigCmd(), CreateConfigCmd(),
QueryCmd(), QueryCmd(),
...@@ -54,7 +55,7 @@ func CreateConfigCmd() *cobra.Command { ...@@ -54,7 +55,7 @@ func CreateConfigCmd() *cobra.Command {
Short: "Proof parameters config to mix coin contract", Short: "Proof parameters config to mix coin contract",
} }
cmd.AddCommand(mixConfigVerifyKeyParaCmd()) cmd.AddCommand(mixConfigVerifyKeyParaCmd())
cmd.AddCommand(mixConfigAuthPubKeyParaCmd()) //cmd.AddCommand(mixConfigAuthPubKeyParaCmd())
cmd.AddCommand(mixConfigPaymentPubKeyParaCmd()) cmd.AddCommand(mixConfigPaymentPubKeyParaCmd())
return cmd return cmd
...@@ -589,10 +590,50 @@ func SecretCmd() *cobra.Command { ...@@ -589,10 +590,50 @@ func SecretCmd() *cobra.Command {
cmd.AddCommand(DecodeSecretDataCmd()) cmd.AddCommand(DecodeSecretDataCmd())
cmd.AddCommand(EncryptSecretDataCmd()) cmd.AddCommand(EncryptSecretDataCmd())
cmd.AddCommand(DecryptSecretDataCmd()) cmd.AddCommand(DecryptSecretDataCmd())
cmd.AddCommand(DecodePubInputDataCmd())
return cmd return cmd
} }
// DecodePublicInputDataCmd decode zk public data
func DecodePubInputDataCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "parse",
Short: "parse zk public input data",
Run: decodePubInput,
}
decodePubInputCmdFlags(cmd)
return cmd
}
func decodePubInputCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("data", "d", "", "public input data")
cmd.MarkFlagRequired("data")
cmd.Flags().Int32P("type", "t", 0, "type 0:deposit,1:withdraw,2:transIn,3:transOut,4:auth")
cmd.MarkFlagRequired("type")
}
func decodePubInput(cmd *cobra.Command, args []string) {
//rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
data, _ := cmd.Flags().GetString("data")
ty, _ := cmd.Flags().GetInt32("type")
v, err := mixTy.DecodePubInput(mixTy.VerifyType(ty), data)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
rst, err := json.MarshalIndent(v, "", " ")
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
fmt.Println(string(rst))
}
// EncodeSecretDataCmd get para chain status by height // EncodeSecretDataCmd get para chain status by height
func DecodeSecretDataCmd() *cobra.Command { func DecodeSecretDataCmd() *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
...@@ -750,6 +791,8 @@ func depositSecretCmdFlags(cmd *cobra.Command) { ...@@ -750,6 +791,8 @@ func depositSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins") cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.Flags().StringP("path", "p", "", "deposit circuit path ") cmd.Flags().StringP("path", "p", "", "deposit circuit path ")
cmd.Flags().Int32P("privacy", "w", 0, "get zk privacy data print, 1:print, default not")
cmd.Flags().Int32P("verify", "v", 0, "verify on chain:0 on local:1, default 0 ")
} }
...@@ -764,6 +807,8 @@ func depositSecret(cmd *cobra.Command, args []string) { ...@@ -764,6 +807,8 @@ func depositSecret(cmd *cobra.Command, args []string) {
token, _ := cmd.Flags().GetString("token") token, _ := cmd.Flags().GetString("token")
path, _ := cmd.Flags().GetString("path") path, _ := cmd.Flags().GetString("path")
privacy, _ := cmd.Flags().GetInt32("privacy")
verify, _ := cmd.Flags().GetInt32("verify")
deposit := &mixTy.DepositInfo{ deposit := &mixTy.DepositInfo{
ReceiverAddrs: targets, ReceiverAddrs: targets,
...@@ -783,6 +828,8 @@ func depositSecret(cmd *cobra.Command, args []string) { ...@@ -783,6 +828,8 @@ func depositSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec, AssetExec: assetExec,
AssetToken: token, AssetToken: token,
Title: paraName, Title: paraName,
Privacy: privacy,
Verify: verify,
} }
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil) ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
...@@ -822,6 +869,9 @@ func transferSecretCmdFlags(cmd *cobra.Command) { ...@@ -822,6 +869,9 @@ func transferSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("outpath", "o", "", "output pk file ") cmd.Flags().StringP("outpath", "o", "", "output pk file ")
cmd.MarkFlagRequired("outpath") cmd.MarkFlagRequired("outpath")
cmd.Flags().Int32P("privacy", "w", 0, "get zk privacy data print, 1:print, default not")
cmd.Flags().Int32P("verify", "v", 0, "verify on chain:0 on local:1, default 0 ")
} }
func transferSecret(cmd *cobra.Command, args []string) { func transferSecret(cmd *cobra.Command, args []string) {
...@@ -839,6 +889,9 @@ func transferSecret(cmd *cobra.Command, args []string) { ...@@ -839,6 +889,9 @@ func transferSecret(cmd *cobra.Command, args []string) {
assetExec, _ := cmd.Flags().GetString("exec") assetExec, _ := cmd.Flags().GetString("exec")
token, _ := cmd.Flags().GetString("token") token, _ := cmd.Flags().GetString("token")
privacy, _ := cmd.Flags().GetInt32("privacy")
verify, _ := cmd.Flags().GetInt32("verify")
input := &mixTy.TransferInputTxReq{ input := &mixTy.TransferInputTxReq{
NoteHashs: noteHash, NoteHashs: noteHash,
ZkPath: inpath, ZkPath: inpath,
...@@ -867,6 +920,8 @@ func transferSecret(cmd *cobra.Command, args []string) { ...@@ -867,6 +920,8 @@ func transferSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec, AssetExec: assetExec,
AssetToken: token, AssetToken: token,
Title: paraName, Title: paraName,
Privacy: privacy,
Verify: verify,
} }
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil) ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
...@@ -896,6 +951,10 @@ func withdrawSecretCmdFlags(cmd *cobra.Command) { ...@@ -896,6 +951,10 @@ func withdrawSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("path", "p", "", "withdraw pk file ") cmd.Flags().StringP("path", "p", "", "withdraw pk file ")
cmd.MarkFlagRequired("path") cmd.MarkFlagRequired("path")
cmd.Flags().Int32P("privacy", "w", 0, "get zk privacy data print, 1:print, default not")
cmd.Flags().Int32P("verify", "v", 0, "verify on chain:0 on local:1, default 0 ")
} }
func withdrawSecret(cmd *cobra.Command, args []string) { func withdrawSecret(cmd *cobra.Command, args []string) {
...@@ -908,6 +967,8 @@ func withdrawSecret(cmd *cobra.Command, args []string) { ...@@ -908,6 +967,8 @@ func withdrawSecret(cmd *cobra.Command, args []string) {
token, _ := cmd.Flags().GetString("token") token, _ := cmd.Flags().GetString("token")
path, _ := cmd.Flags().GetString("path") path, _ := cmd.Flags().GetString("path")
privacy, _ := cmd.Flags().GetInt32("privacy")
verify, _ := cmd.Flags().GetInt32("verify")
req := &mixTy.WithdrawTxReq{ req := &mixTy.WithdrawTxReq{
TotalAmount: amount, TotalAmount: amount,
...@@ -921,6 +982,8 @@ func withdrawSecret(cmd *cobra.Command, args []string) { ...@@ -921,6 +982,8 @@ func withdrawSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec, AssetExec: assetExec,
AssetToken: token, AssetToken: token,
Title: paraName, Title: paraName,
Privacy: privacy,
Verify: verify,
} }
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil) ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
...@@ -951,6 +1014,9 @@ func authSecretCmdFlags(cmd *cobra.Command) { ...@@ -951,6 +1014,9 @@ func authSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("path", "p", "", "auth path file ") cmd.Flags().StringP("path", "p", "", "auth path file ")
cmd.MarkFlagRequired("path") cmd.MarkFlagRequired("path")
cmd.Flags().Int32P("privacy", "w", 0, "get zk privacy data print, 1:print, default not")
cmd.Flags().Int32P("verify", "v", 0, "verify on chain:0 on local:1, default 0 ")
} }
func authSecret(cmd *cobra.Command, args []string) { func authSecret(cmd *cobra.Command, args []string) {
...@@ -964,6 +1030,9 @@ func authSecret(cmd *cobra.Command, args []string) { ...@@ -964,6 +1030,9 @@ func authSecret(cmd *cobra.Command, args []string) {
path, _ := cmd.Flags().GetString("path") path, _ := cmd.Flags().GetString("path")
privacy, _ := cmd.Flags().GetInt32("privacy")
verify, _ := cmd.Flags().GetInt32("verify")
req := &mixTy.AuthTxReq{ req := &mixTy.AuthTxReq{
AuthorizeToAddr: toKey, AuthorizeToAddr: toKey,
NoteHash: noteHash, NoteHash: noteHash,
...@@ -976,6 +1045,8 @@ func authSecret(cmd *cobra.Command, args []string) { ...@@ -976,6 +1045,8 @@ func authSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec, AssetExec: assetExec,
AssetToken: token, AssetToken: token,
Title: paraName, Title: paraName,
Privacy: privacy,
Verify: verify,
} }
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil) ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
......
...@@ -26,12 +26,12 @@ func setPrefix() { ...@@ -26,12 +26,12 @@ func setPrefix() {
authPubKeys = "mavl-mix-auth-pubkeys-" authPubKeys = "mavl-mix-auth-pubkeys-"
paymentPubKey = "mavl-mix-payment-pubkey-" paymentPubKey = "mavl-mix-payment-pubkey-"
commitTreeArchiveRoots = "mavl-mix-commitTree-roots-archive-" commitTreeArchiveRoots = "mavl-mix-commitTree-roots-archive-"
commitTreeCurrentRoots = "mavl-mix-commitTree-current-roots" commitTreeCurrentRoots = "mavl-mix-commitTree-roots-current-"
commitTreeCurrentLeaves = "mavl-mix-commitTree-current-leaves-" commitTreeCurrentLeaves = "mavl-mix-commitTree-current-leaves-"
commitTreeRootLeaves = "mavl-mix-commitTree-rootLeaves-" commitTreeRootLeaves = "mavl-mix-commitTree-rootLeaves-"
authorizeHash = "mavl-mix-authorizeHash" authorizeHash = "mavl-mix-authorizeHash"
authorizeSpendHash = "mavl-mix-authorizeHash-spend-" authorizeSpendHash = "mavl-mix-authorizeSpendHash-"
nullifierHash = "mavl-mix-nullifierHash" nullifierHash = "mavl-mix-nullifierHash"
} }
......
...@@ -69,5 +69,5 @@ func (m *Mix) Query_PaymentPubKey(addr *types.ReqString) (types.Message, error) ...@@ -69,5 +69,5 @@ func (m *Mix) Query_PaymentPubKey(addr *types.ReqString) (types.Message, error)
// Query_PaymentPubKey 批量查询 // Query_PaymentPubKey 批量查询
func (m *Mix) Query_VerifyProof(req *mixTy.VerifyProofInfo) (types.Message, error) { func (m *Mix) Query_VerifyProof(req *mixTy.VerifyProofInfo) (types.Message, error) {
return nil, zkProofVerify(m.GetStateDB(), req.Proof, req.Ty) return &types.ReqNil{}, zkProofVerify(m.GetStateDB(), req.Proof, req.Ty)
} }
...@@ -385,6 +385,8 @@ message CreateRawTxReq{ ...@@ -385,6 +385,8 @@ message CreateRawTxReq{
string assetExec = 2; string assetExec = 2;
string assetToken = 3; string assetToken = 3;
string title = 6; //平行链名字 string title = 6; //平行链名字
int32 privacy = 7; //1:打印隐私数据
int32 verify = 8; //0:链上验证,1:本地验证
} }
......
...@@ -2976,6 +2976,8 @@ type CreateRawTxReq struct { ...@@ -2976,6 +2976,8 @@ type CreateRawTxReq struct {
AssetExec string `protobuf:"bytes,2,opt,name=assetExec,proto3" json:"assetExec,omitempty"` AssetExec string `protobuf:"bytes,2,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetToken string `protobuf:"bytes,3,opt,name=assetToken,proto3" json:"assetToken,omitempty"` AssetToken string `protobuf:"bytes,3,opt,name=assetToken,proto3" json:"assetToken,omitempty"`
Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"` Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"`
Privacy int32 `protobuf:"varint,7,opt,name=privacy,proto3" json:"privacy,omitempty"`
Verify int32 `protobuf:"varint,8,opt,name=verify,proto3" json:"verify,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
...@@ -3041,6 +3043,20 @@ func (m *CreateRawTxReq) GetTitle() string { ...@@ -3041,6 +3043,20 @@ func (m *CreateRawTxReq) GetTitle() string {
return "" return ""
} }
func (m *CreateRawTxReq) GetPrivacy() int32 {
if m != nil {
return m.Privacy
}
return 0
}
func (m *CreateRawTxReq) GetVerify() int32 {
if m != nil {
return m.Verify
}
return 0
}
type PaymentKeysReq struct { type PaymentKeysReq struct {
PrivKey string `protobuf:"bytes,1,opt,name=privKey,proto3" json:"privKey,omitempty"` PrivKey string `protobuf:"bytes,1,opt,name=privKey,proto3" json:"privKey,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
...@@ -3799,168 +3815,169 @@ func init() { ...@@ -3799,168 +3815,169 @@ func init() {
} }
var fileDescriptor_5c21d519a9be369a = []byte{ var fileDescriptor_5c21d519a9be369a = []byte{
// 2567 bytes of a gzipped FileDescriptorProto // 2588 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4b, 0x6f, 0x1b, 0xc9, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4b, 0x6f, 0x1b, 0xc9,
0x11, 0xd6, 0x0c, 0x5f, 0x62, 0x89, 0x94, 0xa8, 0xb6, 0x57, 0x4b, 0x0b, 0x1b, 0x43, 0xe9, 0x75, 0x11, 0xd6, 0x0c, 0x5f, 0x62, 0x89, 0x94, 0xa8, 0xb6, 0x57, 0x4b, 0x0b, 0x1b, 0x43, 0xe9, 0x75,
0xd6, 0x5a, 0x39, 0x70, 0x16, 0xf2, 0x66, 0x83, 0x00, 0x59, 0x27, 0x5c, 0x93, 0xb2, 0xb8, 0xb6, 0xd6, 0x5a, 0x39, 0x70, 0x16, 0xf2, 0x66, 0x83, 0x00, 0x59, 0x27, 0x5c, 0x93, 0xb2, 0xb8, 0xb6,
0x28, 0xa1, 0x45, 0xf9, 0xb5, 0xd8, 0x00, 0x63, 0xb2, 0x25, 0x0d, 0x4c, 0x71, 0xe8, 0x99, 0xa1, 0x28, 0xa1, 0x45, 0xf9, 0xb5, 0xd8, 0x00, 0x63, 0xb2, 0x25, 0x0d, 0x4c, 0x71, 0xe8, 0x99, 0xa1,
0x4c, 0xed, 0x2d, 0x48, 0x80, 0x20, 0xb7, 0x00, 0x09, 0x90, 0x5b, 0x80, 0x9c, 0xb2, 0xe7, 0x20, 0x4c, 0xed, 0x2d, 0x48, 0x80, 0x20, 0xb7, 0x00, 0x39, 0xe4, 0x16, 0x20, 0xa7, 0xec, 0x39, 0x08,
0xc8, 0x21, 0x3f, 0x21, 0xe7, 0xfc, 0x80, 0xdc, 0x72, 0xcf, 0x2f, 0x08, 0xaa, 0x1f, 0x33, 0xdd, 0x72, 0xc8, 0x0f, 0xc8, 0x21, 0xe7, 0xfc, 0x80, 0xdc, 0x72, 0xcf, 0x2f, 0x08, 0xaa, 0x1f, 0x33,
0x23, 0xea, 0xe5, 0x6c, 0x80, 0x1c, 0x72, 0x53, 0xd5, 0x54, 0x57, 0x57, 0x7d, 0xf5, 0xe8, 0xea, 0xdd, 0x23, 0xea, 0xe5, 0x6c, 0x80, 0x1c, 0x72, 0x63, 0xd5, 0x54, 0xd7, 0x54, 0x7d, 0x55, 0x5d,
0xa6, 0xa0, 0x7c, 0xe4, 0x4f, 0xee, 0x8e, 0xc2, 0x20, 0x0e, 0x48, 0x21, 0x3e, 0x19, 0xf1, 0x68, 0x5d, 0x5d, 0x43, 0x28, 0x1f, 0xf9, 0x93, 0xbb, 0xa3, 0x30, 0x88, 0x03, 0x52, 0x88, 0x4f, 0x46,
0xb9, 0xd2, 0x0b, 0x8e, 0x8e, 0x82, 0xa1, 0x64, 0x2e, 0x2f, 0xc6, 0xa1, 0x37, 0x8c, 0xbc, 0x5e, 0x3c, 0x5a, 0xae, 0xf4, 0x82, 0xa3, 0xa3, 0x60, 0x28, 0x99, 0xcb, 0x8b, 0x71, 0xe8, 0x0d, 0x23,
0xec, 0x6b, 0x16, 0xfd, 0x1c, 0xe6, 0x5e, 0xbc, 0x7a, 0xc2, 0x43, 0x7f, 0xff, 0xe4, 0x11, 0x3f, 0xaf, 0x17, 0xfb, 0x9a, 0x45, 0x3f, 0x87, 0xb9, 0x17, 0xaf, 0x9e, 0xf0, 0xd0, 0xdf, 0x3f, 0x79,
0x21, 0xdf, 0x81, 0x3c, 0x2e, 0xac, 0x3b, 0x2b, 0xce, 0xea, 0xfc, 0xfa, 0xe2, 0x5d, 0xa1, 0xe5, 0xc4, 0x4f, 0xc8, 0x77, 0x20, 0x8f, 0x0b, 0xeb, 0xce, 0x8a, 0xb3, 0x3a, 0xbf, 0xbe, 0x78, 0x57,
0xae, 0xfc, 0xde, 0x3d, 0x19, 0x71, 0x26, 0x3e, 0x93, 0xeb, 0x50, 0x38, 0xf6, 0x06, 0x63, 0x5e, 0x68, 0xb9, 0x2b, 0x9f, 0x77, 0x4f, 0x46, 0x9c, 0x89, 0xc7, 0xe4, 0x3a, 0x14, 0x8e, 0xbd, 0xc1,
0x77, 0x57, 0x9c, 0xd5, 0x32, 0x93, 0x04, 0xfd, 0x04, 0x2a, 0x86, 0xae, 0x88, 0x7c, 0x00, 0xf9, 0x98, 0xd7, 0xdd, 0x15, 0x67, 0xb5, 0xcc, 0x24, 0x41, 0x3f, 0x81, 0x8a, 0xa1, 0x2b, 0x22, 0x1f,
0xbe, 0x17, 0x7b, 0x75, 0x67, 0x25, 0xb7, 0x3a, 0xb7, 0x4e, 0x94, 0x32, 0x43, 0x84, 0x89, 0xef, 0x40, 0xbe, 0xef, 0xc5, 0x5e, 0xdd, 0x59, 0xc9, 0xad, 0xce, 0xad, 0x13, 0xa5, 0xcc, 0x10, 0x61,
0xf4, 0x26, 0xcc, 0x36, 0xc6, 0xf1, 0xa1, 0x58, 0x43, 0x20, 0xff, 0x8a, 0x9f, 0x44, 0x62, 0x4d, 0xe2, 0x39, 0xbd, 0x09, 0xb3, 0x8d, 0x71, 0x7c, 0x28, 0xd6, 0x10, 0xc8, 0xbf, 0xe2, 0x27, 0x91,
0x99, 0x89, 0xbf, 0xe9, 0x4b, 0x80, 0x1d, 0xef, 0xe4, 0x88, 0x0f, 0x63, 0x34, 0x91, 0x40, 0xde, 0x58, 0x53, 0x66, 0xe2, 0x37, 0x7d, 0x09, 0xb0, 0xe3, 0x9d, 0x1c, 0xf1, 0x61, 0x8c, 0x26, 0x12,
0xeb, 0xf7, 0x43, 0x61, 0x62, 0x99, 0x89, 0xbf, 0xc9, 0x0a, 0xcc, 0x85, 0xbc, 0xc7, 0xfd, 0x63, 0xc8, 0x7b, 0xfd, 0x7e, 0x28, 0x4c, 0x2c, 0x33, 0xf1, 0x9b, 0xac, 0xc0, 0x5c, 0xc8, 0x7b, 0xdc,
0x1e, 0x3e, 0xe2, 0x27, 0xca, 0x2a, 0x93, 0x45, 0x6e, 0x02, 0xf0, 0x61, 0x2f, 0x3c, 0x19, 0xa1, 0x3f, 0xe6, 0xe1, 0x23, 0x7e, 0xa2, 0xac, 0x32, 0x59, 0xe4, 0x26, 0x00, 0x1f, 0xf6, 0xc2, 0x93,
0x8e, 0x7a, 0x4e, 0x08, 0x18, 0x1c, 0xfa, 0x2f, 0x07, 0x16, 0xb6, 0xfc, 0xc9, 0x83, 0x60, 0xb8, 0x11, 0xea, 0xa8, 0xe7, 0x84, 0x80, 0xc1, 0xa1, 0xff, 0x72, 0x60, 0x61, 0xcb, 0x9f, 0x3c, 0x08,
0xef, 0x1f, 0x34, 0x04, 0x42, 0xe4, 0x16, 0xb8, 0xdd, 0x13, 0x05, 0xc5, 0x75, 0x65, 0x7d, 0x22, 0x86, 0xfb, 0xfe, 0x41, 0x43, 0x20, 0x44, 0x6e, 0x81, 0xdb, 0x3d, 0x51, 0x50, 0x5c, 0x57, 0xd6,
0x23, 0xd0, 0x70, 0xbb, 0x27, 0xe4, 0x0e, 0x14, 0xa5, 0xbc, 0xd8, 0x76, 0x7e, 0xfd, 0x5a, 0x56, 0x27, 0x32, 0x02, 0x0d, 0xb7, 0x7b, 0x42, 0xee, 0x40, 0x51, 0xca, 0x8b, 0xd7, 0xce, 0xaf, 0x5f,
0xb2, 0xd1, 0x8b, 0x99, 0x12, 0x21, 0xeb, 0x50, 0x3e, 0xd6, 0xde, 0x0b, 0x2b, 0xa6, 0xe2, 0xb2, 0xcb, 0x4a, 0x36, 0x7a, 0x31, 0x53, 0x22, 0x64, 0x1d, 0xca, 0xc7, 0xda, 0x7b, 0x61, 0xc5, 0x54,
0x39, 0xc3, 0x52, 0x31, 0xb2, 0x0c, 0x25, 0x4f, 0xc2, 0x53, 0xcf, 0xa3, 0xdd, 0x9b, 0x33, 0x4c, 0x5c, 0x36, 0x67, 0x58, 0x2a, 0x46, 0x96, 0xa1, 0xe4, 0x49, 0x78, 0xea, 0x79, 0xb4, 0x7b, 0x73,
0x33, 0xc8, 0x3d, 0x80, 0x51, 0x02, 0x4d, 0xbd, 0x20, 0x14, 0xea, 0xa8, 0xa5, 0x98, 0x6d, 0xce, 0x86, 0x69, 0x06, 0xb9, 0x07, 0x30, 0x4a, 0xa0, 0xa9, 0x17, 0x84, 0x42, 0x1d, 0xb5, 0x14, 0xb3,
0x30, 0x43, 0xec, 0xb3, 0x92, 0x8a, 0x1e, 0xfd, 0x11, 0xcc, 0x36, 0x37, 0x77, 0x79, 0x2f, 0xe4, 0xcd, 0x19, 0x66, 0x88, 0x7d, 0x56, 0x52, 0xd1, 0xa3, 0x3f, 0x82, 0xd9, 0xe6, 0xe6, 0x2e, 0xef,
0x31, 0xa9, 0x43, 0x69, 0xc4, 0x25, 0x7c, 0x12, 0x59, 0x4d, 0x92, 0x25, 0x28, 0x46, 0x42, 0x46, 0x85, 0x3c, 0x26, 0x75, 0x28, 0x8d, 0xb8, 0x84, 0x4f, 0x22, 0xab, 0x49, 0xb2, 0x04, 0xc5, 0x48,
0xe1, 0xaa, 0x28, 0xca, 0xa1, 0xaa, 0x57, 0x3f, 0x0c, 0x83, 0xf1, 0x88, 0x2c, 0xc3, 0xac, 0x86, 0xc8, 0x28, 0x5c, 0x15, 0x45, 0x39, 0x54, 0xf5, 0xea, 0x87, 0x61, 0x30, 0x1e, 0x91, 0x65, 0x98,
0x5c, 0xe9, 0x48, 0x68, 0xf9, 0x2d, 0x1e, 0x87, 0x43, 0x1e, 0x2a, 0x35, 0x09, 0x4d, 0xde, 0x83, 0xd5, 0x90, 0x2b, 0x1d, 0x09, 0x2d, 0x9f, 0xc5, 0xe3, 0x70, 0xc8, 0x43, 0xa5, 0x26, 0xa1, 0xc9,
0x32, 0xfa, 0x13, 0x84, 0xfe, 0x57, 0x5c, 0x85, 0x26, 0x65, 0xd0, 0x31, 0x66, 0xe8, 0x4e, 0x18, 0x7b, 0x50, 0x46, 0x7f, 0x82, 0xd0, 0xff, 0x8a, 0xab, 0xd0, 0xa4, 0x0c, 0x3a, 0xc6, 0x0c, 0xdd,
0x04, 0xfb, 0xed, 0xe1, 0x7e, 0x80, 0xa9, 0x37, 0x42, 0x42, 0xed, 0x20, 0x09, 0x4c, 0x80, 0xd1, 0x09, 0x83, 0x60, 0xbf, 0x3d, 0xdc, 0x0f, 0x30, 0xf5, 0x46, 0x48, 0xa8, 0x37, 0x48, 0x02, 0x13,
0xf8, 0xe5, 0xc0, 0xef, 0xb5, 0x87, 0xa3, 0xb1, 0x36, 0xd4, 0x64, 0x91, 0xbb, 0x50, 0x92, 0x76, 0x60, 0x34, 0x7e, 0x39, 0xf0, 0x7b, 0xed, 0xe1, 0x68, 0xac, 0x0d, 0x35, 0x59, 0xe4, 0x2e, 0x94,
0x47, 0x0a, 0x77, 0x1d, 0x51, 0xcb, 0x07, 0xa6, 0x85, 0xe8, 0x7d, 0xa8, 0x6d, 0xf9, 0x93, 0x26, 0xa4, 0xdd, 0x91, 0xc2, 0x5d, 0x47, 0xd4, 0xf2, 0x81, 0x69, 0x21, 0x7a, 0x1f, 0x6a, 0x5b, 0xfe,
0x1f, 0x05, 0x91, 0x1f, 0xab, 0xe8, 0xad, 0x41, 0x51, 0x6c, 0x17, 0x9d, 0x4a, 0xe9, 0xc4, 0x3e, 0xa4, 0xc9, 0x47, 0x41, 0xe4, 0xc7, 0x2a, 0x7a, 0x6b, 0x50, 0x14, 0xaf, 0x8b, 0x4e, 0xa5, 0x74,
0xa6, 0x24, 0xe8, 0xef, 0x1c, 0x58, 0xdc, 0xf2, 0x27, 0x5d, 0xac, 0xb8, 0x7d, 0x1e, 0xa6, 0x1a, 0x62, 0x1f, 0x53, 0x12, 0xf4, 0xb7, 0x0e, 0x2c, 0x6e, 0xf9, 0x93, 0x2e, 0xee, 0xb8, 0x7d, 0x1e,
0x7c, 0x34, 0xe7, 0x5c, 0x0d, 0x52, 0x02, 0x65, 0x83, 0x71, 0xac, 0xdd, 0x39, 0x43, 0x56, 0x4a, 0xa6, 0x1a, 0x7c, 0x34, 0xe7, 0x5c, 0x0d, 0x52, 0x02, 0x65, 0x83, 0x71, 0xac, 0xdd, 0x39, 0x43,
0xa0, 0x6c, 0xef, 0xd0, 0x1b, 0x1e, 0xf0, 0x53, 0x49, 0x65, 0xc8, 0x4a, 0x09, 0xfa, 0x54, 0x18, 0x56, 0x4a, 0xa0, 0x6c, 0xef, 0xd0, 0x1b, 0x1e, 0xf0, 0x53, 0x49, 0x65, 0xc8, 0x4a, 0x09, 0xfa,
0xf6, 0xd4, 0x8f, 0x0f, 0xfb, 0xa1, 0xf7, 0x46, 0x19, 0xb6, 0x04, 0x45, 0xef, 0x28, 0x18, 0x0f, 0x54, 0x18, 0xf6, 0xd4, 0x8f, 0x0f, 0xfb, 0xa1, 0xf7, 0x46, 0x19, 0xb6, 0x04, 0x45, 0xef, 0x28,
0x63, 0x81, 0x6b, 0x9e, 0x29, 0xca, 0x70, 0xd9, 0xbd, 0xd0, 0xe5, 0xfb, 0x40, 0xb6, 0xfc, 0x49, 0x18, 0x0f, 0x63, 0x81, 0x6b, 0x9e, 0x29, 0xca, 0x70, 0xd9, 0xbd, 0xd0, 0xe5, 0xfb, 0x40, 0xb6,
0x43, 0x47, 0x4e, 0x69, 0x5e, 0x35, 0x03, 0x36, 0x5d, 0x81, 0x14, 0xa0, 0x7f, 0x71, 0xa1, 0x8c, 0xfc, 0x49, 0x43, 0x47, 0x4e, 0x69, 0x5e, 0x35, 0x03, 0x36, 0x5d, 0x81, 0x14, 0xa0, 0x7f, 0x76,
0x0a, 0xe4, 0xba, 0x79, 0x70, 0x63, 0x99, 0x8b, 0x05, 0xe6, 0xc6, 0x27, 0xe4, 0x23, 0x28, 0xf6, 0xa1, 0x8c, 0x0a, 0xe4, 0xba, 0x79, 0x70, 0x63, 0x99, 0x8b, 0x05, 0xe6, 0xc6, 0x27, 0xe4, 0x23,
0x44, 0x3d, 0x29, 0x38, 0x96, 0xa6, 0xd4, 0x99, 0x1f, 0x0c, 0x37, 0x67, 0x98, 0x92, 0x23, 0xf7, 0x28, 0xf6, 0xc4, 0x7e, 0x52, 0x70, 0x2c, 0x4d, 0xd9, 0x67, 0x7e, 0x30, 0xdc, 0x9c, 0x61, 0x4a,
0xa0, 0xd4, 0x97, 0xf1, 0x53, 0xa8, 0xbc, 0x9b, 0x2e, 0xb1, 0x02, 0x8b, 0x15, 0xa5, 0x24, 0xc9, 0x8e, 0xdc, 0x83, 0x52, 0x5f, 0xc6, 0x4f, 0xa1, 0xf2, 0x6e, 0xba, 0xc4, 0x0a, 0x2c, 0xee, 0x28,
0x27, 0x30, 0xfb, 0x46, 0x41, 0x23, 0xca, 0x6d, 0x6e, 0xbd, 0x9e, 0xae, 0xb2, 0x41, 0xdb, 0x9c, 0x25, 0x49, 0x3e, 0x81, 0xd9, 0x37, 0x0a, 0x1a, 0xb1, 0xdd, 0xe6, 0xd6, 0xeb, 0xe9, 0x2a, 0x1b,
0x61, 0x89, 0x2c, 0xae, 0x8b, 0x55, 0xac, 0x55, 0x1d, 0x1a, 0xeb, 0xec, 0x2c, 0xc0, 0x75, 0x5a, 0xb4, 0xcd, 0x19, 0x96, 0xc8, 0xe2, 0xba, 0x58, 0xc5, 0x5a, 0xed, 0x43, 0x63, 0x9d, 0x9d, 0x05,
0x96, 0xfc, 0xd0, 0x4c, 0xfe, 0xa2, 0x58, 0x78, 0x23, 0x5d, 0x98, 0x01, 0x13, 0x1b, 0x43, 0x22, 0xb8, 0x4e, 0xcb, 0x92, 0x1f, 0x9a, 0xc9, 0x5f, 0x14, 0x0b, 0x6f, 0xa4, 0x0b, 0x33, 0x60, 0x62,
0x9d, 0xd6, 0xf1, 0x26, 0x10, 0xe5, 0xcf, 0x8e, 0x91, 0xf1, 0xcb, 0x30, 0x3b, 0x0c, 0x62, 0xbe, 0x61, 0x48, 0xa4, 0xd3, 0x7d, 0xbc, 0x09, 0x44, 0xf9, 0xb3, 0x63, 0x64, 0xfc, 0x32, 0xcc, 0x0e,
0xe9, 0x45, 0x87, 0xba, 0x1c, 0x35, 0x6d, 0x84, 0x5b, 0xd5, 0xb4, 0xa4, 0xe8, 0x1f, 0x1d, 0xb8, 0x83, 0x98, 0x6f, 0x7a, 0xd1, 0xa1, 0xde, 0x8e, 0x9a, 0x36, 0xc2, 0xad, 0xf6, 0xb4, 0xa4, 0xe8,
0xa6, 0x9d, 0x34, 0x75, 0x51, 0xa8, 0xc4, 0x21, 0xe7, 0x2c, 0x08, 0x62, 0x43, 0x9f, 0xc5, 0x23, 0x1f, 0x1c, 0xb8, 0xa6, 0x9d, 0x34, 0x75, 0x51, 0xa8, 0xc4, 0x21, 0xe7, 0x2c, 0x08, 0x62, 0x43,
0xb7, 0xa0, 0x3a, 0x1c, 0x0f, 0x06, 0xfe, 0xbe, 0xcf, 0x43, 0x21, 0x24, 0x55, 0xdb, 0x4c, 0x72, 0x9f, 0xc5, 0x23, 0xb7, 0xa0, 0x3a, 0x1c, 0x0f, 0x06, 0xfe, 0xbe, 0xcf, 0x43, 0x21, 0x24, 0x55,
0x17, 0x48, 0xe2, 0xc1, 0xee, 0x88, 0x0f, 0xfb, 0x42, 0x54, 0x56, 0xfd, 0x94, 0x2f, 0x86, 0xa5, 0xdb, 0x4c, 0x72, 0x17, 0x48, 0xe2, 0xc1, 0xee, 0x88, 0x0f, 0xfb, 0x42, 0x54, 0xee, 0xfa, 0x29,
0x79, 0xcb, 0xd2, 0x7f, 0x38, 0x50, 0xd7, 0xb0, 0x0a, 0x1b, 0xdf, 0xc2, 0xdc, 0xe8, 0xd0, 0xe7, 0x4f, 0x0c, 0x4b, 0xf3, 0x96, 0xa5, 0xff, 0x70, 0xa0, 0xae, 0x61, 0x15, 0x36, 0xbe, 0x85, 0xb9,
0x83, 0x7e, 0x43, 0x28, 0x7c, 0xa6, 0xcd, 0xb5, 0x98, 0x59, 0xa9, 0xe7, 0xca, 0x52, 0x9b, 0x79, 0xd1, 0xa1, 0xcf, 0x07, 0xfd, 0x86, 0x50, 0xf8, 0x4c, 0x9b, 0x6b, 0x31, 0xb3, 0x52, 0xcf, 0x95,
0x86, 0x53, 0xf9, 0x33, 0x9d, 0x3a, 0x05, 0x55, 0x61, 0x0a, 0x54, 0xf4, 0xe7, 0x0e, 0xdc, 0xd0, 0xa5, 0x36, 0xf3, 0x0c, 0xa7, 0xf2, 0x67, 0x3a, 0x75, 0x0a, 0xaa, 0xc2, 0x14, 0xa8, 0xe8, 0xcf,
0x2e, 0x6e, 0x8b, 0x3a, 0xbf, 0x6c, 0x78, 0xbf, 0x41, 0xdf, 0xe8, 0x5f, 0x1d, 0xb8, 0x9e, 0xa4, 0x1d, 0xb8, 0xa1, 0x5d, 0xdc, 0x16, 0xfb, 0xfc, 0xb2, 0xe1, 0xfd, 0x06, 0x7d, 0xa3, 0x7f, 0x71,
0xe1, 0x55, 0x41, 0x5e, 0x85, 0x05, 0xcf, 0x58, 0x9b, 0x1e, 0xce, 0x59, 0x36, 0x1a, 0x93, 0xb0, 0xe0, 0x7a, 0x92, 0x86, 0x57, 0x05, 0x79, 0x15, 0x16, 0x3c, 0x63, 0x6d, 0x7a, 0x38, 0x67, 0xd9,
0x8c, 0x94, 0xb0, 0x99, 0x57, 0x05, 0x9a, 0xfe, 0x14, 0x16, 0xe4, 0xa9, 0x9a, 0x1e, 0x20, 0xdf, 0x68, 0x4c, 0xc2, 0x32, 0x52, 0xc2, 0x66, 0x5e, 0x15, 0x68, 0xfa, 0x53, 0x58, 0x90, 0xa7, 0x6a,
0x4e, 0xfa, 0xca, 0xd4, 0x01, 0x07, 0x5b, 0x4d, 0xd2, 0xb2, 0xdc, 0x8b, 0x5a, 0xd6, 0x4f, 0x00, 0x7a, 0x80, 0x7c, 0x3b, 0xa9, 0x2b, 0x53, 0x1b, 0x1c, 0x2c, 0x35, 0x49, 0xc9, 0x72, 0x2f, 0x2a,
0x5a, 0x13, 0x3f, 0x8a, 0x9f, 0x60, 0x1d, 0xe2, 0x41, 0x96, 0x44, 0x50, 0xc1, 0x91, 0x32, 0xf0, 0x59, 0x3f, 0x01, 0x68, 0x4d, 0xfc, 0x28, 0x7e, 0x82, 0xfb, 0x10, 0x0f, 0xb2, 0x24, 0x82, 0x0a,
0xe4, 0xe2, 0x28, 0x2b, 0xb4, 0xce, 0x32, 0x49, 0xd0, 0x35, 0xa8, 0x3d, 0x08, 0x8e, 0x8e, 0xfc, 0x8e, 0x94, 0x81, 0x27, 0x17, 0x47, 0x59, 0xa1, 0x75, 0x96, 0x49, 0x82, 0xae, 0x41, 0xed, 0x41,
0xb8, 0x1b, 0x72, 0xfe, 0x98, 0x7b, 0xc7, 0x3c, 0xc2, 0x9c, 0x1f, 0x88, 0xbf, 0xc4, 0x29, 0x51, 0x70, 0x74, 0xe4, 0xc7, 0xdd, 0x90, 0xf3, 0xc7, 0xdc, 0x3b, 0xe6, 0x11, 0xe6, 0xfc, 0x40, 0xfc,
0x61, 0x8a, 0xa2, 0xb7, 0x61, 0x21, 0x95, 0x45, 0x8c, 0x23, 0x54, 0x1a, 0xe2, 0x1f, 0x4a, 0x52, 0x12, 0xa7, 0x44, 0x85, 0x29, 0x8a, 0xde, 0x86, 0x85, 0x54, 0x16, 0x31, 0x8e, 0x50, 0x69, 0x88,
0x12, 0xf4, 0x0f, 0x8e, 0x29, 0xb9, 0x13, 0x06, 0xc7, 0x5c, 0x9c, 0xc0, 0x76, 0xa8, 0x12, 0x1a, 0x3f, 0x94, 0xa4, 0x24, 0xe8, 0xef, 0x1d, 0x53, 0x72, 0x27, 0x0c, 0x8e, 0xb9, 0x38, 0x81, 0xed,
0xbf, 0x09, 0x7f, 0x76, 0xc5, 0x21, 0x8f, 0x93, 0x57, 0x42, 0xe3, 0xe4, 0x34, 0x92, 0x6e, 0xf7, 0x50, 0x25, 0x34, 0x3e, 0x13, 0xfe, 0xec, 0x8a, 0x43, 0x1e, 0x3b, 0xaf, 0x84, 0xc6, 0xce, 0x69,
0xf9, 0x44, 0x44, 0xa5, 0xca, 0x0c, 0x8e, 0x74, 0xfa, 0x48, 0x5a, 0x2e, 0x22, 0x51, 0x65, 0x29, 0x24, 0xdd, 0xee, 0xf3, 0x89, 0x88, 0x4a, 0x95, 0x19, 0x1c, 0xe9, 0xf4, 0x91, 0xb4, 0x5c, 0x44,
0x03, 0xc7, 0x8a, 0x43, 0x3e, 0x18, 0xf1, 0x30, 0xaa, 0x17, 0x56, 0x72, 0xab, 0x55, 0xa6, 0x49, 0xa2, 0xca, 0x52, 0x06, 0xb6, 0x15, 0x87, 0x7c, 0x30, 0xe2, 0x61, 0x54, 0x2f, 0xac, 0xe4, 0x56,
0xda, 0x82, 0x39, 0x34, 0x4e, 0xa0, 0xc9, 0x5f, 0x5f, 0x64, 0xde, 0x80, 0x7b, 0xfb, 0x46, 0x53, 0xab, 0x4c, 0x93, 0xb4, 0x05, 0x73, 0x68, 0x9c, 0x40, 0x93, 0xbf, 0xbe, 0xc8, 0xbc, 0x01, 0xf7,
0x49, 0x68, 0xfa, 0x01, 0x54, 0x04, 0x72, 0x7e, 0x14, 0x33, 0x1e, 0x8d, 0x32, 0xd8, 0x95, 0x13, 0xf6, 0x8d, 0xa2, 0x92, 0xd0, 0xf4, 0x03, 0xa8, 0x08, 0xe4, 0xfc, 0x28, 0x66, 0x3c, 0x1a, 0x65,
0xec, 0x1e, 0xc3, 0x7c, 0x3a, 0x10, 0xed, 0x78, 0x7e, 0x88, 0x8e, 0xa9, 0xf1, 0x24, 0x1d, 0x7a, 0xb0, 0x2b, 0x27, 0xd8, 0x3d, 0x86, 0xf9, 0xb4, 0x21, 0xda, 0xf1, 0xfc, 0x10, 0x1d, 0x53, 0xed,
0x0c, 0x0e, 0xee, 0x1a, 0x61, 0x22, 0xa5, 0x49, 0x9b, 0xd0, 0xf4, 0x33, 0x98, 0x6f, 0x25, 0xc3, 0x49, 0xda, 0xf4, 0x18, 0x1c, 0x7c, 0x6b, 0x84, 0x89, 0x94, 0x26, 0x6d, 0x42, 0xd3, 0xcf, 0x60,
0xa3, 0xd0, 0x86, 0xf3, 0x53, 0xe8, 0x1f, 0x9b, 0xf3, 0x93, 0x24, 0xd1, 0xa2, 0x91, 0x99, 0xfa, 0xbe, 0x95, 0x34, 0x8f, 0x42, 0x1b, 0xf6, 0x4f, 0xa1, 0x7f, 0x6c, 0xf6, 0x4f, 0x92, 0x44, 0x8b,
0x8a, 0xa2, 0x3f, 0x73, 0x60, 0xb1, 0xd1, 0xeb, 0x61, 0x95, 0xed, 0x84, 0xfe, 0xb1, 0xd7, 0x13, 0x46, 0x66, 0xea, 0x2b, 0x8a, 0xfe, 0xcc, 0x81, 0xc5, 0x46, 0xaf, 0x87, 0xbb, 0x6c, 0x27, 0xf4,
0xd3, 0xde, 0xf7, 0xad, 0x89, 0x4e, 0x9e, 0x99, 0xef, 0x9c, 0x9a, 0xe8, 0x70, 0x4b, 0x73, 0xa6, 0x8f, 0xbd, 0x9e, 0xe8, 0xf6, 0xbe, 0x6f, 0x75, 0x74, 0xf2, 0xcc, 0x7c, 0xe7, 0x54, 0x47, 0x87,
0xc3, 0x65, 0xc6, 0x7c, 0xeb, 0x5a, 0xcb, 0x6c, 0x4b, 0xad, 0xb1, 0xf7, 0x0b, 0x58, 0x7c, 0xea, 0xaf, 0x34, 0x7b, 0x3a, 0x5c, 0x66, 0xf4, 0xb7, 0xae, 0xb5, 0xcc, 0xb6, 0xd4, 0x6a, 0x7b, 0xbf,
0x0d, 0x06, 0x3c, 0x6e, 0xf4, 0xfb, 0xa1, 0xb2, 0x82, 0xac, 0x4b, 0x57, 0xbc, 0x9e, 0xde, 0x5f, 0x80, 0xc5, 0xa7, 0xde, 0x60, 0xc0, 0xe3, 0x46, 0xbf, 0x1f, 0x2a, 0x2b, 0xc8, 0xba, 0x74, 0xc5,
0x9f, 0x64, 0xa7, 0xac, 0x65, 0x5a, 0x30, 0x99, 0xca, 0xdd, 0x74, 0x2a, 0xa7, 0x5f, 0x3b, 0x00, 0xeb, 0xe9, 0xf7, 0xeb, 0x93, 0xec, 0x94, 0xb5, 0x4c, 0x0b, 0x26, 0x5d, 0xb9, 0x9b, 0x76, 0xe5,
0x72, 0xb6, 0x6a, 0x7a, 0xb1, 0x97, 0x1d, 0xd2, 0x9d, 0xd3, 0x43, 0xfa, 0x7b, 0x50, 0x96, 0x43, 0xf4, 0x6b, 0x07, 0x40, 0xf6, 0x56, 0x4d, 0x2f, 0xf6, 0xb2, 0x4d, 0xba, 0x73, 0xba, 0x49, 0x7f,
0x61, 0x0a, 0x56, 0xca, 0xc0, 0x7e, 0x93, 0x54, 0x78, 0x3a, 0xc4, 0x5b, 0xbc, 0xb3, 0x4e, 0x0b, 0x0f, 0xca, 0xb2, 0x29, 0x4c, 0xc1, 0x4a, 0x19, 0x58, 0x6f, 0x92, 0x1d, 0x9e, 0x36, 0xf1, 0x16,
0x8c, 0x35, 0x36, 0x47, 0xe6, 0x0d, 0xfb, 0xc1, 0x91, 0xea, 0xb6, 0x06, 0x87, 0xb6, 0x60, 0x51, 0xef, 0xac, 0xd3, 0x02, 0x63, 0x8d, 0xc5, 0x91, 0x79, 0xc3, 0x7e, 0x70, 0xa4, 0xaa, 0xad, 0xc1,
0xa1, 0x64, 0x18, 0x9c, 0x0e, 0xbe, 0x8e, 0x39, 0xf8, 0x9a, 0xa3, 0xb2, 0x6b, 0x8d, 0xca, 0xf4, 0xa1, 0x2d, 0x58, 0x54, 0x28, 0x19, 0x06, 0xa7, 0x8d, 0xaf, 0x63, 0x36, 0xbe, 0x66, 0xab, 0xec,
0x4b, 0x58, 0x6c, 0xf2, 0xcb, 0xaa, 0xc1, 0xbc, 0x08, 0x7d, 0x33, 0x2f, 0x04, 0x65, 0xaa, 0xcf, 0x5a, 0xad, 0x32, 0xfd, 0x12, 0x16, 0x9b, 0xfc, 0xb2, 0x6a, 0x30, 0x2f, 0x42, 0xdf, 0xcc, 0x0b,
0xd9, 0xea, 0x7f, 0xe3, 0xc0, 0x9c, 0x3a, 0xe8, 0x45, 0x2b, 0xbb, 0x05, 0x55, 0x0d, 0x1f, 0xc6, 0x41, 0x99, 0xea, 0x73, 0xb6, 0xfa, 0xdf, 0x38, 0x30, 0xa7, 0x0e, 0x7a, 0x51, 0xca, 0x6e, 0x41,
0x2f, 0x52, 0x1b, 0xd8, 0x4c, 0x99, 0xe7, 0x08, 0x62, 0x23, 0x0d, 0x90, 0xc1, 0xb1, 0x3a, 0xaf, 0x55, 0xc3, 0x87, 0xf1, 0x8b, 0xd4, 0x0b, 0x6c, 0xa6, 0xcc, 0x73, 0x04, 0xb1, 0x91, 0x06, 0xc8,
0x10, 0xc9, 0x76, 0x5e, 0x21, 0x55, 0x87, 0x92, 0xc4, 0x32, 0x52, 0xd0, 0x6a, 0x92, 0x76, 0xa1, 0xe0, 0x58, 0x95, 0x57, 0x88, 0x64, 0x2b, 0xaf, 0x90, 0xaa, 0x43, 0x49, 0x62, 0x19, 0x29, 0x68,
0xa2, 0x8c, 0xea, 0x4e, 0xb0, 0x92, 0xbf, 0x9b, 0x8e, 0x5d, 0xf6, 0xc8, 0x67, 0x98, 0x9e, 0xce, 0x35, 0x49, 0xbb, 0x50, 0x51, 0x46, 0x75, 0x27, 0xb8, 0x93, 0xbf, 0x9b, 0xb6, 0x5d, 0x76, 0xcb,
0x5b, 0x4b, 0x50, 0xfc, 0xea, 0xd5, 0x8e, 0x17, 0xeb, 0xca, 0x56, 0x14, 0xfd, 0xa5, 0x03, 0x35, 0x67, 0x98, 0x9e, 0xf6, 0x5b, 0x4b, 0x50, 0xfc, 0xea, 0xd5, 0x8e, 0x17, 0xeb, 0x9d, 0xad, 0x28,
0x3d, 0xd4, 0x60, 0xb3, 0x11, 0xc5, 0x7d, 0xde, 0x99, 0x77, 0xdb, 0x6e, 0xda, 0xba, 0xb5, 0xa7, 0xfa, 0x4b, 0x07, 0x6a, 0xba, 0xa9, 0xc1, 0x62, 0x23, 0x36, 0xf7, 0x79, 0x67, 0xde, 0x6d, 0xbb,
0x81, 0xd0, 0x77, 0x85, 0xab, 0xde, 0x04, 0x7c, 0xa8, 0x8a, 0x2e, 0xea, 0xc5, 0x87, 0xc2, 0x92, 0x68, 0xeb, 0xd2, 0x9e, 0x06, 0x42, 0xdf, 0x15, 0xae, 0x7a, 0x13, 0xf0, 0xa1, 0x2a, 0xaa, 0xa8,
0x4b, 0x1d, 0x7c, 0xcb, 0x38, 0x0e, 0xca, 0x45, 0xba, 0xa3, 0x6a, 0xda, 0xec, 0x89, 0x39, 0xbb, 0x17, 0x1f, 0x0a, 0x4b, 0x2e, 0x75, 0xf0, 0x2d, 0x63, 0x3b, 0x28, 0x17, 0xe9, 0x8a, 0xaa, 0x69,
0x27, 0x1e, 0x40, 0x55, 0x4f, 0x5f, 0x12, 0xcb, 0x15, 0x98, 0x8b, 0x83, 0xd8, 0x1b, 0x34, 0xcc, 0xb3, 0x26, 0xe6, 0xec, 0x9a, 0x78, 0x00, 0x55, 0xdd, 0x7d, 0x49, 0x2c, 0x57, 0x60, 0x2e, 0x0e,
0xd9, 0xdc, 0x64, 0x89, 0xf6, 0xab, 0x20, 0x88, 0x74, 0xcd, 0x24, 0x0c, 0x03, 0xdd, 0x9c, 0x85, 0x62, 0x6f, 0xd0, 0x30, 0x7b, 0x73, 0x93, 0x25, 0xca, 0xaf, 0x82, 0x20, 0xd2, 0x7b, 0x26, 0x61,
0xee, 0xdf, 0x5c, 0x58, 0x48, 0xe6, 0x3c, 0x09, 0x2f, 0xf9, 0xd0, 0xca, 0xd3, 0xa9, 0x08, 0xea, 0x18, 0xe8, 0xe6, 0x2c, 0x74, 0xff, 0xe6, 0xc2, 0x42, 0xd2, 0xe7, 0x49, 0x78, 0xc9, 0x87, 0x56,
0xd4, 0xfd, 0xef, 0x8c, 0x7a, 0x66, 0x74, 0xf3, 0x99, 0xe8, 0x52, 0xa8, 0x88, 0xe6, 0xbb, 0xa3, 0x9e, 0x4e, 0x45, 0x50, 0xa7, 0xee, 0x7f, 0xa7, 0xd5, 0x33, 0xa3, 0x9b, 0xcf, 0x44, 0x97, 0x42,
0x7a, 0xac, 0x2c, 0x61, 0x8b, 0x87, 0x50, 0x08, 0x7a, 0x63, 0xe0, 0x1d, 0x88, 0x51, 0xba, 0xcc, 0x45, 0x14, 0xdf, 0x1d, 0x55, 0x63, 0xe5, 0x16, 0xb6, 0x78, 0x08, 0x85, 0xa0, 0x37, 0x06, 0xde,
0x52, 0x86, 0x95, 0xe6, 0x42, 0xa2, 0x94, 0x49, 0x73, 0x21, 0xb5, 0x0e, 0xe5, 0x58, 0x1e, 0x99, 0x81, 0x68, 0xa5, 0xcb, 0x2c, 0x65, 0x58, 0x69, 0x2e, 0x24, 0x4a, 0x99, 0x34, 0x17, 0x52, 0xeb,
0xc1, 0x7e, 0x7d, 0xd6, 0x4a, 0x0f, 0x2b, 0x09, 0x58, 0x2a, 0x46, 0x7d, 0x28, 0xe3, 0x80, 0x24, 0x50, 0x8e, 0xe5, 0x91, 0x19, 0xec, 0xd7, 0x67, 0xad, 0xf4, 0xb0, 0x92, 0x80, 0xa5, 0x62, 0xd4,
0x23, 0x76, 0x5e, 0x8a, 0x9a, 0xd3, 0x50, 0x37, 0x30, 0x6a, 0x2d, 0xcb, 0x36, 0xe2, 0x96, 0xb7, 0x87, 0x32, 0x36, 0x48, 0x32, 0x62, 0xe7, 0xa5, 0xa8, 0xd9, 0x0d, 0x75, 0x03, 0x63, 0xaf, 0x65,
0xe2, 0xf6, 0x27, 0x17, 0xe6, 0x70, 0x2f, 0x1d, 0xb3, 0xdb, 0xf6, 0xe5, 0xea, 0xec, 0xa4, 0xbf, 0xd9, 0x46, 0xdc, 0xf2, 0x56, 0xdc, 0xfe, 0xe8, 0xc2, 0x1c, 0xbe, 0x4b, 0xc7, 0xec, 0xb6, 0x7d,
0x09, 0x80, 0x7b, 0x58, 0x33, 0x98, 0xc1, 0xc1, 0x44, 0x13, 0x94, 0x82, 0x57, 0x9a, 0x65, 0xb2, 0xb9, 0x3a, 0x3b, 0xe9, 0x6f, 0x02, 0xe0, 0x3b, 0xac, 0x1e, 0xcc, 0xe0, 0x60, 0xa2, 0x09, 0x4a,
0xd0, 0x31, 0x24, 0xcd, 0xe8, 0x68, 0xfa, 0x8c, 0x48, 0x17, 0x2e, 0x15, 0xe9, 0x62, 0x06, 0x24, 0xc1, 0x2b, 0xcd, 0x32, 0x59, 0xe8, 0x18, 0x92, 0x66, 0x74, 0x34, 0x7d, 0x46, 0xa4, 0x0b, 0x97,
0x2b, 0x8a, 0xa5, 0x6c, 0x14, 0xdf, 0x26, 0x3e, 0x9f, 0x03, 0xb1, 0x6e, 0x0a, 0x32, 0x50, 0x56, 0x8a, 0x74, 0x31, 0x03, 0x92, 0x15, 0xc5, 0x52, 0x36, 0x8a, 0x6f, 0x13, 0x9f, 0xcf, 0x81, 0x58,
0xe1, 0x38, 0x67, 0x17, 0x8e, 0xdd, 0x96, 0xbe, 0x80, 0x6b, 0xf6, 0x48, 0xfe, 0x4d, 0xf6, 0xbc, 0x37, 0x05, 0x19, 0x28, 0x6b, 0xe3, 0x38, 0x67, 0x6f, 0x1c, 0xbb, 0x2c, 0x7d, 0x01, 0xd7, 0xec,
0x18, 0x3b, 0x8d, 0x54, 0x2e, 0xd5, 0x7e, 0x0f, 0x0a, 0xe2, 0x31, 0x40, 0x29, 0xbd, 0x91, 0x78, 0x96, 0xfc, 0x9b, 0xac, 0x79, 0x31, 0x56, 0x1a, 0xa9, 0x5c, 0xaa, 0xfd, 0x1e, 0x14, 0xc4, 0x30,
0x9a, 0xf5, 0x86, 0x49, 0x39, 0xb2, 0x9e, 0x79, 0x33, 0x58, 0xce, 0xac, 0x30, 0x6c, 0xd6, 0x6f, 0x40, 0x29, 0xbd, 0x91, 0x78, 0x9a, 0xf5, 0x86, 0x49, 0x39, 0xb2, 0x9e, 0x99, 0x19, 0x2c, 0x67,
0x07, 0x74, 0x0d, 0x2a, 0xbb, 0xc6, 0xc4, 0x4f, 0x2a, 0xe0, 0x3c, 0x53, 0x80, 0x38, 0xcf, 0x90, 0x56, 0x18, 0x36, 0xeb, 0xd9, 0x01, 0x5d, 0x83, 0xca, 0xae, 0xd1, 0xf1, 0x93, 0x0a, 0x38, 0xcf,
0x7a, 0xae, 0xcc, 0x74, 0x9e, 0xd3, 0xaf, 0x73, 0x19, 0x2c, 0x65, 0x47, 0xbc, 0x74, 0x1a, 0xfe, 0x14, 0x20, 0xce, 0x33, 0xa4, 0x9e, 0x2b, 0x33, 0x9d, 0xe7, 0xf4, 0xeb, 0x5c, 0x06, 0x4b, 0x59,
0xbf, 0x71, 0x18, 0x89, 0x49, 0x7e, 0x00, 0x15, 0xf3, 0xae, 0x55, 0x2f, 0x8b, 0x65, 0xfa, 0x01, 0x11, 0x2f, 0x9d, 0x86, 0xff, 0x2f, 0x1c, 0x46, 0x62, 0x92, 0x1f, 0x40, 0xc5, 0xbc, 0x6b, 0xd5,
0xd1, 0x0c, 0x0a, 0xb3, 0x04, 0xc5, 0x28, 0x24, 0xf9, 0x72, 0xa0, 0x01, 0x35, 0x0a, 0x19, 0x3c, 0xcb, 0x62, 0x99, 0x1e, 0x20, 0x9a, 0x41, 0x61, 0x96, 0xa0, 0x68, 0x85, 0x24, 0x5f, 0x36, 0x34,
0xfa, 0x4f, 0x27, 0x9b, 0xaa, 0x57, 0x8c, 0x95, 0x89, 0xaa, 0x9b, 0x41, 0xf5, 0x8a, 0x67, 0xe8, 0xa0, 0x5a, 0x21, 0x83, 0x47, 0xff, 0xe9, 0x64, 0x53, 0xf5, 0x8a, 0xb1, 0x32, 0x51, 0x75, 0x33,
0x29, 0x4f, 0xf3, 0x6f, 0xeb, 0x69, 0x61, 0x8a, 0xa7, 0x7f, 0x77, 0x60, 0x51, 0x7b, 0x9a, 0xce, 0xa8, 0x5e, 0xf1, 0x0c, 0x3d, 0xe5, 0x69, 0xfe, 0x6d, 0x3d, 0x2d, 0x4c, 0xf1, 0xf4, 0xef, 0x0e,
0x0a, 0x3f, 0x86, 0x6a, 0x6c, 0x66, 0xea, 0x79, 0x35, 0x24, 0x57, 0xd9, 0xf2, 0xe4, 0x3e, 0x54, 0x2c, 0x6a, 0x4f, 0xd3, 0x5e, 0xe1, 0xc7, 0x50, 0x8d, 0xcd, 0x4c, 0x3d, 0x6f, 0x0f, 0xc9, 0x55,
0x62, 0x2f, 0x3c, 0xe0, 0xf1, 0xf6, 0xc5, 0x15, 0x25, 0x15, 0x58, 0xf2, 0xb8, 0x5e, 0xbe, 0xb8, 0xb6, 0x3c, 0xb9, 0x0f, 0x95, 0xd8, 0x0b, 0x0f, 0x78, 0xbc, 0x7d, 0xf1, 0x8e, 0x92, 0x0a, 0x2c,
0xa9, 0xf5, 0xb9, 0x8b, 0xd7, 0x9b, 0xf2, 0xf4, 0x17, 0x2e, 0x2c, 0x58, 0xc8, 0x44, 0x02, 0x0e, 0x79, 0x5c, 0x2f, 0x27, 0x6e, 0x6a, 0x7d, 0xee, 0xe2, 0xf5, 0xa6, 0x3c, 0xfd, 0x85, 0x0b, 0x0b,
0x51, 0xe8, 0xd2, 0x73, 0x7d, 0xc7, 0xb1, 0x78, 0x28, 0x23, 0x2b, 0x5b, 0x41, 0x26, 0x63, 0x67, 0x16, 0x32, 0x91, 0x80, 0x43, 0x6c, 0x74, 0xe9, 0xb9, 0xbe, 0xe3, 0x58, 0x3c, 0x94, 0x91, 0x3b,
0xf1, 0x50, 0x46, 0xee, 0xa5, 0x64, 0xd4, 0x2c, 0x6d, 0xf2, 0xc8, 0x9d, 0xe4, 0xad, 0x32, 0x2f, 0x5b, 0x41, 0x26, 0x63, 0x67, 0xf1, 0x50, 0x46, 0xbe, 0x4b, 0xc9, 0xa8, 0x5e, 0xda, 0xe4, 0x91,
0x9e, 0xfe, 0xa6, 0x46, 0x4b, 0x3f, 0x56, 0xde, 0x49, 0x1a, 0x4f, 0xe1, 0xec, 0xd0, 0xea, 0xd7, 0x3b, 0xc9, 0xac, 0x32, 0x2f, 0x46, 0x7f, 0x53, 0xa3, 0xa5, 0x87, 0x95, 0x77, 0x92, 0xc2, 0x53,
0xca, 0x3b, 0xc9, 0x6b, 0x65, 0xf1, 0x1c, 0x61, 0xf5, 0x5c, 0xf9, 0x5b, 0x07, 0xe6, 0x1f, 0x84, 0x38, 0x3b, 0xb4, 0x7a, 0x5a, 0x79, 0x27, 0x99, 0x56, 0x16, 0xcf, 0x11, 0x56, 0xe3, 0xca, 0xbf,
0xdc, 0xc3, 0x59, 0xfd, 0x4d, 0x72, 0xc6, 0xca, 0x1f, 0x31, 0xba, 0xfa, 0x81, 0x30, 0xa1, 0xf1, 0x3a, 0x30, 0xff, 0x20, 0xe4, 0x1e, 0xf6, 0xea, 0x6f, 0x92, 0x33, 0x56, 0x7e, 0xc4, 0xe8, 0xea,
0x22, 0x22, 0x7e, 0x74, 0xc0, 0x0c, 0xab, 0xc8, 0x1f, 0x18, 0xc4, 0x03, 0x73, 0x14, 0xf1, 0xb8, 0x01, 0x61, 0x42, 0xe3, 0x45, 0x44, 0x7c, 0x74, 0xc0, 0x0c, 0xab, 0xc8, 0x0f, 0x0c, 0x62, 0xc0,
0x35, 0xe1, 0x3d, 0x3d, 0x23, 0x25, 0x0c, 0x71, 0x34, 0x22, 0xd1, 0x0d, 0x5e, 0xf1, 0xa1, 0xfe, 0x1c, 0x45, 0x3c, 0x6e, 0x4d, 0x78, 0x4f, 0xf7, 0x48, 0x09, 0x43, 0x1c, 0x8d, 0x48, 0x74, 0x83,
0x69, 0x20, 0xe5, 0xe0, 0x15, 0x3b, 0xf6, 0xe3, 0x01, 0x57, 0x9d, 0x41, 0x12, 0xf4, 0x89, 0x79, 0x57, 0x7c, 0xa8, 0x3f, 0x0d, 0xa4, 0x1c, 0xbc, 0x62, 0xc7, 0x7e, 0x3c, 0xe0, 0xaa, 0x32, 0x48,
0x9f, 0x8c, 0xd0, 0xaa, 0xb3, 0x6f, 0x80, 0x53, 0x2e, 0x47, 0x78, 0x06, 0xf4, 0x79, 0xec, 0xf9, 0x42, 0xdf, 0xf7, 0xf0, 0x92, 0x54, 0x12, 0x26, 0x24, 0x57, 0xa1, 0x25, 0x28, 0xca, 0xe1, 0xbd,
0x03, 0xb1, 0x63, 0x81, 0x29, 0x8a, 0xfe, 0xda, 0x85, 0x79, 0x79, 0x25, 0xeb, 0x04, 0xb1, 0xb8, 0x28, 0x03, 0x05, 0xa6, 0x28, 0xfa, 0xc4, 0xbc, 0x81, 0x46, 0xe8, 0xc7, 0xd9, 0x77, 0xc6, 0x29,
0x1d, 0x9f, 0x3b, 0x52, 0x58, 0x4f, 0x0e, 0x6e, 0xf6, 0xc9, 0xe1, 0xaa, 0x8d, 0xf4, 0xd4, 0x23, 0xd7, 0x29, 0xd4, 0xdb, 0xe7, 0xb1, 0xe7, 0x0f, 0x84, 0x8d, 0x05, 0xa6, 0x28, 0xfa, 0x6b, 0x17,
0x4c, 0x7e, 0xda, 0x23, 0x0c, 0x5e, 0x05, 0xe4, 0x4d, 0x50, 0x95, 0xa3, 0x26, 0xc5, 0x08, 0x19, 0xe6, 0xe5, 0x25, 0xae, 0x13, 0xc4, 0xe2, 0x3e, 0x7d, 0x6e, 0x13, 0x62, 0x0d, 0x29, 0xdc, 0xec,
0x7b, 0xf1, 0x38, 0x12, 0x58, 0xa5, 0xef, 0x2b, 0xe8, 0xca, 0xae, 0xf8, 0xc0, 0x94, 0x80, 0x31, 0x90, 0xe2, 0xaa, 0xa5, 0xf7, 0xd4, 0xd8, 0x26, 0x3f, 0x6d, 0x6c, 0x83, 0x97, 0x07, 0x79, 0x77,
0x6d, 0x96, 0x2e, 0x98, 0x36, 0xe9, 0x13, 0x58, 0x90, 0x88, 0x34, 0x5f, 0x6e, 0xf9, 0x13, 0x01, 0x54, 0x1b, 0x58, 0x93, 0xa2, 0xe9, 0x8c, 0xbd, 0x78, 0x1c, 0x09, 0x74, 0xd3, 0x89, 0x0c, 0xba,
0xc9, 0x87, 0x90, 0xf7, 0x87, 0xfb, 0x41, 0xe6, 0x7e, 0x6c, 0xe3, 0xc6, 0x84, 0x08, 0x5a, 0x1b, 0xb2, 0x2b, 0x1e, 0x30, 0x25, 0x60, 0xf4, 0xa7, 0xa5, 0x0b, 0xfa, 0x53, 0xfa, 0x04, 0x16, 0x24,
0x4f, 0xe4, 0xe3, 0x85, 0xba, 0xad, 0x29, 0x92, 0xfe, 0xca, 0xd5, 0xb7, 0x5f, 0xa1, 0xb6, 0xcf, 0x22, 0xcd, 0x97, 0x5b, 0xfe, 0x44, 0x40, 0xf2, 0x21, 0xe4, 0xfd, 0xe1, 0x7e, 0x90, 0xb9, 0x51,
0x2f, 0x1c, 0xe0, 0xfe, 0xb7, 0xd0, 0x5e, 0xb2, 0xd0, 0x2e, 0x24, 0xd0, 0x5e, 0x87, 0x82, 0x94, 0xdb, 0xb8, 0x31, 0x21, 0x82, 0xd6, 0xc6, 0x13, 0x39, 0xee, 0x50, 0xf7, 0x3b, 0x45, 0xd2, 0x5f,
0x2f, 0x09, 0xb6, 0x24, 0xd0, 0xf6, 0xbe, 0x1f, 0x72, 0xf9, 0x53, 0xd5, 0xac, 0xf8, 0x92, 0x32, 0xb9, 0xfa, 0xbe, 0x2c, 0xd4, 0xf6, 0xf9, 0x85, 0x2d, 0xdf, 0xff, 0x16, 0xda, 0x4b, 0x16, 0xda,
0xe8, 0xa7, 0x66, 0xd6, 0x89, 0xfe, 0x79, 0x07, 0x0a, 0xe8, 0xb7, 0xfe, 0xa5, 0xe2, 0x0c, 0x8c, 0x85, 0x04, 0xda, 0xeb, 0x50, 0x90, 0xf2, 0x32, 0x95, 0x25, 0x81, 0xb6, 0xf7, 0xfd, 0x90, 0xcb,
0xa5, 0x0c, 0x65, 0xb0, 0x24, 0x3f, 0xb4, 0x86, 0xde, 0xcb, 0x01, 0x57, 0x2f, 0x04, 0xd8, 0xb1, 0x8f, 0x5b, 0x32, 0x97, 0x53, 0x06, 0xfd, 0xd4, 0xcc, 0x3a, 0x51, 0x71, 0xef, 0x40, 0x01, 0xfd,
0xa6, 0xfd, 0x5c, 0x47, 0x20, 0xef, 0x47, 0xdb, 0x8f, 0xd4, 0x43, 0x98, 0xf8, 0x9b, 0xd4, 0x20, 0xd6, 0xdf, 0x36, 0xce, 0xc0, 0x58, 0xca, 0x50, 0x06, 0x4b, 0xf2, 0x41, 0x6b, 0xe8, 0xbd, 0x1c,
0x77, 0x14, 0x1d, 0x28, 0xb4, 0xf0, 0x4f, 0xda, 0x81, 0x77, 0xa7, 0xe9, 0x44, 0xdb, 0xee, 0x41, 0x70, 0x35, 0x53, 0xc0, 0x1a, 0x37, 0xed, 0x03, 0x1f, 0x81, 0xbc, 0x1f, 0x6d, 0x3f, 0x52, 0xa3,
0x21, 0xe4, 0xd1, 0x48, 0xdb, 0xf6, 0x2d, 0xcb, 0xb6, 0xac, 0x09, 0x4c, 0xca, 0xd2, 0x0e, 0xc0, 0x33, 0xf1, 0x9b, 0xd4, 0x20, 0x77, 0x14, 0x1d, 0x28, 0xb4, 0xf0, 0x27, 0xed, 0xc0, 0xbb, 0xd3,
0xe3, 0xa0, 0xe7, 0x0d, 0xb6, 0xfc, 0x49, 0x77, 0x82, 0x36, 0x1c, 0xa6, 0x21, 0x16, 0x7f, 0x23, 0x74, 0xa2, 0x6d, 0xf7, 0xa0, 0x10, 0xf2, 0x68, 0xa4, 0x6d, 0xfb, 0x96, 0x65, 0x5b, 0xd6, 0x04,
0xa0, 0x87, 0xdc, 0x3f, 0x38, 0x94, 0xbd, 0x3e, 0xc7, 0x14, 0x85, 0x80, 0xfa, 0xc9, 0xeb, 0x57, 0x26, 0x65, 0x69, 0x07, 0xe0, 0x71, 0xd0, 0xf3, 0x06, 0x5b, 0xfe, 0xa4, 0x3b, 0x41, 0x1b, 0x0e,
0x8e, 0x49, 0x82, 0xfe, 0xde, 0x81, 0x8a, 0xd0, 0x25, 0xdf, 0x9e, 0x5e, 0x9b, 0x99, 0xe6, 0x58, 0xd3, 0x10, 0x8b, 0xdf, 0x08, 0xe8, 0x21, 0xf7, 0x0f, 0x0e, 0xe5, 0xe9, 0x90, 0x63, 0x8a, 0x42,
0x99, 0x96, 0x6c, 0xe6, 0x4e, 0xdd, 0x2c, 0x37, 0x7d, 0xb3, 0xbc, 0xb1, 0x59, 0x1a, 0xd3, 0xc2, 0x40, 0xfd, 0x64, 0x5e, 0x96, 0x63, 0x92, 0xa0, 0xbf, 0x73, 0xa0, 0x22, 0x74, 0xc9, 0x69, 0xd5,
0x99, 0x31, 0x2d, 0x66, 0x63, 0xfa, 0x31, 0x54, 0x0d, 0xfb, 0xa2, 0x11, 0x79, 0x1f, 0x72, 0xf1, 0x6b, 0x33, 0xd3, 0x1c, 0x2b, 0xd3, 0x92, 0x97, 0xb9, 0x53, 0x5f, 0x96, 0x9b, 0xfe, 0xb2, 0xbc,
0x44, 0x83, 0xa6, 0x0b, 0x2e, 0xc5, 0x84, 0xe1, 0x57, 0xba, 0x05, 0x8b, 0x0a, 0x3b, 0xbc, 0x89, 0xf1, 0xb2, 0x34, 0xa6, 0x85, 0x33, 0x63, 0x5a, 0xcc, 0xc6, 0xf4, 0x63, 0xa8, 0x1a, 0xf6, 0x45,
0x30, 0x1e, 0x8d, 0x07, 0xff, 0x49, 0x14, 0xdb, 0x70, 0x8d, 0xf1, 0xd7, 0xa7, 0xd2, 0x62, 0x1d, 0x23, 0xf2, 0x3e, 0xe4, 0xe2, 0x89, 0x06, 0x4d, 0x6f, 0xb8, 0x14, 0x13, 0x86, 0x4f, 0xe9, 0x16,
0x4a, 0xa1, 0x50, 0xad, 0xcd, 0xd1, 0x6f, 0x4c, 0xa7, 0xf6, 0x66, 0x5a, 0x70, 0xed, 0x4b, 0x80, 0x2c, 0x2a, 0xec, 0xf0, 0xee, 0xc2, 0x78, 0x34, 0x1e, 0xfc, 0x27, 0x51, 0x6c, 0xc3, 0x35, 0xc6,
0xf4, 0xa1, 0x96, 0xcc, 0x41, 0xa9, 0xd9, 0xda, 0xd9, 0xde, 0x6d, 0x77, 0x6b, 0x33, 0xa4, 0x02, 0x5f, 0x9f, 0x4a, 0x8b, 0x75, 0x28, 0x85, 0x42, 0xb5, 0x36, 0x47, 0x4f, 0xa5, 0x4e, 0xbd, 0x9b,
0xb3, 0x4f, 0xdb, 0xdd, 0xcd, 0x26, 0x6b, 0x3c, 0xad, 0x39, 0x64, 0x11, 0xaa, 0x5d, 0xd6, 0xe8, 0x69, 0xc1, 0xb5, 0x2f, 0x01, 0xd2, 0xd1, 0x2e, 0x99, 0x83, 0x52, 0xb3, 0xb5, 0xb3, 0xbd, 0xdb,
0xec, 0x6e, 0xb4, 0x58, 0xbb, 0xb3, 0xb3, 0xd7, 0xad, 0xb9, 0x84, 0xc0, 0xbc, 0x66, 0x6d, 0xef, 0xee, 0xd6, 0x66, 0x48, 0x05, 0x66, 0x9f, 0xb6, 0xbb, 0x9b, 0x4d, 0xd6, 0x78, 0x5a, 0x73, 0xc8,
0x75, 0x91, 0x97, 0x23, 0x55, 0x28, 0x37, 0xf6, 0xba, 0x9b, 0xdb, 0xac, 0xfd, 0xa2, 0x55, 0xcb, 0x22, 0x54, 0xbb, 0xac, 0xd1, 0xd9, 0xdd, 0x68, 0xb1, 0x76, 0x67, 0x67, 0xaf, 0x5b, 0x73, 0x09,
0xaf, 0xad, 0x0b, 0xb8, 0xd2, 0x5f, 0x77, 0x09, 0x40, 0x51, 0xee, 0x57, 0x9b, 0x21, 0xb3, 0x90, 0x81, 0x79, 0xcd, 0xda, 0xde, 0xeb, 0x22, 0x2f, 0x47, 0xaa, 0x50, 0x6e, 0xec, 0x75, 0x37, 0xb7,
0xc7, 0x7b, 0x57, 0xcd, 0xc1, 0x7d, 0x55, 0xe3, 0xaf, 0xb9, 0x6b, 0xef, 0x8b, 0x14, 0x48, 0x7e, 0x59, 0xfb, 0x45, 0xab, 0x96, 0x5f, 0x5b, 0x17, 0x70, 0xa5, 0xdf, 0x83, 0x09, 0x40, 0x51, 0xbe,
0x7f, 0x22, 0x25, 0xc8, 0x35, 0xfa, 0xfd, 0xda, 0x0c, 0xae, 0x6d, 0xf2, 0x01, 0x8f, 0x79, 0xcd, 0xaf, 0x36, 0x43, 0x66, 0x21, 0x8f, 0x37, 0xb5, 0x9a, 0x83, 0xef, 0x55, 0x85, 0xbf, 0xe6, 0xae,
0x59, 0xdb, 0x00, 0x48, 0x1b, 0x20, 0x29, 0x43, 0x61, 0xaf, 0xd3, 0x6c, 0x6d, 0xd4, 0x66, 0xf0, 0xbd, 0x2f, 0x52, 0x20, 0xf9, 0x62, 0x45, 0x4a, 0x90, 0x6b, 0xf4, 0xfb, 0xb5, 0x19, 0x5c, 0xdb,
0xcf, 0x27, 0x8d, 0xc7, 0xed, 0x66, 0xcd, 0x41, 0xfd, 0x7b, 0xbb, 0xad, 0x66, 0xcd, 0xc5, 0x95, 0xe4, 0x03, 0x1e, 0xf3, 0x9a, 0xb3, 0xb6, 0x01, 0x90, 0x16, 0x40, 0x52, 0x86, 0xc2, 0x5e, 0xa7,
0x1b, 0x6c, 0xfb, 0x45, 0xab, 0x53, 0xcb, 0xa1, 0x5b, 0x7b, 0x1d, 0x45, 0xe5, 0xd7, 0x3e, 0x85, 0xd9, 0xda, 0xa8, 0xcd, 0xe0, 0xcf, 0x27, 0x8d, 0xc7, 0xed, 0x66, 0xcd, 0x41, 0xfd, 0x7b, 0xbb,
0x77, 0xb6, 0xfc, 0x89, 0x4c, 0x72, 0xc6, 0xa3, 0x9e, 0x37, 0x54, 0x2a, 0x67, 0x21, 0xdf, 0x6e, 0xad, 0x66, 0xcd, 0xc5, 0x95, 0x1b, 0x6c, 0xfb, 0x45, 0xab, 0x53, 0xcb, 0xa1, 0x5b, 0x7b, 0x1d,
0x3e, 0x6e, 0x49, 0x1c, 0x76, 0x1f, 0x34, 0x3a, 0x9d, 0x76, 0xe7, 0x61, 0xcd, 0x41, 0x6a, 0xa3, 0x45, 0xe5, 0xd7, 0x3e, 0x85, 0x77, 0xb6, 0xfc, 0x89, 0x4c, 0x72, 0xc6, 0xa3, 0x9e, 0x37, 0x54,
0xdd, 0x69, 0xef, 0x6e, 0xa2, 0xe2, 0xf5, 0x3f, 0x3b, 0x00, 0x47, 0xfe, 0x44, 0xbf, 0xf2, 0x7d, 0x2a, 0x67, 0x21, 0xdf, 0x6e, 0x3e, 0x6e, 0x49, 0x1c, 0x76, 0x1f, 0x34, 0x3a, 0x9d, 0x76, 0xe7,
0x0c, 0x0b, 0x0f, 0x33, 0x7a, 0xaa, 0x2a, 0x06, 0x8c, 0xbf, 0xee, 0xf8, 0x83, 0xe5, 0x5a, 0x4a, 0x61, 0xcd, 0x41, 0x6a, 0xa3, 0xdd, 0x69, 0xef, 0x6e, 0xa2, 0xe2, 0xf5, 0x3f, 0x39, 0x00, 0x47,
0xee, 0xc6, 0xa1, 0x3f, 0x3c, 0xa0, 0x33, 0xe4, 0x23, 0x98, 0x93, 0x4b, 0xd0, 0xa3, 0x4b, 0xad, 0xfe, 0x44, 0xcf, 0x05, 0x3f, 0x86, 0x85, 0x87, 0x19, 0x3d, 0x55, 0x15, 0x03, 0xc6, 0x5f, 0x77,
0xb8, 0x0f, 0x55, 0x2b, 0xfa, 0x64, 0x21, 0x15, 0x12, 0x0f, 0x54, 0xcb, 0xcb, 0x29, 0x23, 0x9b, 0xfc, 0xc1, 0x72, 0x2d, 0x25, 0x77, 0xe3, 0xd0, 0x1f, 0x1e, 0xd0, 0x19, 0xf2, 0x11, 0xcc, 0xc9,
0x27, 0x74, 0xe6, 0x65, 0x51, 0xfc, 0xa3, 0xc2, 0xbd, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x40, 0x25, 0xe8, 0xd1, 0xa5, 0x56, 0xdc, 0x87, 0xaa, 0x15, 0x7d, 0xb2, 0x90, 0x0a, 0x89, 0x91, 0xd6,
0x0f, 0x00, 0xa1, 0xdd, 0x20, 0x00, 0x00, 0xf2, 0x72, 0xca, 0xc8, 0xe6, 0x09, 0x9d, 0x79, 0x59, 0x14, 0x7f, 0x6d, 0xb8, 0xf7, 0xef, 0x00,
0x00, 0x00, 0xff, 0xff, 0xfd, 0x6a, 0xf8, 0xd1, 0x0f, 0x21, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
......
...@@ -224,6 +224,9 @@ func (p *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e ...@@ -224,6 +224,9 @@ func (p *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e
indexName = "authSpendHash" indexName = "authSpendHash"
} else if len(req.Account) > 0 { } else if len(req.Account) > 0 {
indexName = "account" indexName = "account"
if req.Status > 0 {
indexName = "owner_status"
}
} else if req.Status > 0 { } else if req.Status > 0 {
indexName = "status" indexName = "status"
} }
......
...@@ -25,7 +25,8 @@ var boardOpt = &table.Option{ ...@@ -25,7 +25,8 @@ var boardOpt = &table.Option{
"authHash", "authHash",
"authSpendHash", "authSpendHash",
"account", "account",
"status"}, "status",
"owner_status"},
} }
//NewStageTable 新建表 //NewStageTable 新建表
...@@ -79,6 +80,8 @@ func (r *MixRow) Get(key string) ([]byte, error) { ...@@ -79,6 +80,8 @@ func (r *MixRow) Get(key string) ([]byte, error) {
return []byte(r.Info.Account), nil return []byte(r.Info.Account), nil
case "status": case "status":
return []byte(fmt.Sprintf("%2d", r.Info.Status)), nil return []byte(fmt.Sprintf("%2d", r.Info.Status)), nil
case "owner_status":
return []byte(fmt.Sprintf("%s_%2d", r.Info.Account, r.Info.Status)), nil
default: default:
return nil, types.ErrNotFound return nil, types.ErrNotFound
} }
......
...@@ -134,12 +134,12 @@ func (p *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transaction, ...@@ -134,12 +134,12 @@ func (p *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transaction,
return nil, err return nil, err
} }
proofInfo, err := getZkProofKeys(auth.ZkPath+mixTy.AuthCircuit, auth.ZkPath+mixTy.AuthPk, *input) proofInfo, err := getZkProofKeys(auth.ZkPath+mixTy.AuthCircuit, auth.ZkPath+mixTy.AuthPk, *input, req.Privacy)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getZkProofKeys note=%s", auth.NoteHash) return nil, errors.Wrapf(err, "getZkProofKeys note=%s", auth.NoteHash)
} }
//verify //verify
if err := p.verifyProofOnChain(mixTy.VerifyType_AUTHORIZE, proofInfo, auth.ZkPath+mixTy.AuthVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_AUTHORIZE, proofInfo, auth.ZkPath+mixTy.AuthVk, req.Verify); err != nil {
return nil, errors.Wrapf(err, "verifyProof fail for note=%s", auth.NoteHash) return nil, errors.Wrapf(err, "verifyProof fail for note=%s", auth.NoteHash)
} }
......
...@@ -128,7 +128,7 @@ func (p *mixPolicy) depositParams(receiver, returner, auth, amount string) (*mix ...@@ -128,7 +128,7 @@ func (p *mixPolicy) depositParams(receiver, returner, auth, amount string) (*mix
} }
func (p *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPath string) (*mixTy.ZkProofInfo, error) { func (p *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPath string, verifyOnChain, privacyPrint int32) (*mixTy.ZkProofInfo, error) {
resp, err := p.depositParams(receiver, returner, auth, amount) resp, err := p.depositParams(receiver, returner, auth, amount)
if err != nil { if err != nil {
...@@ -143,13 +143,13 @@ func (p *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPath str ...@@ -143,13 +143,13 @@ func (p *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPath str
input.ReturnPubKey = resp.Proof.ReturnKey input.ReturnPubKey = resp.Proof.ReturnKey
input.NoteRandom = resp.Proof.NoteRandom input.NoteRandom = resp.Proof.NoteRandom
proofInfo, err := getZkProofKeys(zkPath+mixTy.DepositCircuit, zkPath+mixTy.DepositPk, input) proofInfo, err := getZkProofKeys(zkPath+mixTy.DepositCircuit, zkPath+mixTy.DepositPk, input, privacyPrint)
if err != nil { if err != nil {
return nil, err return nil, err
} }
//线上验证proof,失败的原因有可能circuit,Pk和线上vk不匹配,或不是一起产生的版本 //线上验证proof,失败的原因有可能circuit,Pk和线上vk不匹配,或不是一起产生的版本
if err := p.verifyProofOnChain(mixTy.VerifyType_DEPOSIT, proofInfo, zkPath+mixTy.DepositVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_DEPOSIT, proofInfo, zkPath+mixTy.DepositVk, verifyOnChain); err != nil {
return nil, errors.Wrap(err, "verifyProof fail") return nil, errors.Wrap(err, "verifyProof fail")
} }
proofInfo.Secrets = resp.Secrets proofInfo.Secrets = resp.Secrets
...@@ -180,7 +180,7 @@ func (p *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Transacti ...@@ -180,7 +180,7 @@ func (p *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Transacti
var proofs []*mixTy.ZkProofInfo var proofs []*mixTy.ZkProofInfo
for i, rcv := range receivers { for i, rcv := range receivers {
p, err := p.getDepositProof(rcv, deposit.Deposit.ReturnAddr, deposit.Deposit.AuthorizeAddr, amounts[i], deposit.ZkPath) p, err := p.getDepositProof(rcv, deposit.Deposit.ReturnAddr, deposit.Deposit.AuthorizeAddr, amounts[i], deposit.ZkPath, req.Verify, req.Privacy)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "get Deposit proof for=%s", rcv) return nil, errors.Wrapf(err, "get Deposit proof for=%s", rcv)
} }
......
...@@ -93,7 +93,6 @@ type TransferOutput struct { ...@@ -93,7 +93,6 @@ type TransferOutput struct {
} }
func (p *mixPolicy) getTransferInputPart(note *mixTy.WalletNoteInfo) (*TransferInput, error) { func (p *mixPolicy) getTransferInputPart(note *mixTy.WalletNoteInfo) (*TransferInput, error) {
//get spend privacy key //get spend privacy key
privacyKey, err := p.getAccountPrivacyKey(note.Account) privacyKey, err := p.getAccountPrivacyKey(note.Account)
if err != nil { if err != nil {
...@@ -101,7 +100,7 @@ func (p *mixPolicy) getTransferInputPart(note *mixTy.WalletNoteInfo) (*TransferI ...@@ -101,7 +100,7 @@ func (p *mixPolicy) getTransferInputPart(note *mixTy.WalletNoteInfo) (*TransferI
} }
if privacyKey.Privacy.PaymentKey.ReceiveKey != note.Secret.ReceiverKey && if privacyKey.Privacy.PaymentKey.ReceiveKey != note.Secret.ReceiverKey &&
privacyKey.Privacy.PaymentKey.ReceiveKey != note.Secret.ReturnKey { privacyKey.Privacy.PaymentKey.ReceiveKey != note.Secret.ReturnKey {
return nil, errors.Wrapf(types.ErrInvalidParam, "payment pubkey from note=%s not match from privacyKey=%s,for account =%s", return nil, errors.Wrapf(types.ErrInvalidParam, "receiver key from note=%s not match from key=%s,for account =%s",
note.Secret.ReceiverKey, privacyKey.Privacy.PaymentKey.ReceiveKey, note.Account) note.Secret.ReceiverKey, privacyKey.Privacy.PaymentKey.ReceiveKey, note.Account)
} }
...@@ -367,32 +366,32 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact ...@@ -367,32 +366,32 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact
//verify input //verify input
var inputProofs []*mixTy.ZkProofInfo var inputProofs []*mixTy.ZkProofInfo
for i, input := range inputParts { for i, input := range inputParts {
inputProof, err := getZkProofKeys(transfer.Input.ZkPath+mixTy.TransInputCircuit, transfer.Input.ZkPath+mixTy.TransInputPk, *input) inputProof, err := getZkProofKeys(transfer.Input.ZkPath+mixTy.TransInputCircuit, transfer.Input.ZkPath+mixTy.TransInputPk, *input, req.Privacy)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "verify.input getZkProofKeys,the i=%d", i) return nil, errors.Wrapf(err, "verify.input getZkProofKeys,the i=%d", i)
} }
if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFERINPUT, inputProof, transfer.Input.ZkPath+mixTy.TransInputVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFERINPUT, inputProof, transfer.Input.ZkPath+mixTy.TransInputVk, req.Verify); err != nil {
return nil, errors.Wrapf(err, "input verifyProof fail,the i=%d", i) return nil, errors.Wrapf(err, "input verifyProof fail,the i=%d", i)
} }
inputProofs = append(inputProofs, inputProof) inputProofs = append(inputProofs, inputProof)
} }
//verify output //verify output
outputProof, err := getZkProofKeys(transfer.Output.ZkPath+mixTy.TransOutputCircuit, transfer.Output.ZkPath+mixTy.TransOutputPk, *outPart) outputProof, err := getZkProofKeys(transfer.Output.ZkPath+mixTy.TransOutputCircuit, transfer.Output.ZkPath+mixTy.TransOutputPk, *outPart, req.Privacy)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "output getZkProofKeys") return nil, errors.Wrapf(err, "output getZkProofKeys")
} }
if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, outputProof, transfer.Output.ZkPath+mixTy.TransOutputVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, outputProof, transfer.Output.ZkPath+mixTy.TransOutputVk, req.Verify); err != nil {
return nil, errors.Wrapf(err, "output verifyProof fail") return nil, errors.Wrapf(err, "output verifyProof fail")
} }
outputProof.Secrets = outDHSecret outputProof.Secrets = outDHSecret
//verify change //verify change
changeProof, err := getZkProofKeys(transfer.Output.ZkPath+mixTy.TransOutputCircuit, transfer.Output.ZkPath+mixTy.TransOutputPk, *changePart) changeProof, err := getZkProofKeys(transfer.Output.ZkPath+mixTy.TransOutputCircuit, transfer.Output.ZkPath+mixTy.TransOutputPk, *changePart, req.Privacy)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "change getZkProofKeys") return nil, errors.Wrapf(err, "change getZkProofKeys")
} }
if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, changeProof, transfer.Output.ZkPath+mixTy.TransOutputVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_TRANSFEROUTPUT, changeProof, transfer.Output.ZkPath+mixTy.TransOutputVk, req.Verify); err != nil {
return nil, errors.Wrapf(err, "change verifyProof fail") return nil, errors.Wrapf(err, "change verifyProof fail")
} }
changeProof.Secrets = changeDHSecret changeProof.Secrets = changeDHSecret
......
...@@ -139,12 +139,12 @@ func (p *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Transact ...@@ -139,12 +139,12 @@ func (p *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Transact
return nil, errors.Wrapf(err, "getWithdrawParams note=%s", note) return nil, errors.Wrapf(err, "getWithdrawParams note=%s", note)
} }
proofInfo, err := getZkProofKeys(withdraw.ZkPath+mixTy.WithdrawCircuit, withdraw.ZkPath+mixTy.WithdrawPk, *input) proofInfo, err := getZkProofKeys(withdraw.ZkPath+mixTy.WithdrawCircuit, withdraw.ZkPath+mixTy.WithdrawPk, *input, req.Privacy)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "getZkProofKeys note=%s", note) return nil, errors.Wrapf(err, "getZkProofKeys note=%s", note)
} }
//verify //verify
if err := p.verifyProofOnChain(mixTy.VerifyType_WITHDRAW, proofInfo, withdraw.ZkPath+mixTy.WithdrawVk); err != nil { if err := p.verifyProofOnChain(mixTy.VerifyType_WITHDRAW, proofInfo, withdraw.ZkPath+mixTy.WithdrawVk, req.Verify); err != nil {
return nil, errors.Wrapf(err, "verifyProof fail for note=%s", note) return nil, errors.Wrapf(err, "verifyProof fail for note=%s", note)
} }
......
...@@ -87,9 +87,9 @@ func decryptSecretData(req *mixTy.DecryptSecretData) (*mixTy.SecretData, error) ...@@ -87,9 +87,9 @@ func decryptSecretData(req *mixTy.DecryptSecretData) (*mixTy.SecretData, error)
return &raw, nil return &raw, nil
} }
func (p *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.ZkProofInfo, vkPath string) error { func (p *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.ZkProofInfo, vkPath string, verifyOnChain int32) error {
//vkpath verify //vkpath verify
if len(vkPath) > 0 { if verifyOnChain > 0 && len(vkPath) > 0 {
vk, err := getVerifyKey(vkPath) vk, err := getVerifyKey(vkPath)
if err != nil { if err != nil {
return errors.Wrapf(err, "getVerifyKey path=%s", vkPath) return errors.Wrapf(err, "getVerifyKey path=%s", vkPath)
...@@ -111,11 +111,7 @@ func (p *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.ZkProof ...@@ -111,11 +111,7 @@ func (p *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.ZkProof
Proof: proof, Proof: proof,
} }
//onchain verify //onchain verify
_, err := p.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{ _, err := p.walletOperate.GetAPI().Query(mixTy.MixX, "VerifyProof", verify)
Driver: "mix",
FuncName: "VerifyProof",
Param: types.Encode(verify),
})
return err return err
} }
...@@ -284,19 +280,34 @@ func updateTreePath(obj interface{}, treeProof *mixTy.TreePathProof) { ...@@ -284,19 +280,34 @@ func updateTreePath(obj interface{}, treeProof *mixTy.TreePathProof) {
} }
} }
//func printObj(obj interface{}) { func printObj(obj interface{}) {
// tv := reflect.ValueOf(obj) ty := reflect.TypeOf(obj)
// for i:=0;i<tv.NumField();i++{ tv := reflect.ValueOf(obj)
// name := tv.Field(i).Elem() n := ty.NumField()
// }
// for i, t := range treeProof.TreePath { for i := 0; i < n; i++ {
// tv.Elem().FieldByName("Path" + strconv.Itoa(i)).SetString(t) name := ty.Field(i).Name
// tv.Elem().FieldByName("Helper" + strconv.Itoa(i)).SetString(strconv.Itoa(int(treeProof.Helpers[i]))) v, ok := ty.Field(i).Tag.Lookup("tag")
// tv.Elem().FieldByName("Valid" + strconv.Itoa(i)).SetString("1") if !ok {
// } fmt.Println("fieldname=", ty.Field(i).Name, "not set tag")
//} }
fmt.Println("fieldname=", ty.Field(i).Name, "| value=", tv.FieldByName(name).Interface(), "| tag=", v)
}
}
func getZkProofKeys(circuitFile, pkFile string, inputs interface{}, privacyPrint int32) (*mixTy.ZkProofInfo, error) {
if privacyPrint > 0 {
fmt.Println("--output zk parameters for circuit:", circuitFile)
rst, err := json.MarshalIndent(inputs, "", " ")
if err != nil {
fmt.Println(err)
}
fmt.Println(string(rst))
}
func getZkProofKeys(circuitFile, pkFile string, inputs interface{}) (*mixTy.ZkProofInfo, error) {
assignments, err := getAssignments(inputs) assignments, err := getAssignments(inputs)
if err != nil { if err != nil {
return nil, err return nil, err
......
...@@ -2,6 +2,7 @@ package wallet ...@@ -2,6 +2,7 @@ package wallet
import ( import (
"encoding/hex" "encoding/hex"
"encoding/json"
"fmt" "fmt"
"reflect" "reflect"
"testing" "testing"
...@@ -87,13 +88,20 @@ func TestGetAssignments(t *testing.T) { ...@@ -87,13 +88,20 @@ func TestGetAssignments(t *testing.T) {
_, ok := reduceAssign["ReceiverPubKey"] _, ok := reduceAssign["ReceiverPubKey"]
assert.Equal(t, ok, false) assert.Equal(t, ok, false)
//tv := reflect.ValueOf(&deposit) tv := reflect.ValueOf(&deposit)
//tv.Elem().FieldByName("NoteHash").SetString("999") tv.Elem().FieldByName("NoteHash").SetString("999")
////tv.FieldByName("NoteHash").Elem().SetString("999") //tv.FieldByName("NoteHash").Elem().SetString("999")
//assert.Equal(t,"999",deposit.NoteHash) assert.Equal(t, "999", deposit.NoteHash)
var in WithdrawInput //var in WithdrawInput
initTreePath(&in) //initTreePath(&in)
assert.Equal(t, "99", in.Path1) //assert.Equal(t, "99", in.Path1)
printObj(deposit)
rst, err := json.MarshalIndent(deposit, "", " ")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(rst))
} }
func TestVerifyProof(t *testing.T) { func TestVerifyProof(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment