diff --git a/Cargo.lock b/Cargo.lock index 0e117379..c6cbd574 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -46,17 +46,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - [[package]] name = "ahash" version = "0.4.7" @@ -482,18 +471,6 @@ dependencies = [ "syn 2.0.48", ] -[[package]] -name = "auto_impl" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -512,7 +489,6 @@ dependencies = [ "hex", "hex-literal", "log", - "nomad-core", "parity-scale-codec", "scale-info", "serde", @@ -568,40 +544,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base58" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" - -[[package]] -name = "base58check" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee2fe4c9a0c84515f136aaae2466744a721af6d63339c18689d9e995d74d99b" -dependencies = [ - "base58", - "sha2 0.8.2", -] - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - [[package]] name = "base64" version = "0.13.1" @@ -614,12 +562,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bech32" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" - [[package]] name = "binary-merkle-tree" version = "4.0.0-dev" @@ -684,16 +626,6 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" -[[package]] -name = "bitvec" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] - [[package]] name = "bitvec" version = "1.0.1" @@ -701,7 +633,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ "funty", - "radium 0.7.0", + "radium", "tap", "wyz", ] @@ -788,12 +720,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - [[package]] name = "bs58" version = "0.5.0" @@ -838,9 +764,6 @@ name = "bytes" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -dependencies = [ - "serde", -] [[package]] name = "cast" @@ -908,16 +831,6 @@ dependencies = [ "half", ] -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "clap" version = "4.3.11" @@ -943,63 +856,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" -[[package]] -name = "coins-bip32" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634c509653de24b439672164bbf56f5f582a2ab0e313d3b0f6af0b7345cf2560" -dependencies = [ - "bincode", - "bs58 0.4.0", - "coins-core", - "digest 0.10.7", - "getrandom 0.2.10", - "hmac 0.12.1", - "k256 0.11.6", - "lazy_static", - "serde", - "sha2 0.10.7", - "thiserror", -] - -[[package]] -name = "coins-bip39" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a11892bcac83b4c6e95ab84b5b06c76d9d70ad73548dd07418269c5c7977171" -dependencies = [ - "bitvec 0.17.4", - "coins-bip32", - "getrandom 0.2.10", - "hex", - "hmac 0.12.1", - "pbkdf2 0.11.0", - "rand 0.8.5", - "sha2 0.10.7", - "thiserror", -] - -[[package]] -name = "coins-core" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94090a6663f224feae66ab01e41a2555a8296ee07b5f20dab8888bdefc9f617" -dependencies = [ - "base58check", - "base64 0.12.3", - "bech32", - "blake2", - "digest 0.10.7", - "generic-array 0.14.7", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2 0.10.7", - "sha3", - "thiserror", -] - [[package]] name = "common" version = "0.1.0" @@ -1068,15 +924,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "core-foundation-sys" version = "0.8.4" @@ -1203,18 +1050,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.2" @@ -1258,15 +1093,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - [[package]] name = "curve25519-dalek" version = "2.1.3" @@ -1321,16 +1147,6 @@ dependencies = [ "syn 2.0.48", ] -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "zeroize", -] - [[package]] name = "der" version = "0.7.7" @@ -1380,7 +1196,7 @@ version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "convert_case 0.4.0", + "convert_case", "proc-macro2", "quote", "rustc_version", @@ -1537,30 +1353,18 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ - "der 0.7.7", + "der", "digest 0.10.7", - "elliptic-curve 0.13.5", - "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", + "elliptic-curve", + "rfc6979", + "signature", + "spki", ] [[package]] @@ -1569,8 +1373,8 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8 0.10.2", - "signature 2.1.0", + "pkcs8", + "signature", ] [[package]] @@ -1607,41 +1411,21 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle", - "zeroize", -] - [[package]] name = "elliptic-curve" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.2", + "base16ct", + "crypto-bigint", "digest 0.10.7", - "ff 0.13.0", + "ff", "generic-array 0.14.7", - "group 0.13.0", - "pkcs8 0.10.2", + "group", + "pkcs8", "rand_core 0.6.4", - "sec1 0.7.3", + "sec1", "subtle", "zeroize", ] @@ -1679,28 +1463,6 @@ dependencies = [ "libc", ] -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac 0.12.1", - "pbkdf2 0.11.0", - "rand 0.8.5", - "scrypt", - "serde", - "serde_json", - "sha2 0.10.7", - "sha3", - "thiserror", - "uuid", -] - [[package]] name = "ethabi" version = "18.0.0" @@ -1709,28 +1471,7 @@ checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ "ethereum-types", "hex", - "once_cell", - "regex", - "serde", - "serde_json", "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", ] [[package]] @@ -1739,63 +1480,11 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom", "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", "primitive-types", - "scale-info", "uint", ] -[[package]] -name = "ethers-core" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade3e9c97727343984e1ceada4fdab11142d2ee3472d2c67027d56b1251d4f15" -dependencies = [ - "arrayvec 0.7.4", - "bytes", - "chrono", - "convert_case 0.6.0", - "elliptic-curve 0.12.3", - "ethabi", - "generic-array 0.14.7", - "hex", - "k256 0.11.6", - "open-fastrlp", - "proc-macro2", - "rand 0.8.5", - "rlp", - "rlp-derive", - "serde", - "serde_json", - "strum", - "syn 1.0.109", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-signers" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f41ced186867f64773db2e55ffdd92959e094072a1d09a5e5e831d443204f98" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "elliptic-curve 0.12.3", - "eth-keystore", - "ethers-core", - "hex", - "rand 0.8.5", - "sha2 0.10.7", - "thiserror", -] - [[package]] name = "expander" version = "2.0.0" @@ -1830,16 +1519,6 @@ dependencies = [ "instant", ] -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "ff" version = "0.13.0" @@ -1921,7 +1600,7 @@ dependencies = [ "frame-metadata", "frame-support-procedural", "impl-trait-for-tuples", - "k256 0.13.1", + "k256", "log", "macro_magic", "parity-scale-codec", @@ -2130,10 +1809,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -2163,24 +1840,13 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", + "ff", "rand_core 0.6.4", "subtle", ] @@ -2239,12 +1905,6 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "hermit-abi" version = "0.3.2" @@ -2348,15 +2008,6 @@ dependencies = [ "parity-scale-codec", ] -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - [[package]] name = "impl-serde" version = "0.4.0" @@ -2417,15 +2068,6 @@ dependencies = [ "hashbrown 0.14.0", ] -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array 0.14.7", -] - [[package]] name = "instant" version = "0.1.12" @@ -2499,19 +2141,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.7", - "sha3", -] - [[package]] name = "k256" version = "0.13.1" @@ -2519,8 +2148,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", - "ecdsa 0.16.8", - "elliptic-curve 0.13.5", + "ecdsa", + "elliptic-curve", "once_cell", "sha2 0.10.7", ] @@ -2610,7 +2239,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" dependencies = [ "arrayref", - "base64 0.13.1", + "base64", "digest 0.9.0", "hmac-drbg", "libsecp256k1-core", @@ -2860,78 +2489,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" -[[package]] -name = "nomad-base" -version = "0.1.5" -dependencies = [ - "ethers-signers", - "nomad-core", - "nomad-signature", - "once_cell", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "nomad-core" -version = "0.1.5" -dependencies = [ - "async-trait", - "ethers-core", - "ethers-signers", - "nomad-signature", - "parity-scale-codec", - "primitive-types", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "sp-std 8.0.0", - "tiny-keccak", -] - -[[package]] -name = "nomad-merkle" -version = "0.1.3" -dependencies = [ - "avail-core", - "ethers-core", - "frame-support", - "hex-literal", - "nomad-core", - "parity-scale-codec", - "scale-info", - "serde", - "serde_json", - "sp-core", - "static_assertions", - "thiserror-no-std", - "tiny-keccak", -] - -[[package]] -name = "nomad-signature" -version = "0.1.3" -dependencies = [ - "byte-slice-cast", - "elliptic-curve 0.12.3", - "ethers-core", - "frame-support", - "generic-array 0.14.7", - "hex", - "k256 0.11.6", - "parity-scale-codec", - "scale-info", - "serde", - "sp-core", - "sp-runtime", - "thiserror-no-std", - "tiny-keccak", -] - [[package]] name = "num-bigint" version = "0.4.3" @@ -3048,31 +2605,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec 0.7.4", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "parity-scale-codec" version = "3.6.3" @@ -3080,7 +2612,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" dependencies = [ "arrayvec 0.7.4", - "bitvec 1.0.1", + "bitvec", "byte-slice-cast", "bytes", "impl-trait-for-tuples", @@ -3129,17 +2661,6 @@ dependencies = [ "windows-targets 0.48.1", ] -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - [[package]] name = "paste" version = "1.0.13" @@ -3155,18 +2676,6 @@ dependencies = [ "crypto-mac 0.11.1", ] -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac 0.12.1", - "password-hash", - "sha2 0.10.7", -] - [[package]] name = "percent-encoding" version = "2.3.0" @@ -3185,24 +2694,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.7", - "spki 0.7.2", + "der", + "spki", ] [[package]] @@ -3240,7 +2739,6 @@ checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" dependencies = [ "fixed-hash", "impl-codec", - "impl-rlp", "impl-serde", "scale-info", "uint", @@ -3359,12 +2857,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" - [[package]] name = "radium" version = "0.7.0" @@ -3552,17 +3044,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -3589,36 +3070,6 @@ dependencies = [ "merlin 3.0.0", ] -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -3714,15 +3165,6 @@ dependencies = [ "bytemuck", ] -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - [[package]] name = "same-file" version = "1.0.6" @@ -3738,7 +3180,7 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ - "bitvec 1.0.1", + "bitvec", "cfg-if", "derive_more", "parity-scale-codec", @@ -3812,42 +3254,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac 0.12.1", - "pbkdf2 0.11.0", - "salsa20", - "sha2 0.10.7", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "pkcs8 0.9.0", - "subtle", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct 0.2.0", - "der 0.7.7", + "base16ct", + "der", "generic-array 0.14.7", - "pkcs8 0.10.2", + "pkcs8", "subtle", "zeroize", ] @@ -3989,16 +3405,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "2.1.0" @@ -4133,7 +3539,7 @@ dependencies = [ "bitflags 1.3.2", "blake2", "bounded-collections", - "bs58 0.5.0", + "bs58", "dyn-clonable", "ed25519-zebra", "futures", @@ -4610,16 +4016,6 @@ dependencies = [ "sp-std 8.0.0", ] -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - [[package]] name = "spki" version = "0.7.2" @@ -4627,7 +4023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", - "der 0.7.7", + "der", ] [[package]] @@ -4657,28 +4053,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - [[package]] name = "substrate-bip39" version = "0.4.4" @@ -4686,7 +4060,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49eee6965196b32f882dd2ee85a92b1dbead41b04e53907f269de3b0dc04733c" dependencies = [ "hmac 0.11.0", - "pbkdf2 0.8.0", + "pbkdf2", "schnorrkel 0.9.1", "sha2 0.9.9", "zeroize", @@ -5078,12 +4452,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - [[package]] name = "unicode-xid" version = "0.2.4" @@ -5101,16 +4469,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.10", - "serde", -] - [[package]] name = "valuable" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 6653c36b..8faf7914 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,10 +4,6 @@ members = [ "core", "kate/recovery", "kate", - "nomad/signature", - "nomad/core", - "nomad/base", - "nomad/merkle", ] [profile.dev.package] diff --git a/core/Cargo.toml b/core/Cargo.toml index 2cdc1c00..bed34354 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -16,7 +16,6 @@ serde = { version = "1.0.196", default-features = false, features = ["derive", " static_assertions = { version = "1.1.0" } thiserror-no-std = { version = "2.0.2" } -nomad-core = {path = "../nomad/core", default-features = false} tiny-keccak = { version = "2.0.2", default-features = false, features = ["keccak"] } @@ -50,7 +49,6 @@ std = [ "hash256-std-hasher/std", "hex", "log/std", - "nomad-core/std", "scale-info/std", "serde/std", "sp-arithmetic/std", diff --git a/core/src/data_proof_v2.rs b/core/src/data_proof_v2.rs index 876b852b..e4e86450 100644 --- a/core/src/data_proof_v2.rs +++ b/core/src/data_proof_v2.rs @@ -1,10 +1,10 @@ #[cfg(feature = "runtime")] +use crate::keccak256_concat; +#[cfg(feature = "runtime")] use binary_merkle_tree::MerkleProof; use codec::{Decode, Encode}; use ethabi::{encode, Token}; use frame_support::BoundedVec; -#[cfg(feature = "runtime")] -use nomad_core::keccak256_concat; use scale_info::TypeInfo; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; diff --git a/core/src/lib.rs b/core/src/lib.rs index a35d5c44..46589799 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -168,3 +168,31 @@ macro_rules! ensure { } }}; } + +/// Variadic macro used by `keccak256_concat` internally. +#[macro_export] +macro_rules! keccak256_concat_update { + ($hasher:ident, $e:expr) => {{ + $hasher.update($e.as_ref()); + }}; + + ($hasher:ident, $e:expr, $($es:expr),+) => {{ + $hasher.update($e.as_ref()); + $crate::keccak256_concat_update!($hasher, $($es),+); + }}; +} + +/// Calculates the Kecck 256 of arguments with NO extra allocations to join inputs. +#[macro_export] +macro_rules! keccak256_concat{ + ($($arg:tt)*) => {{ + { + use tiny_keccak::Hasher as _; + let mut output = [0u8; 32]; + let mut hasher = tiny_keccak::Keccak::v256(); + $crate::keccak256_concat_update!(hasher, $($arg)*); + hasher.finalize(&mut output); + sp_core::H256::from(output) + } + }} +} diff --git a/nomad/base/Cargo.toml b/nomad/base/Cargo.toml deleted file mode 100644 index 387198f7..00000000 --- a/nomad/base/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "nomad-base" -version = "0.1.5" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -nomad-core = { path = "../core", default-features = false } -nomad-signature = { path = "../signature", default-features = false } - -# Substrate -codec = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } -scale-info = { version = "2", default-features = false, features = ["derive"] } -sp-core = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false } - -# Substrate runtime -sp-runtime = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false, optional = true } - -# Eth -ethers-signers = { version = "1", optional = true } - -# Others -once_cell = { version = "1.8.0", optional = true } -serde = { version = "1.0.196", default-features = false, features = ["derive"], optional = true } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "ethers-signers", - "nomad-core/std", - "nomad-signature/std", - "once_cell", - "scale-info/std", - "serde", - "sp-core/std", - "sp-runtime/std", -] -serde = [ "dep:serde" ] diff --git a/nomad/base/src/lib.rs b/nomad/base/src/lib.rs deleted file mode 100644 index 9b40c5a8..00000000 --- a/nomad/base/src/lib.rs +++ /dev/null @@ -1,111 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] - -use codec::{Decode, Encode, MaxEncodedLen}; -use nomad_core::{home_domain_hash, to_eth_signed_message_hash, NomadState, SignedUpdate, Update}; -use nomad_signature::SignatureError; -use scale_info::TypeInfo; -use sp_core::{H160, H256}; - -#[cfg(feature = "std")] -pub mod testing; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Copy, Encode, Decode, PartialEq, Eq, TypeInfo, MaxEncodedLen)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct NomadBase { - pub state: NomadState, - pub local_domain: u32, - pub committed_root: H256, - pub updater: H160, -} - -impl Default for NomadBase { - fn default() -> Self { - Self { - state: NomadState::Active, - local_domain: Default::default(), - committed_root: Default::default(), - updater: Default::default(), - } - } -} - -pub enum NomadBaseError { - FailedInitialization, -} - -impl NomadBase { - pub fn new(local_domain: u32, committed_root: H256, updater: H160) -> Self { - Self { - state: Default::default(), - local_domain, - committed_root, - updater, - } - } - - pub fn home_domain_hash(&self) -> H256 { - home_domain_hash(self.local_domain) - } - - pub fn set_committed_root(&mut self, new_committed_root: H256) { - self.committed_root = new_committed_root; - } - - pub fn is_updater_signature( - &self, - signed_update: &SignedUpdate, - ) -> Result { - let supposed_signing_hash = Update { - home_domain: self.local_domain, - previous_root: signed_update.previous_root(), - new_root: signed_update.new_root(), - } - .signing_hash(); - - let digest = to_eth_signed_message_hash(&supposed_signing_hash); - signed_update - .signature - .recover(digest) - .map(|a| a == self.updater) - } -} - -#[cfg(test)] -mod test { - use nomad_core::test_utils::Updater; - - use super::*; - use crate::testing::{FAKE_UPDATER, TEST_NOMAD_BASE, TEST_UPDATER, TEST_UPDATER_PRIVKEY}; - - #[test] - fn it_accepts_valid_signature() { - let valid_signed = TEST_UPDATER.sign_update(H256::repeat_byte(0), H256::repeat_byte(1)); - assert!( - TEST_NOMAD_BASE.is_updater_signature(&valid_signed).unwrap(), - "should have passed on valid signature" - ); - } - - #[test] - fn it_rejects_invalid_signature() { - let invalid_signed = FAKE_UPDATER.sign_update(H256::repeat_byte(0), H256::repeat_byte(1)); - assert!( - !TEST_NOMAD_BASE - .is_updater_signature(&invalid_signed) - .unwrap(), - "should have failed on invalid signature" - ); - - let other_updater = Updater::new(9999, TEST_UPDATER_PRIVKEY.parse().unwrap()); - let wrong_domain_signed = - other_updater.sign_update(H256::repeat_byte(0), H256::repeat_byte(1)); - assert!( - !TEST_NOMAD_BASE - .is_updater_signature(&wrong_domain_signed) - .unwrap(), - "should have failed on invalid signature" - ); - } -} diff --git a/nomad/base/src/testing.rs b/nomad/base/src/testing.rs deleted file mode 100644 index 75d35230..00000000 --- a/nomad/base/src/testing.rs +++ /dev/null @@ -1,33 +0,0 @@ -#[cfg(feature = "std")] -use ethers_signers::LocalWallet; -use nomad_core::test_utils::Updater; -use once_cell::sync::Lazy; - -use crate::NomadBase; - -pub const TEST_LOCAL_DOMAIN: u32 = 1111; -pub const TEST_UPDATER_PRIVKEY: &str = - "1111111111111111111111111111111111111111111111111111111111111111"; - -pub static TEST_UPDATER: Lazy = Lazy::new(|| { - let signer: LocalWallet = TEST_UPDATER_PRIVKEY.parse().unwrap(); - - Updater::new(TEST_LOCAL_DOMAIN, signer) -}); - -pub const FAKE_UPDATER_PRIVKEY: &str = - "2222222222222222222222222222222222222222222222222222222222222222"; - -pub static FAKE_UPDATER: Lazy = Lazy::new(|| { - let signer: LocalWallet = FAKE_UPDATER_PRIVKEY.parse().unwrap(); - - Updater::new(TEST_LOCAL_DOMAIN, signer) -}); - -pub static TEST_NOMAD_BASE: Lazy = Lazy::new(|| { - NomadBase::new( - TEST_LOCAL_DOMAIN, - Default::default(), - TEST_UPDATER.address(), - ) -}); diff --git a/nomad/core/Cargo.toml b/nomad/core/Cargo.toml deleted file mode 100644 index d78476a2..00000000 --- a/nomad/core/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "nomad-core" -version = "0.1.5" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -nomad-signature = { path = "../signature", default-features = false } - -# Substrate -codec = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } -primitive-types = { version = "0.12", default-features = false, features = ["scale-info", "codec"] } -scale-info = { version = "2", default-features = false, features = ["derive"] } -sp-core = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false } -sp-std = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false } - -sp-runtime = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false, optional = true } - -# Eth -ethers-core = { version = "1", optional = true } -ethers-signers = { version = "1", optional = true } - -# Others -serde = { version = "1.0.196", default-features = false, features = ["derive"], optional = true } -tiny-keccak = { version = "2.0.2", default-features = false, features = ["keccak"] } - -[dev-dependencies] -async-trait = { version = "0.1.42" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "ethers-core", - "ethers-signers", - "nomad-signature/std", - "primitive-types/serde", - "scale-info/std", - "serde", - "sp-runtime/std", - "sp-std/std", -] -serde = [ "dep:serde" ] -runtime-benchmarks = [] diff --git a/nomad/core/src/lib.rs b/nomad/core/src/lib.rs deleted file mode 100644 index ce6804bb..00000000 --- a/nomad/core/src/lib.rs +++ /dev/null @@ -1,90 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] - -/// Variadic macro used by `keccak256_concat` internally. -#[macro_export] -macro_rules! keccak256_concat_update { - ($hasher:ident, $e:expr) => {{ - $hasher.update($e.as_ref()); - }}; - - ($hasher:ident, $e:expr, $($es:expr),+) => {{ - $hasher.update($e.as_ref()); - $crate::keccak256_concat_update!($hasher, $($es),+); - }}; -} - -/// Calculates the Kecck 256 of arguments with NO extra allocations to join inputs. -#[macro_export] -macro_rules! keccak256_concat{ - ($($arg:tt)*) => {{ - { - use tiny_keccak::Hasher as _; - let mut output = [0u8; 32]; - let mut hasher = tiny_keccak::Keccak::v256(); - $crate::keccak256_concat_update!(hasher, $($arg)*); - hasher.finalize(&mut output); - sp_core::H256::from(output) - } - }} -} - -extern crate alloc; - -mod update_v2; - -mod update; -pub use update::*; - -mod state; -pub use state::*; - -mod nomad_message; -pub use nomad_message::*; - -mod typed_message; -pub use typed_message::*; - -mod utils; -pub use utils::*; - -#[cfg(feature = "std")] -pub mod test_utils; - -#[cfg(test)] -mod test { - use sp_core::H256; - use sp_runtime::traits::{Hash, Keccak256}; - - /// Tests `keccak256_concat` macro expansion with several arguments. - #[test] - fn it_keccak_256_contact() { - let a = b"123"; - let b = b"456"; - let c = b"789"; - let abc = vec![a, b, c] - .into_iter() - .flatten() - .copied() - .collect::>(); - - // Single - let output = keccak256_concat!(a); - let expected = Keccak256::hash(&a[..]); - assert_eq!(output, expected); - - // Variadic - let output = keccak256_concat!(a, b, c); - let expected = Keccak256::hash(abc.as_slice()); - assert_eq!(output, expected); - - // Test `as_ref()`. - let output = keccak256_concat!(H256::default(), a, b); - let concat = vec![H256::default().as_bytes(), a, b] - .into_iter() - .flatten() - .copied() - .collect::>(); - let expected = Keccak256::hash(concat.as_slice()); - assert_eq!(output, expected); - } -} diff --git a/nomad/core/src/nomad_message.rs b/nomad/core/src/nomad_message.rs deleted file mode 100644 index af4915fd..00000000 --- a/nomad/core/src/nomad_message.rs +++ /dev/null @@ -1,100 +0,0 @@ -use codec::{Decode, Encode}; -use scale_info::TypeInfo; -use sp_core::{bounded::BoundedVec, Get, H256}; -use sp_std::{mem::size_of, vec::Vec}; - -/// Size of `NomadMessage` fields except `body`. -pub const NON_BODY_LENGTH: usize = 3 * size_of::() + 2 * size_of::(); - -/// A full Nomad message -#[derive(Clone, Encode, Decode, PartialEq, Eq, TypeInfo)] -pub struct NomadMessage> { - /// 4 SLIP-44 ID - pub origin: u32, - /// 32 Address in home convention - pub sender: H256, - /// 4 Count of all previous messages to destination - pub nonce: u32, - /// 4 SLIP-44 ID - pub destination: u32, - /// 32 Address in destination convention - pub recipient: H256, - /// 0+ Message contents - pub body: BoundedVec, -} - -impl> NomadMessage { - /// Serialize to a vec - pub fn to_vec(&self) -> Vec { - let size = NON_BODY_LENGTH + self.body.len(); - let mut buf = Vec::::with_capacity(size); - - buf.extend_from_slice(&self.origin.to_be_bytes()); - buf.extend_from_slice(self.sender.as_ref()); - buf.extend_from_slice(&self.nonce.to_be_bytes()); - buf.extend_from_slice(&self.destination.to_be_bytes()); - buf.extend_from_slice(self.recipient.as_ref()); - buf.extend_from_slice(&self.body); - - buf - } - - /// Get hash of message - pub fn hash(&self) -> H256 { - keccak256_concat!( - &self.origin.to_be_bytes(), - &self.sender, - &self.nonce.to_be_bytes(), - &self.destination.to_be_bytes(), - &self.recipient, - &self.body - ) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use sp_core::ConstU32; - use sp_std::mem::size_of_val; - - type MaxBodyLen = ConstU32<1024>; - - /// Double checks that constant `NON_BODY_LENGTH` will be synchronized with actual - #[test] - fn non_body_lenght_synch_with_nomad_message_type() { - let m = NomadMessage:: { - origin: 0, - sender: Default::default(), - nonce: 0, - destination: 0, - recipient: Default::default(), - body: Default::default(), - }; - - let actual_non_body_len = size_of_val(&m.origin) - + size_of_val(&m.sender) - + size_of_val(&m.nonce) - + size_of_val(&m.destination) - + size_of_val(&m.recipient); - - assert_eq!(actual_non_body_len, NON_BODY_LENGTH); - } - - #[test] - fn formats_message_to_vec() { - let body = [1u8; 32]; - let bounded: BoundedVec = body.to_vec().try_into().unwrap(); - - let message = NomadMessage { - origin: 0, - sender: Default::default(), - nonce: 0, - destination: 0, - recipient: Default::default(), - body: bounded, - }; - - assert_eq!(message.to_vec().len(), NON_BODY_LENGTH + 32); - } -} diff --git a/nomad/core/src/state.rs b/nomad/core/src/state.rs deleted file mode 100644 index 69396591..00000000 --- a/nomad/core/src/state.rs +++ /dev/null @@ -1,20 +0,0 @@ -use codec::{Decode, Encode, MaxEncodedLen}; -use scale_info::TypeInfo; - -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Copy, Encode, Decode, Eq, PartialEq, TypeInfo, MaxEncodedLen)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub enum NomadState { - /// Contract is active - Active, - /// Contract has failed - Failed, -} - -impl Default for NomadState { - fn default() -> Self { - Self::Active - } -} diff --git a/nomad/core/src/test_utils.rs b/nomad/core/src/test_utils.rs deleted file mode 100644 index 7e1d62aa..00000000 --- a/nomad/core/src/test_utils.rs +++ /dev/null @@ -1,55 +0,0 @@ -use ethers_core::utils::hash_message; -use ethers_signers::{LocalWallet, Signer}; -use nomad_signature::Signature; -use sp_core::{H160, H256}; - -use crate::{ - update_v2::{SignedUpdateV2, UpdateV2}, - SignedUpdate, Update, -}; - -#[derive(Debug, Clone)] -pub struct Updater { - pub domain: u32, - pub signer: LocalWallet, -} - -impl Updater { - pub const fn new(domain: u32, signer: LocalWallet) -> Self { - Self { domain, signer } - } - - pub fn address(&self) -> H160 { - self.signer.address().0.into() - } - - fn sign_message_without_eip_155>(&self, message: M) -> Signature { - // Had to reimplement hash and signing to remove async-ness for - // substrate testing - let message = message.as_ref(); - let message_hash = hash_message(message); - let mut signature = self.signer.sign_hash(message_hash); - - signature.v = 28 - (signature.v % 2); - signature.into() - } - - pub fn sign_update(&self, previous_root: H256, new_root: H256) -> SignedUpdate { - let update = Update { - home_domain: self.domain, - previous_root, - new_root, - }; - let signature = self.sign_message_without_eip_155(update.signing_hash()); - SignedUpdate { update, signature } - } - - pub fn sign_update_v2(&self, root: H256) -> SignedUpdateV2 { - let update = UpdateV2 { - home_domain: self.domain, - root, - }; - let signature = self.sign_message_without_eip_155(update.signing_hash()); - SignedUpdateV2 { update, signature } - } -} diff --git a/nomad/core/src/typed_message.rs b/nomad/core/src/typed_message.rs deleted file mode 100644 index d5fefa72..00000000 --- a/nomad/core/src/typed_message.rs +++ /dev/null @@ -1,32 +0,0 @@ -use core::{convert::TryFrom, mem}; - -use sp_std::vec::Vec; - -/// This trait provides structure for encoding a Vec as a xapp message. -/// First byte of Vec is a u8 corresponding to a message type. The remaining -/// bytes make up the message body. -pub trait TypedMessage { - type MessageEnum: TryFrom; - - /// Return the message body after the type byte - fn encode(&self) -> Vec; -} - -pub trait TypedMessageVariant -where - Self: Sized, -{ - const MESSAGE_TYPE: u8; - - /// Size of encoded struct (+ 1 for u8 type tag) - fn len(&self) -> usize { - mem::size_of::() + 1 - } - - fn is_empty(&self) -> bool { - self.len() == 0 - } - - /// Encode self into `BoundedVec` - fn encode(&self) -> Vec; -} diff --git a/nomad/core/src/update.rs b/nomad/core/src/update.rs deleted file mode 100644 index 9e05ad73..00000000 --- a/nomad/core/src/update.rs +++ /dev/null @@ -1,90 +0,0 @@ -use codec::{Decode, Encode}; -use nomad_signature::{hash_message, Signature, SignatureError}; -use scale_info::TypeInfo; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; -use sp_core::{RuntimeDebug, H160, H256}; - -use crate::utils::home_domain_hash; - -/// Nomad update -#[derive(Clone, Encode, Decode, PartialEq, Eq, RuntimeDebug, TypeInfo)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct Update { - /// The home chain - pub home_domain: u32, - /// The previous root - pub previous_root: H256, - /// The new root - pub new_root: H256, -} - -impl Update { - /// Get signing hash for update - pub fn signing_hash(&self) -> H256 { - keccak256_concat!( - home_domain_hash(self.home_domain), - self.previous_root, - self.new_root - ) - } - - fn prepended_hash(&self) -> H256 { - hash_message(self.signing_hash()) - } -} - -/// A Signed Nomad Update -#[derive(Clone, Encode, Decode, PartialEq, Eq, RuntimeDebug, TypeInfo)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct SignedUpdate { - /// The update - pub update: Update, - /// The signature - pub signature: Signature, -} - -impl SignedUpdate { - pub fn previous_root(&self) -> H256 { - self.update.previous_root - } - - pub fn new_root(&self) -> H256 { - self.update.new_root - } - - /// Recover the Ethereum address of the signer - pub fn recover(&self) -> Result { - self.signature.recover(self.update.prepended_hash()) - } - - /// Check whether a message was signed by a specific address - pub fn verify(&self, signer: H160) -> Result<(), SignatureError> { - self.signature.verify(self.update.prepended_hash(), signer) - } -} - -#[cfg(test)] -mod tests { - use super::H256; - use crate::test_utils::Updater; - - pub const TEST_UPDATER_PRIVKEY: &str = - "1111111111111111111111111111111111111111111111111111111111111111"; - - #[test] - fn recover_valid_update() { - use ethers_signers::{LocalWallet, Signer}; - - let wallet: LocalWallet = TEST_UPDATER_PRIVKEY.parse().unwrap(); - println!("Wallet address: {:x}", wallet.address()); - - let updater = Updater::new(1000, TEST_UPDATER_PRIVKEY.parse().unwrap()); - let signed_update = updater.sign_update(H256::repeat_byte(0), H256::repeat_byte(1)); - - let recovered = signed_update.recover().expect("!recover"); - println!("Recovered address: {:x}", recovered); - - signed_update.verify(updater.address()).expect("!sig"); - } -} diff --git a/nomad/core/src/update_v2.rs b/nomad/core/src/update_v2.rs deleted file mode 100644 index d4e05976..00000000 --- a/nomad/core/src/update_v2.rs +++ /dev/null @@ -1,78 +0,0 @@ -#![allow(dead_code)] - -use codec::{Decode, Encode}; -use nomad_signature::{hash_message, Signature, SignatureError}; -use scale_info::TypeInfo; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; -use sp_core::{H160, H256}; - -use crate::utils::home_domain_hash; - -/// Nomad update -#[derive(Clone, Encode, Decode, PartialEq, Eq, TypeInfo)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct UpdateV2 { - /// The home chain - pub home_domain: u32, - /// The new root - pub root: H256, -} - -impl UpdateV2 { - /// Get signing hash for update - pub fn signing_hash(&self) -> H256 { - keccak256_concat!(home_domain_hash(self.home_domain), self.root) - } - - fn prepended_hash(&self) -> H256 { - hash_message(self.signing_hash()) - } -} - -/// A Signed Nomad Update -#[derive(Clone, Encode, Decode, PartialEq, Eq, TypeInfo)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct SignedUpdateV2 { - /// The update - pub update: UpdateV2, - /// The signature - pub signature: Signature, -} - -impl SignedUpdateV2 { - /// Recover the Ethereum address of the signer - pub fn recover(&self) -> Result { - self.signature.recover(self.update.prepended_hash()) - } - - /// Check whether a message was signed by a specific address - pub fn verify(&self, signer: H160) -> Result<(), SignatureError> { - self.signature.verify(self.update.prepended_hash(), signer) - } -} - -#[cfg(test)] -mod tests { - use super::H256; - use crate::test_utils::Updater; - - pub const TEST_UPDATER_PRIVKEY: &str = - "1111111111111111111111111111111111111111111111111111111111111111"; - - #[test] - fn recover_valid_update_v2() { - use ethers_signers::{LocalWallet, Signer}; - - let wallet: LocalWallet = TEST_UPDATER_PRIVKEY.parse().unwrap(); - println!("Wallet address: {:x}", wallet.address()); - - let updater = Updater::new(1000, TEST_UPDATER_PRIVKEY.parse().unwrap()); - let signed_update = updater.sign_update_v2(H256::repeat_byte(1)); - - let recovered = signed_update.recover().expect("!recover"); - println!("Recovered address: {:x}", recovered); - - signed_update.verify(updater.address()).expect("!sig"); - } -} diff --git a/nomad/core/src/utils.rs b/nomad/core/src/utils.rs deleted file mode 100644 index f3391680..00000000 --- a/nomad/core/src/utils.rs +++ /dev/null @@ -1,20 +0,0 @@ -use sp_core::H256; - -const NOMAD_SUFFIX: &[u8] = b"NOMAD"; -const ETH_PREFIX: &[u8] = b"\x19Ethereum Signed Message:\n32"; - -/// Computes hash of home domain concatenated with "NOMAD" -pub fn home_domain_hash(home_domain: u32) -> H256 { - keccak256_concat!(home_domain.to_be_bytes(), NOMAD_SUFFIX) -} - -/// Hash a message according to EIP-191 with the ethereum signed message prefix. -pub fn to_eth_signed_message_hash(hash: &H256) -> H256 { - keccak256_concat!(ETH_PREFIX, hash) -} - -/// Destination and destination-specific nonce combined in single field ( -/// (destination << 32) & nonce) -pub fn destination_and_nonce(destination: u32, nonce: u32) -> u64 { - ((destination as u64) << 32) | nonce as u64 -} diff --git a/nomad/merkle/Cargo.toml b/nomad/merkle/Cargo.toml deleted file mode 100644 index 3ece5328..00000000 --- a/nomad/merkle/Cargo.toml +++ /dev/null @@ -1,47 +0,0 @@ -[package] -name = "nomad-merkle" -version = "0.1.3" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -# Internal -avail-core = { path = "../../core", default-features = false } -nomad-core = { path = "../core", default-features = false } - -# Substrate -codec = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } -scale-info = { version = "2", default-features = false, features = ["derive"] } -sp-core = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false } - -frame-support = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false, optional = true } - -# 3rd-party -hex-literal = { version = "0.3.4" } -static_assertions = { version = "1.1.0" } -thiserror-no-std = { version = "2.0.2" } -tiny-keccak = { version = "2.0.2", default-features = false, features = ["keccak"] } - -[dev-dependencies] -ethers-core = { version = "1" } -serde = { version = "1.0.196", features = ["derive"] } -serde_json = { version = "1.0" } - -[dependencies.serde] -version = "1.0" -default-features = false -optional = true -features = ["derive"] - -[features] -default = [ "std" ] -std = [ - "avail-core/std", - "codec/std", - "frame-support/std", - "nomad-core/std", - "scale-info/std", - "serde", - "sp-core/std", -] diff --git a/nomad/merkle/fixtures/merkle.json b/nomad/merkle/fixtures/merkle.json deleted file mode 100644 index 1a672b05..00000000 --- a/nomad/merkle/fixtures/merkle.json +++ /dev/null @@ -1,2029 +0,0 @@ -[ - { - "testName": "three leaves", - "expectedRoot": "0x18f2f1646fee335a1eaf5191a8ce58ea772080057d0fda687df59c45e47e6f68", - "leaves": [ - "one", - "two", - "three" - ], - "proofs": [ - { - "leaf": "0xf0fe7c99ef23ace1835385e83dd61c9ecb6192d6514fcc13356ef912788eaa8a", - "index": 0, - "path": [ - "0x65ad6b7c39c687dad3edc05bec09300b742363f5c1f42db586bdce40c9fc5eef", - "0xe9884debea0619a2ce25ba3bbe6a4438a42bc11b2308f62c65ed43be0b43d445", - "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x65ad6b7c39c687dad3edc05bec09300b742363f5c1f42db586bdce40c9fc5eef", - "index": 1, - "path": [ - "0xf0fe7c99ef23ace1835385e83dd61c9ecb6192d6514fcc13356ef912788eaa8a", - "0xe9884debea0619a2ce25ba3bbe6a4438a42bc11b2308f62c65ed43be0b43d445", - "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x769dbf057c1b1544b7b4a9a4f98893cad73080764ad63ee83344312494dc296e", - "index": 2, - "path": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x606fc91d919e5a5b5b0ce2a1b2f6d33355b39558b5a12a4b14c3a381b18769a2", - "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - } - ] - }, - { - "testName": "one leaf", - "expectedRoot": "0x54fea87823728b754368018753f79a24e5f5cacee26c8785f3d33aabfd03372e", - "leaves": [ - "one" - ], - "proofs": [ - { - "leaf": "0xf0fe7c99ef23ace1835385e83dd61c9ecb6192d6514fcc13356ef912788eaa8a", - "index": 0, - "path": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", - "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - } - ] - }, - { - "testName": "no leaves", - "expectedRoot": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", - "leaves": [], - "proofs": [] - }, - { - "testName": "forty-two leaves", - "expectedRoot": "0x274d610098d8f109587e97c908cf549d129a14f5bad7eb10d36a427da97be6fc", - "leaves": [ - "bacon", - "eye", - "we", - "ghost", - "listen", - "corn", - "blonde", - "gutter", - "sanctuary", - "seat", - "generate", - "twist", - "waterfall", - "monster", - "elbow", - "flash", - "arrow", - "moment", - "cheat", - "unity", - "steak", - "shelter", - "camera", - "album", - "bread", - "tease", - "sentence", - "tribe", - "miserable", - "ridge", - "guerrilla", - "inhabitant", - "suspicion", - "mosque", - "printer", - "land", - "reliable", - "circle", - "first-hand", - "time", - "content", - "management" - ], - "proofs": [ - { - "leaf": "0xdedc5b0226dc6135af110369edd66b863f13c89043d4f68b914be1cefe27304e", - "index": 0, - "path": [ - "0x4f4fa1fc880f5f6622bd953386092771d488568327e40eaa09c403e1e4529eac", - "0x66677e36ec586995e5e91cc3bc3ff07208c03b59f3b4058dc56e608dcabe20c5", - "0xa19e6312073514ab346a7db383ab9ca167f1b9d0eb6dc76225eeb1cac766630f", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x4f4fa1fc880f5f6622bd953386092771d488568327e40eaa09c403e1e4529eac", - "index": 1, - "path": [ - "0xdedc5b0226dc6135af110369edd66b863f13c89043d4f68b914be1cefe27304e", - "0x66677e36ec586995e5e91cc3bc3ff07208c03b59f3b4058dc56e608dcabe20c5", - "0xa19e6312073514ab346a7db383ab9ca167f1b9d0eb6dc76225eeb1cac766630f", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x7003a5b06332d5f75cdf9474ccf863a7986f2eebf8fb54122011dfa4f5a0ec1f", - "index": 2, - "path": [ - "0xdb07d7a5fdaaf861f5ae3a145081c53fb6b111bffab064e201c3682b3f254fab", - "0xafe54c4a88d8b9e4707a28576e41d0be20418ab90b10654ebfd00aecd2bad592", - "0xa19e6312073514ab346a7db383ab9ca167f1b9d0eb6dc76225eeb1cac766630f", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xdb07d7a5fdaaf861f5ae3a145081c53fb6b111bffab064e201c3682b3f254fab", - "index": 3, - "path": [ - "0x7003a5b06332d5f75cdf9474ccf863a7986f2eebf8fb54122011dfa4f5a0ec1f", - "0xafe54c4a88d8b9e4707a28576e41d0be20418ab90b10654ebfd00aecd2bad592", - "0xa19e6312073514ab346a7db383ab9ca167f1b9d0eb6dc76225eeb1cac766630f", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xd9fa9b21a8500576003cc17f6f715898735b4affe6021bba300fd88b6665e70f", - "index": 4, - "path": [ - "0x745df104209724b953eadc3bdcdce16c87be927a33f6b61a1eabea980983111d", - "0x8e6af6a7c964ca809ed0fd77c7261eed5f23baf9bfe8c3aa98cb84b0a21c5190", - "0x97748c9f3b4fe02bfbca5b7752b04b6f77fc3f0753ad711b5cff568104d31a0c", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x745df104209724b953eadc3bdcdce16c87be927a33f6b61a1eabea980983111d", - "index": 5, - "path": [ - "0xd9fa9b21a8500576003cc17f6f715898735b4affe6021bba300fd88b6665e70f", - "0x8e6af6a7c964ca809ed0fd77c7261eed5f23baf9bfe8c3aa98cb84b0a21c5190", - "0x97748c9f3b4fe02bfbca5b7752b04b6f77fc3f0753ad711b5cff568104d31a0c", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x3c508ba7eb05bc907dc43e906bd5998745a94c400ba840e3a2252a1fe0493da2", - "index": 6, - "path": [ - "0x473776a7204dbaaab3e5689b20893261ab524105fe1b8f04e325e23ce33163d9", - "0xd985746e1f983a7d84824d0bc12f764fc0cfeec2850882a6dcb8b87e0049eee9", - "0x97748c9f3b4fe02bfbca5b7752b04b6f77fc3f0753ad711b5cff568104d31a0c", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x473776a7204dbaaab3e5689b20893261ab524105fe1b8f04e325e23ce33163d9", - "index": 7, - "path": [ - "0x3c508ba7eb05bc907dc43e906bd5998745a94c400ba840e3a2252a1fe0493da2", - "0xd985746e1f983a7d84824d0bc12f764fc0cfeec2850882a6dcb8b87e0049eee9", - "0x97748c9f3b4fe02bfbca5b7752b04b6f77fc3f0753ad711b5cff568104d31a0c", - "0x0bf20de5643721f47c8833fd9f81ed5b4e38b051a8fc8017c1540bbb91b32638", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xc3be211a46aaf5876c32021a85edeff36cce1c0e61a48bc93b3e71b9e2f55b17", - "index": 8, - "path": [ - "0xb281dd16a96ca77a323e291058930e46428f4931fb3aec25d07b1574584f731c", - "0xd4ae409d561eaa3eb0d4cd034a63bf37f4ac7b6d722ee496064a2bb70644ce44", - "0xc6e696f0f313b67ef05f0afa77826f5373e7fe6d769bd42b8c94ea27e640728b", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xb281dd16a96ca77a323e291058930e46428f4931fb3aec25d07b1574584f731c", - "index": 9, - "path": [ - "0xc3be211a46aaf5876c32021a85edeff36cce1c0e61a48bc93b3e71b9e2f55b17", - "0xd4ae409d561eaa3eb0d4cd034a63bf37f4ac7b6d722ee496064a2bb70644ce44", - "0xc6e696f0f313b67ef05f0afa77826f5373e7fe6d769bd42b8c94ea27e640728b", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xcae382a2f3f639f6e833ae37e4db2603b617e74827f8d819f9d64bad9d90b9b1", - "index": 10, - "path": [ - "0x38c0d391c04c3bdd439ef968d599c65976150a72b1655d7d6650cbe5844a2502", - "0xca9b27d05fc15b94d68498e756f213b5f75393f2a26c686c24aae75227e0dcc6", - "0xc6e696f0f313b67ef05f0afa77826f5373e7fe6d769bd42b8c94ea27e640728b", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x38c0d391c04c3bdd439ef968d599c65976150a72b1655d7d6650cbe5844a2502", - "index": 11, - "path": [ - "0xcae382a2f3f639f6e833ae37e4db2603b617e74827f8d819f9d64bad9d90b9b1", - "0xca9b27d05fc15b94d68498e756f213b5f75393f2a26c686c24aae75227e0dcc6", - "0xc6e696f0f313b67ef05f0afa77826f5373e7fe6d769bd42b8c94ea27e640728b", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x5573d8dcf04fd96cfe496f0bbe58ae4c97b431577261107ad0970cb802548e6b", - "index": 12, - "path": [ - "0x76c94951c7a0535e1759714f1cf568a6b17327c115b31b24cc90fae4fc69ea9c", - "0x0298e56ac1989266f4a3137545bd1a97511f40530e6fa4e21fa951b324bad2d1", - "0x9836a5d16bebd9d88a110dd88207f1ba4bd9fa919cb59d0bc0c27a3c91c3611f", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x76c94951c7a0535e1759714f1cf568a6b17327c115b31b24cc90fae4fc69ea9c", - "index": 13, - "path": [ - "0x5573d8dcf04fd96cfe496f0bbe58ae4c97b431577261107ad0970cb802548e6b", - "0x0298e56ac1989266f4a3137545bd1a97511f40530e6fa4e21fa951b324bad2d1", - "0x9836a5d16bebd9d88a110dd88207f1ba4bd9fa919cb59d0bc0c27a3c91c3611f", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xb840bbb177fc5ba12f4c6d4c9af5077105d6c933b507edfc7db36c8a192913e1", - "index": 14, - "path": [ - "0xf65ec5e6611c7426cac9f7798fe934545c9c6f861b6ec87e07502fc2a5c6a43b", - "0xacede158b8b16bcfd5d3fd4e0547d1a4d3906537b9e505f2f13c8bb50b35b576", - "0x9836a5d16bebd9d88a110dd88207f1ba4bd9fa919cb59d0bc0c27a3c91c3611f", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xf65ec5e6611c7426cac9f7798fe934545c9c6f861b6ec87e07502fc2a5c6a43b", - "index": 15, - "path": [ - "0xb840bbb177fc5ba12f4c6d4c9af5077105d6c933b507edfc7db36c8a192913e1", - "0xacede158b8b16bcfd5d3fd4e0547d1a4d3906537b9e505f2f13c8bb50b35b576", - "0x9836a5d16bebd9d88a110dd88207f1ba4bd9fa919cb59d0bc0c27a3c91c3611f", - "0x6841d65094f6e26c290c0bf0d84270c7dbba56c9124126094daf5404650bb1b9", - "0xe3e71a410d357ee0708b0764646554ec888e950e4440cf0f138d2279c647bf59", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xa14e758134deb96c68f1ea4190d27ac4f14cd77b4bb44dc1757c35cad91fd249", - "index": 16, - "path": [ - "0xe70096bebc510a5a3b07b77cbe0444576da2f1c580dc143b1ccdc399095952c9", - "0x1ca9d77bfa38c6054c5cf7995458e00612f28e18bd93d4892f513e654301a0ed", - "0x1b9795e811e59c10161ebc3a6e419fbc9d02621575bdbe66fc5840202f4caf07", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xe70096bebc510a5a3b07b77cbe0444576da2f1c580dc143b1ccdc399095952c9", - "index": 17, - "path": [ - "0xa14e758134deb96c68f1ea4190d27ac4f14cd77b4bb44dc1757c35cad91fd249", - "0x1ca9d77bfa38c6054c5cf7995458e00612f28e18bd93d4892f513e654301a0ed", - "0x1b9795e811e59c10161ebc3a6e419fbc9d02621575bdbe66fc5840202f4caf07", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x668e924309f236219283c0f16640d294edf013d7bb4953531ff7bef8780b03da", - "index": 18, - "path": [ - "0xf2a7d3c8fab1a3bc703b08b5ce78ab8ebfd2b38336d70b39d6c55e6d796bfc7f", - "0xd785b494114d63896c3ea806462858f7172f356e5f02b8131ad9020da38f2b34", - "0x1b9795e811e59c10161ebc3a6e419fbc9d02621575bdbe66fc5840202f4caf07", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xf2a7d3c8fab1a3bc703b08b5ce78ab8ebfd2b38336d70b39d6c55e6d796bfc7f", - "index": 19, - "path": [ - "0x668e924309f236219283c0f16640d294edf013d7bb4953531ff7bef8780b03da", - "0xd785b494114d63896c3ea806462858f7172f356e5f02b8131ad9020da38f2b34", - "0x1b9795e811e59c10161ebc3a6e419fbc9d02621575bdbe66fc5840202f4caf07", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xca69fd669b297fe4cc27bfb7229389d8465a82217c373bd1f6b604d23dc75541", - "index": 20, - "path": [ - "0x5715c8e3de41f125c3006466f6ef1a610467ed45d89ac848fab504adbb3e868a", - "0xf4f6e397b08163292b827532b1577aa0f843ef48b25aa1aa6e96a0ecbb3f0534", - "0xea830ec90e2b4c4eec5a704c2fbf196270fbb0149e9025c43151f499dceda93c", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x5715c8e3de41f125c3006466f6ef1a610467ed45d89ac848fab504adbb3e868a", - "index": 21, - "path": [ - "0xca69fd669b297fe4cc27bfb7229389d8465a82217c373bd1f6b604d23dc75541", - "0xf4f6e397b08163292b827532b1577aa0f843ef48b25aa1aa6e96a0ecbb3f0534", - "0xea830ec90e2b4c4eec5a704c2fbf196270fbb0149e9025c43151f499dceda93c", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x31d1564a1b6b8dd1c5cd4036878b85c58efbbd65230f4076cd72cea24a98f154", - "index": 22, - "path": [ - "0x30b25cba6ec910fe7a0b4b70fe89e7bf67d1315d8119575b2811dd18e7eb3de2", - "0x4bb1f84869a082ff32090743d10afdd86db162a5a9f3f57367070261aa83631c", - "0xea830ec90e2b4c4eec5a704c2fbf196270fbb0149e9025c43151f499dceda93c", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x30b25cba6ec910fe7a0b4b70fe89e7bf67d1315d8119575b2811dd18e7eb3de2", - "index": 23, - "path": [ - "0x31d1564a1b6b8dd1c5cd4036878b85c58efbbd65230f4076cd72cea24a98f154", - "0x4bb1f84869a082ff32090743d10afdd86db162a5a9f3f57367070261aa83631c", - "0xea830ec90e2b4c4eec5a704c2fbf196270fbb0149e9025c43151f499dceda93c", - "0xa9746be9b9a03c397661e5f88a5ea0f3750eb25936f56da836758b720fa4cb48", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x1621364c11a2ca32daef709e72728bc398c1c9fca44a613b478378d431d68718", - "index": 24, - "path": [ - "0xc1093dcc4522764deb9b3c739183dee9ad341f34659da169f67c5f5ffd78ca19", - "0xd3589bcbd40fc75989260def3c87d37f007ae533238fe81cac92eb809af55a3c", - "0x26b17a6513d3c3f33be0e7440da0fcfdaa33b6bb69cbd2019503dcd06378d240", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xc1093dcc4522764deb9b3c739183dee9ad341f34659da169f67c5f5ffd78ca19", - "index": 25, - "path": [ - "0x1621364c11a2ca32daef709e72728bc398c1c9fca44a613b478378d431d68718", - "0xd3589bcbd40fc75989260def3c87d37f007ae533238fe81cac92eb809af55a3c", - "0x26b17a6513d3c3f33be0e7440da0fcfdaa33b6bb69cbd2019503dcd06378d240", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xca0cb7165fa77f59914e8df8d8b18c9f600dc1b27d1e92d39c45d13d813853c5", - "index": 26, - "path": [ - "0xec77244f0cc53d209a29424d4ba057b2bcc00b8d98d60843df7a3ed255613386", - "0x49985b3dfc2df830e274f4644bf418fe4e3d8010d2dd94f91123463d50213d99", - "0x26b17a6513d3c3f33be0e7440da0fcfdaa33b6bb69cbd2019503dcd06378d240", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xec77244f0cc53d209a29424d4ba057b2bcc00b8d98d60843df7a3ed255613386", - "index": 27, - "path": [ - "0xca0cb7165fa77f59914e8df8d8b18c9f600dc1b27d1e92d39c45d13d813853c5", - "0x49985b3dfc2df830e274f4644bf418fe4e3d8010d2dd94f91123463d50213d99", - "0x26b17a6513d3c3f33be0e7440da0fcfdaa33b6bb69cbd2019503dcd06378d240", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xc027e6fda36b1fe17d72fb8463da7835931991aa0a687d09383358188dc94aaa", - "index": 28, - "path": [ - "0x1e308c515825785648d1f880fb1153b70efc0c7041c4e4c1e92dd4e92f4d45ea", - "0x6b6d1518efc8be5b8601c7f27027ef9e0be813ee6db267d9cf7d0b0dd1899688", - "0xb8ccc25b33d396a0c5708f0cb13181d2618a6cc95dc538ef7cae850eaaea10ea", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x1e308c515825785648d1f880fb1153b70efc0c7041c4e4c1e92dd4e92f4d45ea", - "index": 29, - "path": [ - "0xc027e6fda36b1fe17d72fb8463da7835931991aa0a687d09383358188dc94aaa", - "0x6b6d1518efc8be5b8601c7f27027ef9e0be813ee6db267d9cf7d0b0dd1899688", - "0xb8ccc25b33d396a0c5708f0cb13181d2618a6cc95dc538ef7cae850eaaea10ea", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x75090a35989bed9e15c77acafd73ea8b6dd56cccf75160f79e80545c7d6fe9a1", - "index": 30, - "path": [ - "0x10546cdf15b1dbc40610fd6634d4e20e160d32aa2b499180e2531f9e4dff5f2b", - "0xf723df57b49cec812e5c7fbea7834a70982305eb81a407fb830a5189c50f3f3d", - "0xb8ccc25b33d396a0c5708f0cb13181d2618a6cc95dc538ef7cae850eaaea10ea", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x10546cdf15b1dbc40610fd6634d4e20e160d32aa2b499180e2531f9e4dff5f2b", - "index": 31, - "path": [ - "0x75090a35989bed9e15c77acafd73ea8b6dd56cccf75160f79e80545c7d6fe9a1", - "0xf723df57b49cec812e5c7fbea7834a70982305eb81a407fb830a5189c50f3f3d", - "0xb8ccc25b33d396a0c5708f0cb13181d2618a6cc95dc538ef7cae850eaaea10ea", - "0xd2c18eb014793f8344a112a2cbee465e788a9dc14ce89389b5d9c265ec6d416c", - "0x6f197b0602b9d16dbb069ca4dcf94a825347a35061cb30a6e044790722a3d754", - "0xc9baf9cda8eaf9b9a3b456dd0e6108cf9ccf2e4a150493365a62da49fee0426d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x15a0acea87ff0a9f0a28637acefa1caba9fdb66598701d6ea0666045549cb62f", - "index": 32, - "path": [ - "0x62cef892da1c8a3b6b222a5fc54a7e15588f500a5c39c15da38bb5192e1869af", - "0xe29484e6612551bf20faad9fba9d3687a1a0b59bc37313643b3d55ee187a74e6", - "0x5e623385224fae9d4efff4b86a3193c0b823e39a472614689fcc54b173d1e498", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x62cef892da1c8a3b6b222a5fc54a7e15588f500a5c39c15da38bb5192e1869af", - "index": 33, - "path": [ - "0x15a0acea87ff0a9f0a28637acefa1caba9fdb66598701d6ea0666045549cb62f", - "0xe29484e6612551bf20faad9fba9d3687a1a0b59bc37313643b3d55ee187a74e6", - "0x5e623385224fae9d4efff4b86a3193c0b823e39a472614689fcc54b173d1e498", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xd8e15a4aa45e47de08dc0d5a1b88a4567c8bb793de2b6309a924b34f21594400", - "index": 34, - "path": [ - "0x880f289aab63ef908117bb8f9b70156cc0a9bb4e527e504fd6a479aca7c03739", - "0x4812b6b9890e0c2d80fd365ac38a0bfd30c9ba5ab8b28396fa7295c5f7f9cc09", - "0x5e623385224fae9d4efff4b86a3193c0b823e39a472614689fcc54b173d1e498", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x880f289aab63ef908117bb8f9b70156cc0a9bb4e527e504fd6a479aca7c03739", - "index": 35, - "path": [ - "0xd8e15a4aa45e47de08dc0d5a1b88a4567c8bb793de2b6309a924b34f21594400", - "0x4812b6b9890e0c2d80fd365ac38a0bfd30c9ba5ab8b28396fa7295c5f7f9cc09", - "0x5e623385224fae9d4efff4b86a3193c0b823e39a472614689fcc54b173d1e498", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xaec1732926c6969efbb2e0bf2d6fc80bfe78e5f1dc1533b800acbd293a339f71", - "index": 36, - "path": [ - "0xdbbce7f4ed1905678a14232500d05429280e9e3902815e6a595a45643129c09b", - "0xcb28c96b9b0f8b8bde8916aa45bebf368883a3fb4f6638710cc3f61d8b1e185b", - "0x4226792eeb5d994cb82a53b3017f502a70efc87f12ce215824b5826be31ef7f1", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xdbbce7f4ed1905678a14232500d05429280e9e3902815e6a595a45643129c09b", - "index": 37, - "path": [ - "0xaec1732926c6969efbb2e0bf2d6fc80bfe78e5f1dc1533b800acbd293a339f71", - "0xcb28c96b9b0f8b8bde8916aa45bebf368883a3fb4f6638710cc3f61d8b1e185b", - "0x4226792eeb5d994cb82a53b3017f502a70efc87f12ce215824b5826be31ef7f1", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x9b11dd7ebcfce9fb6e57c39abe4657abc4ac1f894ffb231acc1d4b141324852c", - "index": 38, - "path": [ - "0xe536cf6c7b89b6d158f7081b541cd33369510425a367643eb90e091e6b6e430d", - "0x8f4bcde10bb01adc55bd8f857c43c14fa5576a8720f5bf5ff517f9b05d9a7580", - "0x4226792eeb5d994cb82a53b3017f502a70efc87f12ce215824b5826be31ef7f1", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xe536cf6c7b89b6d158f7081b541cd33369510425a367643eb90e091e6b6e430d", - "index": 39, - "path": [ - "0x9b11dd7ebcfce9fb6e57c39abe4657abc4ac1f894ffb231acc1d4b141324852c", - "0x8f4bcde10bb01adc55bd8f857c43c14fa5576a8720f5bf5ff517f9b05d9a7580", - "0x4226792eeb5d994cb82a53b3017f502a70efc87f12ce215824b5826be31ef7f1", - "0xfd53f69e35c997752fbf656b13f1cf48911a7d219d29bedd55b2687025ffacbf", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x0f4018446a76e502f3ebed4e1a68dbe7c802d148ee512dee783de380c317d0d8", - "index": 40, - "path": [ - "0x28346050f1a67ddd3f6f2f7bc5e25fd013f5c8862214a82223fb1dd5715900e4", - "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", - "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", - "0x321207516f2beb911791d1a42a49dbf554f4aa7b7472562545d39e2b959be65d", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x28346050f1a67ddd3f6f2f7bc5e25fd013f5c8862214a82223fb1dd5715900e4", - "index": 41, - "path": [ - "0x0f4018446a76e502f3ebed4e1a68dbe7c802d148ee512dee783de380c317d0d8", - "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", - "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", - "0x321207516f2beb911791d1a42a49dbf554f4aa7b7472562545d39e2b959be65d", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0xb6f125e6b2977262366343bbabcbbc6a9284533e85f4caa7140e22f2bd5ab139", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - } - ] - }, - { - "testName": "containing empty leaf", - "expectedRoot": "0x1841827275d59b7515da81fb121637567b70ebd8b38ec5aadb51f4300976cba1", - "leaves": [ - "anna", - "james", - "", - "luke", - "erin" - ], - "proofs": [ - { - "leaf": "0x8bffab2351d4f65868fcdbb6d31e19d67f61d10c49b1bcc90d60fed54d9ec259", - "index": 0, - "path": [ - "0xe1e277208109c76f11aadfd43d8945f7c78a32da28df09687378435425c7a636", - "0x1fb86381cdfbd54d7ceee326730da96d69acf815c35b6ab3b2cf8c2a5f3f74a4", - "0xf9735da6e2c0e7f08a672602e23a4b3d899b12756e9e6ea171f19fa8f93ec4d7", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0xe1e277208109c76f11aadfd43d8945f7c78a32da28df09687378435425c7a636", - "index": 1, - "path": [ - "0x8bffab2351d4f65868fcdbb6d31e19d67f61d10c49b1bcc90d60fed54d9ec259", - "0x1fb86381cdfbd54d7ceee326730da96d69acf815c35b6ab3b2cf8c2a5f3f74a4", - "0xf9735da6e2c0e7f08a672602e23a4b3d899b12756e9e6ea171f19fa8f93ec4d7", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x5f35dce98ba4fba25530a026ed80b2cecdaa31091ba4958b99b52ea1d068adad", - "index": 2, - "path": [ - "0x15881b991602c46d60dc4e4b7cb3c7d6df9fa9cfc6d93a749ac9428a8ad9f0d7", - "0x15baffb1b0f3a33541686a8c657aa2b592994a26c053479b3aedfdd303473675", - "0xf9735da6e2c0e7f08a672602e23a4b3d899b12756e9e6ea171f19fa8f93ec4d7", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x15881b991602c46d60dc4e4b7cb3c7d6df9fa9cfc6d93a749ac9428a8ad9f0d7", - "index": 3, - "path": [ - "0x5f35dce98ba4fba25530a026ed80b2cecdaa31091ba4958b99b52ea1d068adad", - "0x15baffb1b0f3a33541686a8c657aa2b592994a26c053479b3aedfdd303473675", - "0xf9735da6e2c0e7f08a672602e23a4b3d899b12756e9e6ea171f19fa8f93ec4d7", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - }, - { - "leaf": "0x8b6e037544bd6f5b933519214ac01249d909a992255c93dd2fad4ca2fe7d84fa", - "index": 4, - "path": [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5", - "0x8c1f4f82a62770b5cd35ea9d7dd4fcdea20e427b80be264b1f54d63464fbf74b", - "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", - "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", - "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", - "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", - "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", - "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", - "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", - "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", - "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", - "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", - "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", - "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", - "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", - "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", - "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", - "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", - "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", - "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", - "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", - "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", - "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", - "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", - "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", - "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", - "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", - "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", - "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", - "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", - "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - ] - } - ] - } -] diff --git a/nomad/merkle/src/error.rs b/nomad/merkle/src/error.rs deleted file mode 100644 index e81f110e..00000000 --- a/nomad/merkle/src/error.rs +++ /dev/null @@ -1,36 +0,0 @@ -use sp_core::H256; -use thiserror_no_std::Error; - -/// Tree Errors -#[derive(Debug, Clone, Copy, Error)] -pub enum VerifyingError { - /// Failed proof verification - #[error("Proof verification failed. Root is {expected}, produced is {actual}")] - #[allow(dead_code)] - VerificationFailed { - /// The expected root (this tree's current root) - expected: H256, - /// The root produced by branch evaluation - actual: H256, - }, -} - -/// Error type for merkle tree ops. -#[derive(Debug, PartialEq, Eq, Clone, Copy, Error)] -pub enum TreeError { - /// Trying to push in a leaf - #[error("Trying to push in a leaf")] - LeafReached, - /// No more space in the MerkleTree - #[error("No more space in the MerkleTree")] - MerkleTreeFull, - /// MerkleTree is invalid - #[error("MerkleTree is invalid")] - Invalid, - /// Incorrect Depth provided - #[error("Incorrect Depth provided")] - DepthTooSmall, - /// Depth provided too large - #[error("Provided tree depth exceeded 32")] - DepthTooLarge, -} diff --git a/nomad/merkle/src/lib.rs b/nomad/merkle/src/lib.rs deleted file mode 100644 index b5a288d2..00000000 --- a/nomad/merkle/src/lib.rs +++ /dev/null @@ -1,195 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] -#![warn(missing_debug_implementations)] -#![warn(missing_copy_implementations)] - -extern crate alloc; - -/// Hashing utils -pub mod utils; - -/// Common error types for the merkle trees. -pub mod error; - -/// A lightweight incremental merkle, suitable for running on-chain. Stores O -/// (1) data -pub mod light; -/// Merkle Proof struct -pub mod proof; - -/// Test utils -#[cfg(test)] -pub(crate) mod test_utils; - -use avail_core::ensure; -use sp_core::H256; - -/// Tree depth -pub const TREE_DEPTH: usize = 32; -/// An incremental Nomad protocol standard-depth tree -pub type NomadLightMerkle = light::LightMerkle; -/// A Nomad protocol standard-depth proof -pub type NomadProof = proof::Proof; - -pub use error::{TreeError, VerifyingError, VerifyingError::VerificationFailed}; -use hex_literal::hex; -pub use light::*; -pub use proof::*; -pub use utils::*; - -/// A cache of the zero hashes for each layer of the tree. -/// See `zero_hashes_pre_build()` test to check how it is calculated. -pub const ZERO_HASHES: [H256; TREE_DEPTH + 1] = [ - H256::zero(), - H256(hex!( - "ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5" - )), - H256(hex!( - "b4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30" - )), - H256(hex!( - "21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85" - )), - H256(hex!( - "e58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344" - )), - H256(hex!( - "0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d" - )), - H256(hex!( - "887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968" - )), - H256(hex!( - "ffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83" - )), - H256(hex!( - "9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af" - )), - H256(hex!( - "cefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0" - )), - H256(hex!( - "f9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5" - )), - H256(hex!( - "f8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892" - )), - H256(hex!( - "3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c" - )), - H256(hex!( - "c1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb" - )), - H256(hex!( - "5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc" - )), - H256(hex!( - "da7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2" - )), - H256(hex!( - "2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f" - )), - H256(hex!( - "e1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a" - )), - H256(hex!( - "5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0" - )), - H256(hex!( - "b46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0" - )), - H256(hex!( - "c65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2" - )), - H256(hex!( - "f4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9" - )), - H256(hex!( - "5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377" - )), - H256(hex!( - "4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652" - )), - H256(hex!( - "cdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef" - )), - H256(hex!( - "0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d" - )), - H256(hex!( - "b8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0" - )), - H256(hex!( - "838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e" - )), - H256(hex!( - "662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e" - )), - H256(hex!( - "388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322" - )), - H256(hex!( - "93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735" - )), - H256(hex!( - "8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" - )), - H256(hex!( - "27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757" - )), -]; - -/// A merkle proof -pub trait MerkleProof { - /// Calculate the merkle root of this proof's branch - fn root(&self) -> H256; -} - -/// A simple trait for merkle-based accumulators -pub trait Merkle: core::fmt::Debug + Default { - /// A proof of some leaf in this tree - type Proof: MerkleProof; - - /// The maximum number of elements the tree can ingest - fn max_elements() -> u32; - - /// The number of elements currently in the tree - fn count(&self) -> u32; - - /// Calculate the root hash of this Merkle tree. - fn root(&self) -> H256; - - /// Get the tree's depth. - fn depth(&self) -> usize; - - /// Push a leaf to the tree - fn ingest(&mut self, element: H256) -> Result; - - /// Verify a proof against this tree's root. - fn verify(&self, proof: &Self::Proof) -> Result<(), VerifyingError> { - let actual = proof.root(); - let expected = self.root(); - ensure!(expected == actual, VerificationFailed { expected, actual }); - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use nomad_core::keccak256_concat; - use sp_core::H256; - - use super::{TREE_DEPTH, ZERO_HASHES}; - - /// Ensures that `ZERO_HASHES` pre-build image is valid. - #[test] - fn zero_hashes_pre_build() { - // Build image. - let mut hashes = [H256::zero(); TREE_DEPTH + 1]; - for i in 0..TREE_DEPTH { - hashes[i + 1] = keccak256_concat!(hashes[i], hashes[i]); - } - - assert_eq!(hashes, ZERO_HASHES); - } -} diff --git a/nomad/merkle/src/light.rs b/nomad/merkle/src/light.rs deleted file mode 100644 index 584b1d0c..00000000 --- a/nomad/merkle/src/light.rs +++ /dev/null @@ -1,239 +0,0 @@ -use avail_core::ensure; -use codec::{Decode, Encode, MaxEncodedLen}; -use nomad_core::keccak256_concat; -use scale_info::TypeInfo; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; -use sp_core::{RuntimeDebug, H256}; - -use super::{error::TreeError, Merkle, MerkleProof, Proof, TREE_DEPTH, ZERO_HASHES}; - -/// Const assertions at `LightMerkle` struct. -struct AssertLightMerkleN; -impl AssertLightMerkleN { - /// `N` must be less or equal to `TREE_DEPTH`. - pub const N_LESS_EQ_TREE_DEPTH: usize = TREE_DEPTH - N; -} - -/// Verify at compilation time that `N <= TREE_DEPTH` -#[inline] -#[allow(path_statements)] -#[allow(clippy::no_effect)] -const fn const_assert_n_is_valid() { - AssertLightMerkleN::::N_LESS_EQ_TREE_DEPTH; -} - -/// An incremental merkle tree, modeled on the eth2 deposit contract -#[derive(Clone, Copy, Encode, Decode, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct LightMerkle { - #[cfg_attr(feature = "std", serde(with = "arrays"))] - branch: [H256; N], - count: u32, // TODO: is this reasonable over usize due to scale limitations -} - -impl Default for LightMerkle { - fn default() -> Self { - const_assert_n_is_valid::(); - let mut branch: [H256; N] = [Default::default(); N]; - branch - .iter_mut() - .enumerate() - .for_each(|(i, elem)| *elem = ZERO_HASHES[i]); - Self { branch, count: 0 } - } -} - -impl Merkle for LightMerkle { - type Proof = Proof; - - /// Return the maximum number of leaves in this tree - fn max_elements() -> u32 { - const_assert_n_is_valid::(); - 2u32.saturating_pow(N as u32) - } - - fn count(&self) -> u32 { - self.count - } - - fn root(&self) -> H256 { - let mut node: H256 = Default::default(); - let mut size = self.count; - - self.branch.iter().enumerate().for_each(|(i, elem)| { - let (left, right) = if (size & 1) == 1 { - (elem.as_bytes(), node.as_bytes()) - } else { - (node.as_bytes(), ZERO_HASHES[i].as_bytes()) - }; - node = keccak256_concat!(left, right); - size /= 2; - }); - - node - } - - fn depth(&self) -> usize { - N - } - - fn ingest(&mut self, element: H256) -> Result { - ensure!(Self::max_elements() > self.count, TreeError::MerkleTreeFull); - - let mut node = element; - - self.count += 1; - let mut size = self.count; - for i in 0..TREE_DEPTH { - if (size & 1) == 1 { - self.branch[i] = node; - return Ok(self.root()); - } - node = keccak256_concat!(self.branch[i].as_bytes(), node.as_bytes()); - size /= 2; - } - - Err(TreeError::Invalid) - } -} - -impl LightMerkle { - /// Instantiate a new tree with a known depth and a starting leaf-set - pub fn from_leaves(leaves: &[H256]) -> Result { - let mut tree = Self::default(); - - for leaf in leaves.iter() { - tree.ingest(*leaf).map_err(|_| TreeError::MerkleTreeFull)?; - } - - Ok(tree) - } - - /// Calculate the initital root of a tree of this depth - pub fn initial_root() -> H256 { - LightMerkle::::default().root() - } - - /// Get the leading-edge branch. - pub fn branch(&self) -> &[H256; N] { - &self.branch - } - - /// Verify a incremental merkle proof of inclusion - pub fn verify(&self, proof: &Proof) -> bool { - proof.root() == self.root() - } -} - -#[cfg(feature = "std")] -mod arrays { - use std::{convert::TryInto, marker::PhantomData}; - - use serde::{ - de::{SeqAccess, Visitor}, - ser::SerializeTuple, - Deserialize, Deserializer, Serialize, Serializer, - }; - pub fn serialize( - data: &[T; N], - ser: S, - ) -> Result { - let mut s = ser.serialize_tuple(N)?; - for item in data { - s.serialize_element(item)?; - } - s.end() - } - struct ArrayVisitor(PhantomData); - impl<'de, T, const N: usize> Visitor<'de> for ArrayVisitor - where - T: Deserialize<'de>, - { - type Value = [T; N]; - - fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { - formatter.write_str(&format!("an array of length {}", N)) - } - - #[inline] - fn visit_seq(self, mut seq: A) -> Result - where - A: SeqAccess<'de>, - { - // can be optimized using MaybeUninit - let mut data = Vec::with_capacity(N); - for _ in 0..N { - match (seq.next_element())? { - Some(val) => data.push(val), - None => return Err(serde::de::Error::invalid_length(N, &self)), - } - } - data.try_into() - .map_err(|_| serde::de::Error::custom("Failed to convert sized Vec into [T; N]")) - } - } - pub fn deserialize<'de, D, T, const N: usize>(deserializer: D) -> Result<[T; N], D::Error> - where - D: Deserializer<'de>, - T: Deserialize<'de>, - { - deserializer.deserialize_tuple(N, ArrayVisitor::(PhantomData)) - } -} - -#[cfg(test)] -mod test { - use ethers_core::utils::hash_message; - - use super::*; - use crate::{test_utils, NomadLightMerkle}; - - #[test] - fn it_calculates_the_initial_root() { - assert_eq!( - NomadLightMerkle::initial_root(), - "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757" - .parse() - .unwrap() - ); - } - - #[test] - fn it_computes_branch_roots() { - let test_cases = test_utils::load_merkle_test_json(); - for test_case in test_cases.iter() { - let mut tree = NomadLightMerkle::default(); - // insert the leaves - for leaf in test_case.leaves.iter() { - // TODO: ethers core and crate have different primitive types - // versions. Must get inner bytes and call into(). - let hashed_leaf = hash_message(leaf).0.into(); - tree.ingest(hashed_leaf).expect("!ingest"); - } - // assert the tree has the proper leaf count - assert_eq!(tree.count() as usize, test_case.leaves.len()); - // assert the tree generates the proper root - let root = tree.root(); // root is type H256 - assert_eq!(root, test_case.expected_root); - for n in 0..test_case.leaves.len() { - // check that the tree can verify the proof for this leaf - assert!(tree.verify(&test_case.proofs[n])); - } - } - } - - #[test] - fn it_n_less_than_max_tree_depth() { - const TREE_DEPTH_MINUS_ONE: usize = TREE_DEPTH - 1; - - let _ = LightMerkle::<0>::default(); - let _ = LightMerkle::<1>::default(); - let _ = LightMerkle::::default(); - let _ = LightMerkle::::default(); - - // Following code does not compile due to static asserts. - // const TREE_DEPTH_PLUS_ONE :usize = TREE_DEPTH +1; - // let _ = LightMerkle::::default(); - } -} diff --git a/nomad/merkle/src/proof.rs b/nomad/merkle/src/proof.rs deleted file mode 100644 index af4149ab..00000000 --- a/nomad/merkle/src/proof.rs +++ /dev/null @@ -1,60 +0,0 @@ -use sp_core::H256; - -use super::{merkle_root_from_branch, MerkleProof}; - -/// A merkle proof object. The leaf, its path to the root, and its index in the -/// tree. -#[derive(Debug)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -pub struct Proof { - /// The leaf - pub leaf: H256, - /// The index - pub index: usize, - /// The merkle branch - #[cfg_attr(test, serde(with = "const_array_serde"))] - pub path: [H256; N], -} - -#[cfg(test)] -mod const_array_serde { - use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serializer}; - - use super::H256; - - pub fn serialize(item: &[H256; N], serializer: S) -> Result - where - S: Serializer, - { - let mut seq = serializer.serialize_seq(Some(N))?; - for i in item { - seq.serialize_element(i)?; - } - seq.end() - } - - pub fn deserialize<'de, D, const N: usize>(d: D) -> Result<[H256; N], D::Error> - where - D: Deserializer<'de>, - { - let v: Vec = Deserialize::deserialize(d)?; - if v.len() != N { - Err(serde::de::Error::custom(format!( - "Expected a sequence with {} elements. Got {} elements", - N, - v.len() - ))) - } else { - let mut h: [H256; N] = [Default::default(); N]; - h.copy_from_slice(&v[..N]); - Ok(h) - } - } -} - -impl MerkleProof for Proof { - /// Calculate the merkle root produced by evaluating the proof - fn root(&self) -> H256 { - merkle_root_from_branch(self.leaf, &self.path, self.index) - } -} diff --git a/nomad/merkle/src/test_utils.rs b/nomad/merkle/src/test_utils.rs deleted file mode 100644 index 0192420c..00000000 --- a/nomad/merkle/src/test_utils.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![cfg(test)] - -use std::{fs::File, io::Read}; - -use sp_core::H256; - -use crate::NomadProof; - -/// Struct representing a single merkle test case -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(test, serde(rename_all = "camelCase"))] -pub struct MerkleTestCase { - /// Test case name - pub test_name: String, - /// Leaves of merkle tree - pub leaves: Vec, - /// Proofs for leaves in tree - pub proofs: Vec, - /// Root of tree - pub expected_root: H256, -} - -/// Reads merkle test case json file and returns a vector of `MerkleTestCase`s -pub fn load_merkle_test_json() -> Vec { - let mut file = File::open("fixtures/merkle.json").unwrap(); - let mut data = String::new(); - file.read_to_string(&mut data).unwrap(); - serde_json::from_str(&data).unwrap() -} diff --git a/nomad/merkle/src/utils.rs b/nomad/merkle/src/utils.rs deleted file mode 100644 index 05119ac1..00000000 --- a/nomad/merkle/src/utils.rs +++ /dev/null @@ -1,23 +0,0 @@ -use nomad_core::keccak256_concat; -use sp_core::H256; - -/// Compute a root hash from a leaf and a Merkle proof. -pub fn merkle_root_from_branch( - leaf: H256, - branch: &[H256; N], - index: usize, -) -> H256 { - let mut current = leaf; - - for (i, next) in branch.iter().enumerate().take(N) { - let ith_bit = (index >> i) & 0x01; - let (left, right) = if ith_bit == 1 { - (next.as_bytes(), current.as_bytes()) - } else { - (current.as_bytes(), next.as_bytes()) - }; - current = keccak256_concat!(left, right); - } - - current -} diff --git a/nomad/signature/Cargo.toml b/nomad/signature/Cargo.toml deleted file mode 100644 index d0ecebe0..00000000 --- a/nomad/signature/Cargo.toml +++ /dev/null @@ -1,54 +0,0 @@ -[package] -name = "nomad-signature" -version = "0.1.3" -authors = ["Luke Tchang "] -edition = "2021" -license = "MIT OR Apache-2.0" -readme = "README.md" -repository = "https://github.com/ltchang2019/no-std-eth-signature" -description = """ -`ethers-rs` signature implemented as no_std. -""" - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -# Substrate & Parity -codec = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] } -scale-info = { version = "2", default-features = false, features = ["derive"] } -sp-core = {git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false } - -frame-support = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false } -sp-runtime = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-v1.6.0-patch", default-features = false } - -# Eth -ethers-core = { version = "1", default-features = false, optional = true } - -# Others -elliptic-curve = { version = "0.12.3", default-features = false, features = ["sec1"] } -generic-array = { version = "0.14", default-features = false } -hex = { version = "0.4.3", default-features = false } -k256 = { version = "0.11.5", default-features = false, features = ["keccak256", "ecdsa"] } -serde = { version = "1.0.196", default-features = false, optional = true, features = ["derive"] } -thiserror-no-std = { version = "2.0.2" } -tiny-keccak = { version = "2.0.2", default-features = false, features = ["keccak"] } - -[dev-dependencies] -byte-slice-cast = { version = "1.2.1" } - -[features] -default = [ "std" ] -std = [ - "codec/std", - "ethers-core", - "frame-support/std", - "hex/std", - "scale-info/std", - "serde", - "sp-core/std", - "sp-runtime/std", -] -serde = [ "dep:serde" ] diff --git a/nomad/signature/README.md b/nomad/signature/README.md deleted file mode 100644 index 6b2c9f82..00000000 --- a/nomad/signature/README.md +++ /dev/null @@ -1 +0,0 @@ -`ethers-rs` signature implemented with as no_std. diff --git a/nomad/signature/src/lib.rs b/nomad/signature/src/lib.rs deleted file mode 100644 index ef546e5a..00000000 --- a/nomad/signature/src/lib.rs +++ /dev/null @@ -1,10 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] - -mod signature; -pub use crate::signature::*; - -mod utils; -pub use utils::*; - -#[macro_use] -extern crate alloc; diff --git a/nomad/signature/src/signature.rs b/nomad/signature/src/signature.rs deleted file mode 100644 index 558b864f..00000000 --- a/nomad/signature/src/signature.rs +++ /dev/null @@ -1,328 +0,0 @@ -// Code adapted from: https://github.com/gakonst/ethers-rs/blob/master/ethers-core/src/types/signature.rs - -use crate::utils::hash_message; -use alloc::{borrow::ToOwned, string::String, vec::Vec}; -use codec::{Decode, Encode}; -use core::convert::TryFrom; -use elliptic_curve::{consts::U32, sec1::ToEncodedPoint as _}; -use frame_support::ensure; -use generic_array::GenericArray; -use k256::{ - ecdsa::{ - recoverable::{Id as RecoveryId, Signature as RecoverableSignature}, - Error as K256SignatureError, Signature as K256Signature, - }, - PublicKey as K256PublicKey, -}; -use scale_info::TypeInfo; -use sp_core::{H160, H256, U256}; -use sp_runtime::{ - traits::{Hash, Keccak256}, - RuntimeDebug, -}; -use thiserror_no_std::Error; - -#[cfg(feature = "std")] -use core::{fmt, str::FromStr}; -#[cfg(feature = "serde")] -use serde::{Deserialize, Serialize}; - -type Address = H160; - -/// An error involving a signature. -#[derive(Debug, Error)] -pub enum SignatureError { - /// Invalid length, secp256k1 signatures are 65 bytes - #[error("invalid signature length, got {0}, expected 65")] - InvalidLength(usize), - /// When parsing a signature from string to hex - #[error(transparent)] - DecodingError(#[from] hex::FromHexError), - /// Thrown when signature verification failed (i.e. when the address that - /// produced the signature did not match the expected address) - #[error("Signature verification failed. Expected {0:?}, got {1:?}")] - VerificationError(Address, Address), - /// Internal error during signature recovery - #[error(transparent)] - K256Error(#[from] K256SignatureError), - /// Error in recovering public key from signature - #[error("Public key recovery error")] - RecoveryError, -} - -/// Recovery message data. -/// -/// The message data can either be a binary message that is first hashed -/// according to EIP-191 and then recovered based on the signature or a -/// precomputed hash. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum RecoveryMessage { - /// Message bytes - Data(Vec), - /// Message hash - Hash(H256), -} - -/// An ECDSA signature -#[derive(Clone, Encode, Decode, PartialEq, Eq, RuntimeDebug, TypeInfo)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -pub struct Signature { - /// R value - pub r: U256, - /// S Value - pub s: U256, - /// V value - pub v: u64, -} - -#[cfg(feature = "std")] -impl fmt::Display for Signature { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let sig = <[u8; 65]>::from(self); - write!(f, "{}", hex::encode(&sig[..])) - } -} - -impl Signature { - /// Verifies that signature on `message` was produced by `address` - pub fn verify(&self, message: M, address: A) -> Result<(), SignatureError> - where - M: Into, - A: Into
, - { - let address = address.into(); - let recovered = self.recover(message)?; - ensure!( - recovered == address, - SignatureError::VerificationError(address, recovered) - ); - - Ok(()) - } - - /// Recovers the Ethereum address which was used to sign the given message. - /// - /// Recovery signature data uses 'Electrum' notation, this means the `v` - /// value is expected to be either `27` or `28`. - pub fn recover(&self, message: M) -> Result - where - M: Into, - { - let message = message.into(); - let message_hash = match message { - RecoveryMessage::Data(ref message) => hash_message(message), - RecoveryMessage::Hash(hash) => hash, - }; - - let (recoverable_sig, _recovery_id) = self.as_signature()?; - let verify_key = recoverable_sig - .recover_verifying_key_from_digest_bytes(message_hash.as_ref().into())?; - - let public_key = K256PublicKey::from(&verify_key); - let public_key = public_key.to_encoded_point(/* compress = */ false); - let public_key = public_key.as_bytes(); - debug_assert_eq!(public_key[0], 0x04); - let hash = Keccak256::hash(&public_key[1..]); - Ok(Address::from_slice(&hash[12..])) - } - - /// Retrieves the recovery signature. - fn as_signature(&self) -> Result<(RecoverableSignature, RecoveryId), SignatureError> { - let recovery_id = self.recovery_id()?; - let signature = { - let mut r_bytes = [0u8; 32]; - let mut s_bytes = [0u8; 32]; - self.r.to_big_endian(&mut r_bytes); - self.s.to_big_endian(&mut s_bytes); - let gar: &GenericArray = GenericArray::from_slice(&r_bytes); - let gas: &GenericArray = GenericArray::from_slice(&s_bytes); - let sig = K256Signature::from_scalars(*gar, *gas)?; - RecoverableSignature::new(&sig, recovery_id)? - }; - - Ok((signature, recovery_id)) - } - - /// Retrieve the recovery ID. - pub fn recovery_id(&self) -> Result { - let standard_v = normalize_recovery_id(self.v); - Ok(RecoveryId::new(standard_v)?) - } - - /// Copies and serializes `self` into a new `Vec` with the recovery id included - #[allow(clippy::wrong_self_convention)] - pub fn to_vec(&self) -> Vec { - self.into() - } -} - -fn normalize_recovery_id(v: u64) -> u8 { - match v { - 0 => 0, - 1 => 1, - 27 => 0, - 28 => 1, - v if v >= 35 => ((v - 1) % 2) as _, - _ => 4, - } -} - -impl From for Signature { - fn from(src: sp_core::ecdsa::Signature) -> Self { - let raw_src = src.0; - let r = U256::from_big_endian(&raw_src[..32]); - let s = U256::from_big_endian(&raw_src[32..64]); - let v: u64 = raw_src[64].into(); - - Self { r, s, v } - } -} - -impl<'a> TryFrom<&'a [u8]> for Signature { - type Error = SignatureError; - - /// Parses a raw signature which is expected to be 65 bytes long where - /// the first 32 bytes is the `r` value, the second 32 bytes the `s` value - /// and the final byte is the `v` value in 'Electrum' notation. - fn try_from(bytes: &'a [u8]) -> Result { - if bytes.len() != 65 { - return Err(SignatureError::InvalidLength(bytes.len())); - } - - let v = bytes[64]; - let r = U256::from_big_endian(&bytes[0..32]); - let s = U256::from_big_endian(&bytes[32..64]); - - Ok(Signature { r, s, v: v.into() }) - } -} - -#[cfg(feature = "std")] -impl FromStr for Signature { - type Err = SignatureError; - - fn from_str(s: &str) -> Result { - let s = s.strip_prefix("0x").unwrap_or(s); - let bytes = hex::decode(s)?; - Signature::try_from(&bytes[..]) - } -} - -impl From<&Signature> for [u8; 65] { - fn from(src: &Signature) -> [u8; 65] { - let mut sig = [0u8; 65]; - src.r.to_big_endian(&mut sig[..32]); - src.s.to_big_endian(&mut sig[32..64]); - // TODO: What if we try to serialize a signature where - // the `v` is not normalized? - - // The u64 to u8 cast is safe because `sig.v` can only ever be 27 or 28 - // here. Regarding EIP-155, the modification to `v` happens during tx - // creation only _after_ the transaction is signed using - // `ethers_signers::to_eip155_v`. - sig[64] = src.v as u8; - sig - } -} - -impl From for [u8; 65] { - fn from(src: Signature) -> [u8; 65] { - <[u8; 65]>::from(&src) - } -} - -impl From<&Signature> for Vec { - fn from(src: &Signature) -> Vec { - <[u8; 65]>::from(src).to_vec() - } -} - -impl From for Vec { - fn from(src: Signature) -> Vec { - <[u8; 65]>::from(&src).to_vec() - } -} - -impl From<&[u8]> for RecoveryMessage { - fn from(s: &[u8]) -> Self { - s.to_owned().into() - } -} - -impl From> for RecoveryMessage { - fn from(s: Vec) -> Self { - RecoveryMessage::Data(s) - } -} - -impl From<&str> for RecoveryMessage { - fn from(s: &str) -> Self { - s.as_bytes().to_owned().into() - } -} - -impl From for RecoveryMessage { - fn from(s: String) -> Self { - RecoveryMessage::Data(s.into_bytes()) - } -} - -impl From<[u8; 32]> for RecoveryMessage { - fn from(hash: [u8; 32]) -> Self { - H256(hash).into() - } -} - -impl From for RecoveryMessage { - fn from(hash: H256) -> Self { - RecoveryMessage::Hash(hash) - } -} - -#[cfg(feature = "std")] -// Want to convert ethers signature into our no-std version in tests -impl From for Signature { - fn from(sig: ethers_core::types::Signature) -> Self { - // ethers-core 0.13.0 uses primitive types 0.11.1, sp-core 4.0.0-dev - // uses primitive types 0.10.1 - let r_bytes: [u8; 32] = sig.r.into(); - let s_bytes: [u8; 32] = sig.s.into(); - - Self { - r: r_bytes.into(), - s: s_bytes.into(), - v: sig.v, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn recover_web3_signature() { - // test vector taken from: - // https://web3js.readthedocs.io/en/v1.2.2/web3-eth-accounts.html#sign - let signature = Signature::from_str( - "b91467e570a6466aa9e9876cbcd013baba02900b8979d43fe208a4a4f339f5fd6007e74cd82e037b800186422fc2da167c747ef045e5d18a5f5d4300f8e1a0291c" - ).expect("could not parse signature"); - assert_eq!( - signature.recover("Some data").unwrap(), - Address::from_str("2c7536E3605D9C16a7a3D7b1898e529396a65c23").unwrap() - ); - } - - #[test] - fn signature_from_str() { - let s1 = Signature::from_str( - "0xaa231fbe0ed2b5418e6ba7c19bee2522852955ec50996c02a2fe3e71d30ddaf1645baf4823fea7cb4fcc7150842493847cfb6a6d63ab93e8ee928ee3f61f503500" - ).expect("could not parse 0x-prefixed signature"); - - let s2 = Signature::from_str( - "aa231fbe0ed2b5418e6ba7c19bee2522852955ec50996c02a2fe3e71d30ddaf1645baf4823fea7cb4fcc7150842493847cfb6a6d63ab93e8ee928ee3f61f503500" - ).expect("could not parse non-prefixed signature"); - - assert_eq!(s1, s2); - } -} diff --git a/nomad/signature/src/utils.rs b/nomad/signature/src/utils.rs deleted file mode 100644 index ce4e9ebf..00000000 --- a/nomad/signature/src/utils.rs +++ /dev/null @@ -1,25 +0,0 @@ -//! Various utilities for manipulating Ethereum related data -use sp_core::H256; -use tiny_keccak::{Hasher, Keccak}; - -const PREFIX: &str = "\x19Ethereum Signed Message:\n"; - -/// Hash a message according to EIP-191. -/// -/// The data is a UTF-8 encoded string and will enveloped as follows: -/// `"\x19Ethereum Signed Message:\n" + message.length + message` and hashed -/// using keccak256. -pub fn hash_message(message: S) -> H256 -where - S: AsRef<[u8]>, -{ - let message = message.as_ref(); - let eth_message = format!("{}{}", PREFIX, message.len()).into_bytes(); - - let mut output = [0u8; 32]; - let mut hasher = Keccak::v256(); - hasher.update(eth_message.as_ref()); - hasher.update(message); - hasher.finalize(&mut output); - output.into() -}