From 2d3dc6ea074f3c608ce19736645963353c4b77f9 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 13:37:15 -0700 Subject: [PATCH 01/53] not broken --- pallets/vector/src/lib.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 3ff5d25bc..89bf5e698 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -395,7 +395,29 @@ pub mod pallet { Weight::zero() } } - + // // TODO: Rename to FunctionInput + // #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + // pub struct FunctionInputs { + // pub updates: Vec, + // pub finality_update: FinalityUpdate, + // pub expected_current_slot: u64, + // pub store: LightClientStore, + // pub genesis_root: Bytes32, + // pub forks: Forks, + // pub execution_state_proof: ExecutionStateProof, + // } + // + // #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + // pub struct ExecutionStateProof { + // #[serde(rename = "executionStateRoot")] + // pub execution_state_root: B256, + // #[serde(rename = "executionStateBranch")] + // pub execution_state_branch: Vec, + // pub gindex: String, + // } + // /// Merkle branch index & depth for the execution state root proof. + // pub const MERKLE_BRANCH_INDEX: usize = 802; + // pub const MERKLE_BRANCH_DEPTH: usize = 9; #[pallet::call] impl Pallet where From 42f128b21160ef2b7efd3b10dc9e35f871419155 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 13:51:34 -0700 Subject: [PATCH 02/53] not broken --- Cargo.lock | 520 ++++++++++++++++++++++++++++++++++++-- Cargo.toml | 5 + pallets/vector/Cargo.toml | 5 +- 3 files changed, 508 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 229df3fc8..62a24a763 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,6 +128,38 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "alloy-primitives" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal 0.4.1", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" +dependencies = [ + "arrayvec", + "bytes", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -834,6 +866,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "auto_impl" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -848,7 +891,7 @@ dependencies = [ "binary-merkle-tree", "derive_more", "frame-support", - "hex-literal", + "hex-literal 0.3.4", "itertools 0.10.5", "log", "once_cell", @@ -1105,6 +1148,21 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitcoin_hashes" version = "0.11.0" @@ -1302,6 +1360,9 @@ name = "bytes" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] [[package]] name = "bzip2-sys" @@ -1570,7 +1631,7 @@ dependencies = [ "anstream", "anstyle", "clap_lex 0.7.0", - "strsim", + "strsim 0.11.1", "terminal_size", ] @@ -1653,6 +1714,25 @@ dependencies = [ "rand_chacha 0.3.1", ] +[[package]] +name = "common" +version = "0.5.5" +source = "git+https://github.com/a16z/helios.git#5d159575ceb0b46ca0c4ff6dab79799d3a5a7469" +dependencies = [ + "bytes", + "ethers-core", + "eyre", + "hex", + "serde", + "serde_json", + "snowbridge-milagro-bls", + "ssz_rs", + "superstruct", + "thiserror", + "tracing", + "zduny-wasm-timer", +] + [[package]] name = "common-path" version = "1.0.0" @@ -1674,6 +1754,26 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" +[[package]] +name = "consensus-core" +version = "0.1.0" +source = "git+https://github.com/a16z/helios.git#5d159575ceb0b46ca0c4ff6dab79799d3a5a7469" +dependencies = [ + "bytes", + "common 0.5.5", + "ethers-core", + "eyre", + "hex", + "serde", + "serde_json", + "snowbridge-milagro-bls", + "ssz_rs", + "superstruct", + "thiserror", + "tracing", + "zduny-wasm-timer", +] + [[package]] name = "console" version = "0.15.8" @@ -1687,6 +1787,19 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "const-hex" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -2143,7 +2256,7 @@ dependencies = [ "frame-system-rpc-runtime-api", "frame-try-runtime", "hex", - "hex-literal", + "hex-literal 0.3.4", "iai", "iai-callgrind", "kate", @@ -2236,16 +2349,38 @@ dependencies = [ ] [[package]] -name = "dashmap" -version = "5.5.3" +name = "darling" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.9", + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", ] [[package]] @@ -2783,7 +2918,13 @@ checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ "ethereum-types", "hex", + "once_cell", + "regex", + "serde", + "serde_json", "sha3", + "thiserror", + "uint", ] [[package]] @@ -2803,6 +2944,10 @@ checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", "tiny-keccak", ] @@ -2814,10 +2959,40 @@ checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ "ethbloom", "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", "primitive-types", + "scale-info", "uint", ] +[[package]] +name = "ethers-core" +version = "2.0.13" +source = "git+https://github.com/gakonst/ethers-rs?rev=3bf1a9e0d698e9fdfc91d0353878901af5a5c5ef#3bf1a9e0d698e9fdfc91d0353878901af5a5c5ef" +dependencies = [ + "arrayvec", + "bytes", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array 0.14.7", + "k256", + "num_enum", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum 0.26.3", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -2868,6 +3043,16 @@ dependencies = [ "syn 2.0.53", ] +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -2880,6 +3065,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "fdlimit" version = "0.3.0" @@ -3272,7 +3468,7 @@ dependencies = [ "derive_more", "docify", "frame-support", - "hex-literal", + "hex-literal 0.3.4", "itertools 0.10.5", "kate", "log", @@ -3828,6 +4024,12 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hkdf" version = "0.12.4" @@ -4044,6 +4246,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.2.3" @@ -4151,6 +4359,12 @@ dependencies = [ "quote", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -4494,7 +4708,7 @@ dependencies = [ "dusk-bytes", "dusk-plonk", "hex", - "hex-literal", + "hex-literal 0.3.4", "kate-recovery", "log", "nalgebra", @@ -4559,6 +4773,16 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "keystream" version = "1.0.0" @@ -5869,6 +6093,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -5929,6 +6174,31 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "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 = "openssl-probe" version = "0.1.5" @@ -6530,17 +6800,20 @@ dependencies = [ name = "pallet-vector" version = "1.0.0" dependencies = [ + "alloy-primitives", "ark-bn254", "ark-ff 0.3.0", "ark-groth16", "ark-std 0.4.0", "avail-base", "avail-core", + "common 0.5.5", + "consensus-core", "ethabi", "frame-benchmarking", "frame-support", "frame-system", - "hex-literal", + "hex-literal 0.3.4", "log", "pallet-balances", "pallet-timestamp", @@ -6555,6 +6828,7 @@ dependencies = [ "sp-io", "sp-runtime", "sp-std", + "ssz_rs", "trie-db 0.24.0", ] @@ -6715,12 +6989,12 @@ dependencies = [ "hash-db 0.15.2", "hash256-std-hasher", "hex", - "hex-literal", + "hex-literal 0.3.4", "memory-db 0.30.0", "parity-scale-codec", "primitive-types", "rlp", - "rlp-derive", + "rlp-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-io", "tiny-keccak", "trie-db 0.24.0", @@ -7118,6 +7392,26 @@ dependencies = [ "syn 2.0.53", ] +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.2", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.11.9" @@ -7360,12 +7654,12 @@ dependencies = [ ] [[package]] -name = "raw-cpuid" -version = "11.1.0" +name = "rand_xorshift" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "bitflags 2.5.0", + "rand_core 0.6.4", ] [[package]] @@ -7549,7 +7843,7 @@ dependencies = [ "ark-std 0.4.0", "arrayvec", "blake2 0.10.6", - "common", + "common 0.1.0", "fflonk", "merlin", ] @@ -7599,6 +7893,7 @@ version = "0.5.2" source = "git+https://github.com/paritytech/parity-common.git?tag=rlp-v0.5.2#86676b08e89cb99fdff0c882453ad0746dd070cf" dependencies = [ "bytes", + "rlp-derive 0.1.0 (git+https://github.com/paritytech/parity-common.git?tag=rlp-v0.5.2)", "rustc-hex", ] @@ -7613,6 +7908,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "git+https://github.com/paritytech/parity-common.git?tag=rlp-v0.5.2#86676b08e89cb99fdff0c882453ad0746dd070cf" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rocksdb" version = "0.21.0" @@ -7665,6 +7970,36 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "ruint" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -7852,6 +8187,18 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "rw-stream-sink" version = "0.3.0" @@ -9266,6 +9613,16 @@ dependencies = [ "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +dependencies = [ + "cc", + "cfg-if", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -9368,6 +9725,30 @@ dependencies = [ "subtle 2.5.0", ] +[[package]] +name = "snowbridge-amcl" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "snowbridge-milagro-bls" +version = "1.5.2" +source = "git+https://github.com/Snowfork/milagro_bls?rev=6a95c9e33c6a41d9137761e593d53742ebb964de#6a95c9e33c6a41d9137761e593d53742ebb964de" +dependencies = [ + "hex", + "lazy_static", + "parity-scale-codec", + "rand", + "scale-info", + "snowbridge-amcl", + "zeroize", +] + [[package]] name = "socket2" version = "0.4.10" @@ -10228,6 +10609,31 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ssz_rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057291e5631f280978fa9c8009390663ca4613359fc1318e36a8c24c392f6d1f" +dependencies = [ + "bitvec", + "hex", + "num-bigint", + "serde", + "sha2 0.9.9", + "ssz_rs_derive", +] + +[[package]] +name = "ssz_rs_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07d54c4d01a1713eb363b55ba51595da15f6f1211435b71466460da022aa140" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -10281,6 +10687,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.1" @@ -10302,6 +10714,15 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + [[package]] name = "strum_macros" version = "0.24.3" @@ -10328,6 +10749,19 @@ dependencies = [ "syn 2.0.53", ] +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.53", +] + [[package]] name = "substrate-bip39" version = "0.4.6" @@ -10437,6 +10871,20 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "superstruct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f4e1f478a7728f8855d7e620e9a152cf8932c6614f86564c886f9b8141f3201" +dependencies = [ + "darling", + "itertools 0.10.5", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + [[package]] name = "syn" version = "1.0.109" @@ -11171,6 +11619,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -11303,6 +11757,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -12090,6 +12553,21 @@ dependencies = [ "time", ] +[[package]] +name = "zduny-wasm-timer" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f22d6a02cbc84ea1993b0b341833a55a0866a3378c3a76e0ca664bc2574e370" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.12.1", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/Cargo.toml b/Cargo.toml index 3d910d9f0..095bc898f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,11 @@ homepage = "https://www.availproject.org/" avail-core = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false, features = [ "runtime"] } kate = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } kate-recovery = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } + +ssz-rs = { package = "ssz_rs", version = "0.9.0" } +alloy-primitives = { version= "0.7.7", features=[ "serde"] } +common = {git = "https://github.com/a16z/helios.git"} +consensus-core = {git = "https://github.com/a16z/helios.git"} # avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } # kate = { path = "../avail-core/kate/", default-features = false } # kate-recovery = { path = "../avail-core/kate/recovery/", default-features = false} diff --git a/pallets/vector/Cargo.toml b/pallets/vector/Cargo.toml index 1c901cfcd..6db727e55 100644 --- a/pallets/vector/Cargo.toml +++ b/pallets/vector/Cargo.toml @@ -33,7 +33,10 @@ trie-db.workspace = true rlp.workspace = true primitive-types.workspace = true ethabi.workspace = true - +common.workspace = true +consensus-core.workspace = true +alloy-primitives.workspace = true +ssz-rs.workspace = true [dev-dependencies] pallet-balances = { workspace = true, default-features = false, features = ["std"] } From c261a7da85ec0933338cf5b58a928cb69d7bad9e Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 13:56:30 -0700 Subject: [PATCH 03/53] not broken --- pallets/vector/src/lib.rs | 50 +++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 89bf5e698..52002cddf 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -4,6 +4,10 @@ use crate::{storage_utils::MessageStatusEnum, verifier::Verifier}; use avail_base::{MemoryTemporaryStorage, ProvidePostInherent}; use avail_core::data_proof::{tx_uid, AddressedMessage, Message, MessageType}; +use common::config::types::Forks; +use consensus_core::{apply_finality_update, apply_update, verify_finality_update, verify_update, types::{Bytes32, ByteVector, LightClientStore, Update, FinalityUpdate}}; +use alloy_primitives::B256; +use ssz_rs::prelude::*; use codec::Compact; use frame_support::{ @@ -395,29 +399,29 @@ pub mod pallet { Weight::zero() } } - // // TODO: Rename to FunctionInput - // #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] - // pub struct FunctionInputs { - // pub updates: Vec, - // pub finality_update: FinalityUpdate, - // pub expected_current_slot: u64, - // pub store: LightClientStore, - // pub genesis_root: Bytes32, - // pub forks: Forks, - // pub execution_state_proof: ExecutionStateProof, - // } - // - // #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] - // pub struct ExecutionStateProof { - // #[serde(rename = "executionStateRoot")] - // pub execution_state_root: B256, - // #[serde(rename = "executionStateBranch")] - // pub execution_state_branch: Vec, - // pub gindex: String, - // } - // /// Merkle branch index & depth for the execution state root proof. - // pub const MERKLE_BRANCH_INDEX: usize = 802; - // pub const MERKLE_BRANCH_DEPTH: usize = 9; + // TODO: Rename to FunctionInput + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + pub struct FunctionInputs { + pub updates: Vec, + pub finality_update: FinalityUpdate, + pub expected_current_slot: u64, + pub store: LightClientStore, + pub genesis_root: Bytes32, + pub forks: Forks, + pub execution_state_proof: ExecutionStateProof, + } + + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + pub struct ExecutionStateProof { + #[serde(rename = "executionStateRoot")] + pub execution_state_root: B256, + #[serde(rename = "executionStateBranch")] + pub execution_state_branch: Vec, + pub gindex: String, + } + /// Merkle branch index & depth for the execution state root proof. + pub const MERKLE_BRANCH_INDEX: usize = 802; + pub const MERKLE_BRANCH_DEPTH: usize = 9; #[pallet::call] impl Pallet where From 40090eb6320bc0ab9b473e164ec333f7610ba73d Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 14:09:05 -0700 Subject: [PATCH 04/53] not broken --- Cargo.lock | 19 +- Cargo.toml | 1 + pallets/vector/Cargo.toml | 2 +- pallets/vector/src/lib.rs | 12 + pallets/vector/src/tests.rs | 2748 +++++++++++++++++------------------ 5 files changed, 1406 insertions(+), 1376 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62a24a763..50a8cf1e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1535,7 +1535,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half", + "half 2.4.0", ] [[package]] @@ -3882,6 +3882,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" + [[package]] name = "half" version = "2.4.0" @@ -6823,6 +6829,7 @@ dependencies = [ "rlp", "scale-info", "serde", + "serde_cbor", "serde_json", "sp-core", "sp-io", @@ -9524,6 +9531,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half 1.8.3", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.203" diff --git a/Cargo.toml b/Cargo.toml index 095bc898f..097e886c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ ssz-rs = { package = "ssz_rs", version = "0.9.0" } alloy-primitives = { version= "0.7.7", features=[ "serde"] } common = {git = "https://github.com/a16z/helios.git"} consensus-core = {git = "https://github.com/a16z/helios.git"} +serde_cbor = "0.11.2" # avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } # kate = { path = "../avail-core/kate/", default-features = false } # kate-recovery = { path = "../avail-core/kate/recovery/", default-features = false} diff --git a/pallets/vector/Cargo.toml b/pallets/vector/Cargo.toml index 6db727e55..dc75e1a09 100644 --- a/pallets/vector/Cargo.toml +++ b/pallets/vector/Cargo.toml @@ -37,7 +37,7 @@ common.workspace = true consensus-core.workspace = true alloy-primitives.workspace = true ssz-rs.workspace = true - +serde_cbor.workspace = true [dev-dependencies] pallet-balances = { workspace = true, default-features = false, features = ["std"] } pallet-timestamp = { workspace = true, default-features = false } diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 52002cddf..3ad6352b2 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -441,8 +441,20 @@ pub mod pallet { input: FunctionInput, output: FunctionOutput, proof: FunctionProof, + inputs: Vec, #[pallet::compact] slot: u64, ) -> DispatchResultWithPostInfo { + + let FunctionInputs { + updates, + finality_update, + expected_current_slot, + mut store, + genesis_root, + forks, + execution_state_proof, + } = serde_cbor::from_slice(&inputs).unwrap(); + let sender: [u8; 32] = ensure_signed(origin)?.into(); let updater = Updater::::get(); // ensure sender is preconfigured diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 06585324d..3da9e318c 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -1,1374 +1,1374 @@ -use crate::{ - mock::{ - new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, - ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, - }, - state::Configuration, - storage_utils::MessageStatusEnum, - Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, - FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, - RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, - ValidProof, WhitelistedDomains, -}; -use avail_core::data_proof::Message::FungibleToken; -use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; - -use frame_support::{ - assert_err, assert_ok, - traits::{fungible::Inspect, DefensiveTruncateFrom}, - BoundedVec, -}; -use frame_system::RawOrigin; -use hex_literal::hex; -use primitive_types::U256; -use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; -use sp_runtime::{testing::H256, traits::BadOrigin}; - -const TEST_SENDER_VEC: [u8; 32] = - hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); -const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); - -fn get_valid_step_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") - .to_vec(), - ) -} - -fn get_valid_step_output() -> FunctionOutput { - BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) -} - -fn get_valid_step_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) -} - -fn get_valid_rotate_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), - ) -} - -fn get_valid_rotate_output() -> FunctionOutput { - BoundedVec::truncate_from( - hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), - ) -} - -fn get_valid_rotate_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) -} - -fn get_invalid_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) -} - -fn get_valid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), - BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), - BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), - BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), - ]) -} - -fn get_valid_trimmed_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), - BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), - BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), - ]) -} - -fn get_valid_trimmed_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), - BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), - BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), - ]) -} - -fn get_invalid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), - BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), - BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), - ]) -} - -fn get_valid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), - BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), - BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), - ]) -} - -fn get_invalid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), - BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), - BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), - BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), - ]) -} - -fn get_valid_amb_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), - BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), - BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), - BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), - ]) -} - -fn get_valid_amb_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), - BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), - BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), - ]) -} - -pub fn get_valid_message() -> AddressedMessage { - let asset_id = H256::zero(); - let amount = 1_000_000_000_000_000_000u128; - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); - - AddressedMessage { - message: Message::FungibleToken { asset_id, amount }, - from: from.into(), - to: to.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } -} - -fn get_valid_amb_message() -> AddressedMessage { - let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); - - AddressedMessage { - message: Message::ArbitraryMessage(data), - from: from.into(), - to: recipient.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } -} - -#[test] -fn test_fulfill_step_call_proof_not_valid() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_invalid_proof(), - slot, - ); - - assert_err!(result, Error::::VerificationFailed); - }); -} - -#[test] -fn test_fulfill_step_call_not_valid_function_id() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - let invalid_function_id: H256 = H256(hex!( - "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" - )); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - invalid_function_id, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::FunctionIdNotKnown); - }); -} - -#[test] -fn test_fulfill_step_call_finality_not_met() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 512, // max finality - }); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::NotEnoughParticipants); - }); -} - -#[test] -fn test_fulfill_step_call_wrong_updater_address() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - let invalid_function_id: H256 = H256(hex!( - "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" - )); - - let wrong_updater: AccountId32 = AccountId32::new([1u8; 32]); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(wrong_updater), - invalid_function_id, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::UpdaterMisMatch); - }); -} - -#[test] -fn test_execute_fungible_token_via_storage() { - new_test_ext().execute_with(|| { - let balance_before = Balances::balance(&Bridge::account_id()); - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - let message = get_valid_message(); - let message_encoded = message.clone().abi_encode(); - let message_root = H256(keccak_256(message_encoded.as_slice())); - - // amount in message 1000000000000000000 - let result = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - let expected_message_root: H256 = H256(hex!( - "efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8" - )); - let balance_left = Balances::balance(&Bridge::account_id()); - assert_ok!(result); - assert_eq!( - balance_before.saturating_sub(1000000000000000000u128), - balance_left - ); - assert_eq!(expected_message_root, message_root); - assert_eq!( - MessageStatus::::get(message_root), - MessageStatusEnum::ExecutionSucceeded - ); - }); -} - -#[test] -fn test_execute_fungible_token_via_storage_with_trimmed_storage_value() { - new_test_ext().execute_with(|| { - let balance_before = Balances::balance(&Bridge::account_id()); - Broadcasters::::set( - 2, - H256(hex!( - "1369a4c9391cf90d393b40faead521b0f7019dc5000000000000000000000000" - )), - ); - - let slot = 4965568; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "5e3fe0dd03c7ce3f89524cfa65545232bbf52645b52ac0a3939f766540a6ed69" - )), - ); - - let account_proof = get_valid_trimmed_account_proof(); - let storage_proof = get_valid_trimmed_storage_proof(); - - let message = AddressedMessage { - message: FungibleToken { - asset_id: H256::zero(), - amount: 10_000_000_000_000_000, - }, - from: H256(hex!( - "8d31529525f23b14767d4dde78567ca083d3d56f000000000000000000000000" - )), - to: H256(hex!( - "1a985fdff5f6eee4afce1dc0f367ab925cdca57e7e8585329830fc3ce6ef4e7a" - )), - origin_domain: 2, - destination_domain: 1, - id: 5469, - }; - - let message_encoded = message.clone().abi_encode(); - let message_root = H256(keccak_256(message_encoded.as_slice())); - - // amount in message 1000000000000000000 - let result = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - let expected_message_root: H256 = H256(hex!( - "00eee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99" - )); - let balance_left = Balances::balance(&Bridge::account_id()); - assert_ok!(result); - assert_eq!( - balance_before.saturating_sub(10_000_000_000_000_000u128), - balance_left - ); - assert_eq!(expected_message_root, message_root); - assert_eq!( - MessageStatus::::get(message_root), - MessageStatusEnum::ExecutionSucceeded - ); - }); -} - -#[test] -fn test_execute_message_with_frozen_chain() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_message(); - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - - // Goal: Prevent from executing message - SourceChainFrozen::::set(2, true); - let error = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - assert_err!(error, Error::::SourceChainFrozen); - }); -} - -#[test] -fn test_execute_message_with_faulty_account_proof() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let account_proof = get_invalid_account_proof(); - let storage_proof = get_valid_storage_proof(); - let message = get_valid_message(); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - // invalid proof should return error - assert_err!(fail, Error::::CannotGetStorageRoot); - }); -} - -#[test] -fn test_execute_message_with_faulty_storage_proof() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - let account_proof = get_valid_account_proof(); - let storage_proof = get_invalid_storage_proof(); - let message = get_valid_message(); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - // invalid storage proof should return error - assert_err!(fail, Error::::CannotGetStorageValue); - }); -} - -#[test] -fn test_execute_message_with_already_executed_message() { - new_test_ext().execute_with(|| { - let balance_before_transfer = Balances::balance(&Bridge::account_id()); - - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_message(); - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - let account: AccountId32 = AccountId32::from_slice(message.to.as_bytes()).unwrap(); - let account_balance_before = Balances::balance(&account); - - let ok = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - - assert_ok!(ok); - let balance_after_transfer = Balances::balance(&Bridge::account_id()); - let expected_transfered_value = 1000000000000000000u128; - assert_eq!( - balance_before_transfer, - balance_after_transfer.saturating_add(expected_transfered_value) - ); - let account_balance = Balances::balance(&account); - assert_eq!(account_balance_before, 0); - assert_eq!(account_balance, expected_transfered_value); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - assert_err!(fail, Error::::MessageAlreadyExecuted); - }); -} - -#[test] -fn test_execute_message_with_unsupported_domain() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let mut message = get_valid_message(); - // alter message - message.origin_domain = 4; - - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - assert_err!(fail, Error::::UnsupportedOriginChain); - }); -} - -#[test] -fn test_fulfill_step_call() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_ok!(result); - let finalized_slot = 7634848; - // ensure that event is fired - let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { - slot: finalized_slot, - finalization_root: H256(hex!( - "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" - )), - execution_state_root: H256(hex!( - "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" - )), - }); - - let finalized_slot = 7634848; - - let header = Headers::::get(finalized_slot); - let head = Head::::get(); - let ex_state_root = ExecutionStateRoots::::get(finalized_slot); - - assert_eq!( - header, - H256(hex!( - "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" - )) - ); - assert_eq!( - ex_state_root, - H256(hex!( - "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" - )) - ); - assert_eq!(head, finalized_slot); - assert_eq!(expected_event, System::events()[0].event); - }); -} - -#[test] -fn test_fulfill_step_call_wrong_poseidon() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - // current poseidon is not the same as the one in the valid proof - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332da" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::StepVerificationError); - }); -} - -#[test] -fn test_fulfill_step_call_slot_behind_head() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - // move head forward - Head::::set(8634942); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::SlotBehindHead); - }); -} - -#[test] -fn test_fulfill_rotate_call() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" - )), - ); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), - slot, - ); - - assert_ok!(result); - // ensure that event is fired - let expected_poseidon = U256::from_dec_str( - "16399439943012933445970260519503780180385945954293268151243539801891563949197", - ) - .unwrap(); - - let current_period = 931; - let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { - period: current_period + 1, - root: expected_poseidon, - }); - - let poseidon = SyncCommitteePoseidons::::get(current_period + 1); - - assert_eq!(expected_event, System::events()[0].event); - assert_eq!(poseidon, expected_poseidon); - }); -} - -#[test] -fn test_fulfill_rotate_call_wrong_header() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - // set current wrong header for valid rotate call - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" - )), - ); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), - slot, - ); - - assert_err!(result, Error::::RotateVerificationError); - }); -} - -#[test] -fn test_fulfill_call_function_ids_not_set() { - new_test_ext().execute_with(|| { - Updater::::set(H256(TEST_SENDER_VEC)); - - Bridge::set_function_ids(RawOrigin::Root.into(), None).unwrap(); - let slot = 7634942; - let err = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - assert_err!(err, Error::::FunctionIdsAreNotSet); - }); -} - -#[test] -fn test_fulfill_step_call_verification_key_is_not_set() { - new_test_ext().execute_with(|| { - Bridge::set_step_verification_key(RawOrigin::Root.into(), None).unwrap(); - Updater::::set(H256(TEST_SENDER_VEC)); - - let slot = 7634942; - - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let err = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - assert_err!(err, Error::::VerificationKeyIsNotSet); - }); -} - -#[test] -fn test_fulfill_rotate_call_verification_key_is_not_set() { - new_test_ext().execute_with(|| { - Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None).unwrap(); - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" - )), - ); - - let err = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), - slot, - ); - assert_err!(err, Error::::VerificationKeyIsNotSet); - }); -} - -#[test] -fn set_whitelisted_domains_works_with_root() { - new_test_ext().execute_with(|| { - let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); - assert_ne!(WhitelistedDomains::::get(), domains); - - let ok = Bridge::set_whitelisted_domains(RawOrigin::Root.into(), domains.clone()); - assert_ok!(ok); - assert_eq!(WhitelistedDomains::::get(), domains); - - System::assert_last_event(RuntimeEvent::Bridge(Event::WhitelistedDomainsUpdated)); - }); -} - -#[test] -fn set_whitelisted_domains_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_whitelisted_domains(origin, domains.clone()); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_configuration_works_with_root() { - new_test_ext().execute_with(|| { - let conf = Configuration { - slots_per_period: 1, - finality_threshold: 69, - }; - assert_ne!(ConfigurationStorage::::get(), conf); - - let ok = Bridge::set_configuration(RawOrigin::Root.into(), conf); - assert_ok!(ok); - assert_eq!(ConfigurationStorage::::get(), conf); - - let expected_event = RuntimeEvent::Bridge(Event::ConfigurationUpdated { - slots_per_period: conf.slots_per_period, - finality_threshold: conf.finality_threshold, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_configuration_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let conf = Configuration { - slots_per_period: 1, - finality_threshold: 69, - }; - - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_configuration(origin, conf); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_broadcaster_works_with_root() { - new_test_ext().execute_with(|| { - let domain = 2; - let old = Broadcasters::::get(domain); - assert_ne!(old, STEP_FUNCTION_ID); - - let ok = Bridge::set_broadcaster(RawOrigin::Root.into(), domain, STEP_FUNCTION_ID); - assert_ok!(ok); - assert_eq!(Broadcasters::::get(domain), STEP_FUNCTION_ID); - - let expected_event = RuntimeEvent::Bridge(Event::BroadcasterUpdated { - old, - new: STEP_FUNCTION_ID, - domain, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_broadcaster_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_broadcaster(origin, 2, STEP_FUNCTION_ID); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_poseidon_hash_works_with_root() { - new_test_ext().execute_with(|| { - let period = 2; - let poseidon_hash = BoundedVec::try_from( - [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, - ] - .to_vec(), - ) - .unwrap(); - let root = U256::from_dec_str( - "1780731860627700044960722568376592200742329637303199754547598369979440671", - ) - .unwrap(); - assert_ne!(SyncCommitteePoseidons::::get(period), root); - - let ok = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); - assert_ok!(ok); - assert_eq!(SyncCommitteePoseidons::::get(period), root); - - let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { period, root }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_poseidon_hash_wrong_hash_length() { - new_test_ext().execute_with(|| { - let period = 2; - let poseidon_hash = BoundedVec::try_from( - [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ] - .to_vec(), - ) - .unwrap(); - - let error = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); - assert_err!(error, Error::::CannotParseOutputData); - assert_eq!(SyncCommitteePoseidons::::get(period), U256::zero()); - }); -} - -#[test] -fn set_poseidon_hash_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let root = BoundedVec::try_from([0, 1, 2, 3, 4].to_vec()).unwrap(); - - let ok = Bridge::set_poseidon_hash(origin, 2, root); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn source_chain_froze_works_with_root() { - new_test_ext().execute_with(|| { - let source_chain_id = 2; - let frozen = true; - assert_ne!(SourceChainFrozen::::get(source_chain_id), frozen); - - let ok = Bridge::source_chain_froze(RawOrigin::Root.into(), source_chain_id, frozen); - assert_ok!(ok); - assert_eq!(SourceChainFrozen::::get(source_chain_id), frozen); - - let expected_event = RuntimeEvent::Bridge(Event::SourceChainFrozen { - source_chain_id, - frozen, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn source_chain_froze_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - - let ok = Bridge::source_chain_froze(origin, 2, true); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn send_message_arbitrary_message_works() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::ArbitraryMessage(BoundedVec::truncate_from([0, 1, 2, 3].to_vec())); - let to = ROTATE_FUNCTION_ID; - let domain = 2; - - let event = Event::MessageSubmitted { - from: TEST_SENDER_VEC.into(), - to, - message_type: message.r#type(), - destination_domain: domain, - message_id: tx_uid(1, 0), - }; - let ok = Bridge::send_message(origin, message, to, domain); - assert_ok!(ok); - System::assert_last_event(RuntimeEvent::Bridge(event)); - }); -} - -#[test] -fn send_message_arbitrary_message_doesnt_accept_empty_data() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::ArbitraryMessage(BoundedVec::truncate_from(vec![])); - - let ok = Bridge::send_message(origin, message, ROTATE_FUNCTION_ID, 2); - assert_err!(ok, Error::::InvalidBridgeInputs); - }); -} - -#[test] -fn send_message_fungible_token_works() { - new_test_ext().execute_with(|| { - use crate::BalanceOf; - use frame_support::traits::Currency; - - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::FungibleToken { - asset_id: H256::zero(), - amount: 100, - }; - let to = ROTATE_FUNCTION_ID; - let domain = 2; - - Balances::make_free_balance_be( - &TEST_SENDER_VEC.into(), - BalanceOf::::max_value() / 2u128, - ); - - let event = Event::MessageSubmitted { - from: TEST_SENDER_VEC.into(), - to, - message_type: message.r#type(), - destination_domain: domain, - message_id: tx_uid(1, 0), - }; - let ok = Bridge::send_message(origin, message, to, domain); - assert_ok!(ok); - System::assert_last_event(RuntimeEvent::Bridge(event)); - }); -} - -#[test] -fn send_message_fungible_token_does_not_accept_zero_amount() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::FungibleToken { - asset_id: H256::zero(), - amount: 0, - }; - let to = ROTATE_FUNCTION_ID; - let domain = 2; - - let err = Bridge::send_message(origin, message, to, domain); - assert_err!(err, Error::::InvalidBridgeInputs); - }); -} - -#[test] -fn execute_arbitrary_message_works() { - new_test_ext().execute_with(|| { - use crate::BalanceOf; - use frame_support::traits::Currency; - - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - Balances::make_free_balance_be( - &TEST_SENDER_VEC.into(), - BalanceOf::::max_value() / 2u128, - ); - - Broadcasters::::set( - 2, - H256(hex!( - "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" - )), - ); - - let slot = 5085118; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_amb_message(); - let account_proof = get_valid_amb_account_proof(); - let storage_proof = get_valid_amb_storage_proof(); - - let ok = Bridge::execute( - origin, - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - assert_ok!(ok); - let encoded_data = message.clone().abi_encode(); - let message_root = H256(keccak_256(encoded_data.as_slice())); - - let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { - from: message.from, - to: message.to, - message_id: message.id, - message_root, - }); - System::assert_last_event(expected_event); - assert_eq!( - MessageStatus::::get(message_root), - MessageStatusEnum::ExecutionSucceeded - ) - }); -} - -#[test] -fn test_double_execute_arbitrary_message() { - new_test_ext().execute_with(|| { - use crate::BalanceOf; - use frame_support::traits::Currency; - - let origin1 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let origin2 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - Balances::make_free_balance_be( - &TEST_SENDER_VEC.into(), - BalanceOf::::max_value() / 2u128, - ); - - Broadcasters::::set( - 2, - H256(hex!( - "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" - )), - ); - - let slot = 5085118; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_amb_message(); - - let account_proof = get_valid_amb_account_proof(); - let storage_proof = get_valid_amb_storage_proof(); - - let ok = Bridge::execute( - origin1, - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - assert_ok!(ok); - - let err = Bridge::execute( - origin2, - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - assert_err!(err, Error::::MessageAlreadyExecuted); - - let encoded_data = message.clone().abi_encode(); - let message_root = H256(keccak_256(encoded_data.as_slice())); - - let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { - from: message.from, - to: message.to, - message_id: message.id, - message_root, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_function_ids_works_with_root() { - new_test_ext().execute_with(|| { - let ok = Bridge::set_function_ids(RawOrigin::Root.into(), None); - assert_ok!(ok); - assert_eq!(FunctionIds::::get(), None); - - let value = Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID)); - let ok = Bridge::set_function_ids(RawOrigin::Root.into(), value); - assert_ok!(ok); - assert_eq!(FunctionIds::::get(), value); - - let expected_event = RuntimeEvent::Bridge(Event::FunctionIdsUpdated { value }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_function_ids_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_function_ids(origin, None); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_step_verification_key_works_with_root() { - new_test_ext().execute_with(|| { - let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), None); - assert_ok!(ok); - assert_eq!(StepVerificationKey::::get(), None); - - let value = Some(BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap()); - let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), value.clone()); - assert_ok!(ok); - assert_eq!(StepVerificationKey::::get(), value.clone()); - - let expected_event = RuntimeEvent::Bridge(Event::StepVerificationKeyUpdated { value }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_step_verification_key_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_step_verification_key(origin, None); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_rotate_verification_key_works_with_root() { - new_test_ext().execute_with(|| { - let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None); - assert_ok!(ok); - assert_eq!(RotateVerificationKey::::get(), None); - - let value = Some(BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap()); - let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), value.clone()); - assert_ok!(ok); - assert_eq!(RotateVerificationKey::::get(), value.clone()); - - let expected_event = RuntimeEvent::Bridge(Event::RotateVerificationKeyUpdated { value }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_rotate_verification_key_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_rotate_verification_key(origin, None); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn update_updater() { - new_test_ext().execute_with(|| { - let old_updater = H256(TEST_SENDER_VEC); - Updater::::set(old_updater); - - let new_updater = H256([2u8; 32]); - let ok = Bridge::set_updater(RawOrigin::Root.into(), new_updater); - assert_ok!(ok); - - let expected_event = RuntimeEvent::Bridge(Event::NewUpdater { - old: old_updater, - new: new_updater, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn update_updater_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let old_updater = H256(TEST_SENDER_VEC); - Updater::::set(old_updater); - let new_updater = H256([2u8; 32]); - - let err = Bridge::set_updater(origin, new_updater); - assert_err!(err, BadOrigin); - assert_eq!(old_updater, Updater::::get()); - }); -} +// use crate::{ +// mock::{ +// new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, +// ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, +// }, +// state::Configuration, +// storage_utils::MessageStatusEnum, +// Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, +// FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, +// RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, +// ValidProof, WhitelistedDomains, +// }; +// use avail_core::data_proof::Message::FungibleToken; +// use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; +// +// use frame_support::{ +// assert_err, assert_ok, +// traits::{fungible::Inspect, DefensiveTruncateFrom}, +// BoundedVec, +// }; +// use frame_system::RawOrigin; +// use hex_literal::hex; +// use primitive_types::U256; +// use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; +// use sp_runtime::{testing::H256, traits::BadOrigin}; +// +// const TEST_SENDER_VEC: [u8; 32] = +// hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); +// const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); +// +// fn get_valid_step_input() -> FunctionInput { +// BoundedVec::truncate_from( +// hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") +// .to_vec(), +// ) +// } +// +// fn get_valid_step_output() -> FunctionOutput { +// BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) +// } +// +// fn get_valid_step_proof() -> FunctionProof { +// BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) +// } +// +// fn get_valid_rotate_input() -> FunctionInput { +// BoundedVec::truncate_from( +// hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), +// ) +// } +// +// fn get_valid_rotate_output() -> FunctionOutput { +// BoundedVec::truncate_from( +// hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), +// ) +// } +// +// fn get_valid_rotate_proof() -> FunctionProof { +// BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) +// } +// +// fn get_invalid_proof() -> FunctionProof { +// BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) +// } +// +// fn get_valid_account_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![ +// BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), +// BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), +// BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), +// BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), +// ]) +// } +// +// fn get_valid_trimmed_account_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![ +// BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), +// BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), +// BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), +// BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), +// ]) +// } +// +// fn get_valid_trimmed_storage_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![ +// BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), +// BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), +// BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), +// ]) +// } +// +// fn get_invalid_account_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![ +// BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), +// BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), +// BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), +// BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), +// ]) +// } +// +// fn get_valid_storage_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), +// BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), +// BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), +// ]) +// } +// +// fn get_invalid_storage_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), +// BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), +// BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), +// BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), +// ]) +// } +// +// fn get_valid_amb_account_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![ +// BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), +// BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), +// BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), +// BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), +// BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), +// ]) +// } +// +// fn get_valid_amb_storage_proof() -> ValidProof { +// BoundedVec::truncate_from(vec![ +// BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), +// BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), +// BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), +// ]) +// } +// +// pub fn get_valid_message() -> AddressedMessage { +// let asset_id = H256::zero(); +// let amount = 1_000_000_000_000_000_000u128; +// let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); +// let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); +// +// AddressedMessage { +// message: Message::FungibleToken { asset_id, amount }, +// from: from.into(), +// to: to.into(), +// origin_domain: 2, +// destination_domain: 1, +// id: 0, +// } +// } +// +// fn get_valid_amb_message() -> AddressedMessage { +// let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); +// let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); +// let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); +// +// AddressedMessage { +// message: Message::ArbitraryMessage(data), +// from: from.into(), +// to: recipient.into(), +// origin_domain: 2, +// destination_domain: 1, +// id: 0, +// } +// } +// +// #[test] +// fn test_fulfill_step_call_proof_not_valid() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_invalid_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::VerificationFailed); +// }); +// } +// +// #[test] +// fn test_fulfill_step_call_not_valid_function_id() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// let invalid_function_id: H256 = H256(hex!( +// "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" +// )); +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// invalid_function_id, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::FunctionIdNotKnown); +// }); +// } +// +// #[test] +// fn test_fulfill_step_call_finality_not_met() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// SyncCommitteePoseidons::::insert( +// 931, +// U256::from(hex!( +// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" +// )), +// ); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 512, // max finality +// }); +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::NotEnoughParticipants); +// }); +// } +// +// #[test] +// fn test_fulfill_step_call_wrong_updater_address() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// let invalid_function_id: H256 = H256(hex!( +// "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" +// )); +// +// let wrong_updater: AccountId32 = AccountId32::new([1u8; 32]); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(wrong_updater), +// invalid_function_id, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::UpdaterMisMatch); +// }); +// } +// +// #[test] +// fn test_execute_fungible_token_via_storage() { +// new_test_ext().execute_with(|| { +// let balance_before = Balances::balance(&Bridge::account_id()); +// Broadcasters::::set( +// 2, +// H256(hex!( +// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" +// )), +// ); +// +// let slot = 8581263; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// +// let account_proof = get_valid_account_proof(); +// let storage_proof = get_valid_storage_proof(); +// let message = get_valid_message(); +// let message_encoded = message.clone().abi_encode(); +// let message_root = H256(keccak_256(message_encoded.as_slice())); +// +// // amount in message 1000000000000000000 +// let result = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message, +// account_proof, +// storage_proof, +// ); +// +// let expected_message_root: H256 = H256(hex!( +// "efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8" +// )); +// let balance_left = Balances::balance(&Bridge::account_id()); +// assert_ok!(result); +// assert_eq!( +// balance_before.saturating_sub(1000000000000000000u128), +// balance_left +// ); +// assert_eq!(expected_message_root, message_root); +// assert_eq!( +// MessageStatus::::get(message_root), +// MessageStatusEnum::ExecutionSucceeded +// ); +// }); +// } +// +// #[test] +// fn test_execute_fungible_token_via_storage_with_trimmed_storage_value() { +// new_test_ext().execute_with(|| { +// let balance_before = Balances::balance(&Bridge::account_id()); +// Broadcasters::::set( +// 2, +// H256(hex!( +// "1369a4c9391cf90d393b40faead521b0f7019dc5000000000000000000000000" +// )), +// ); +// +// let slot = 4965568; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "5e3fe0dd03c7ce3f89524cfa65545232bbf52645b52ac0a3939f766540a6ed69" +// )), +// ); +// +// let account_proof = get_valid_trimmed_account_proof(); +// let storage_proof = get_valid_trimmed_storage_proof(); +// +// let message = AddressedMessage { +// message: FungibleToken { +// asset_id: H256::zero(), +// amount: 10_000_000_000_000_000, +// }, +// from: H256(hex!( +// "8d31529525f23b14767d4dde78567ca083d3d56f000000000000000000000000" +// )), +// to: H256(hex!( +// "1a985fdff5f6eee4afce1dc0f367ab925cdca57e7e8585329830fc3ce6ef4e7a" +// )), +// origin_domain: 2, +// destination_domain: 1, +// id: 5469, +// }; +// +// let message_encoded = message.clone().abi_encode(); +// let message_root = H256(keccak_256(message_encoded.as_slice())); +// +// // amount in message 1000000000000000000 +// let result = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message, +// account_proof, +// storage_proof, +// ); +// +// let expected_message_root: H256 = H256(hex!( +// "00eee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99" +// )); +// let balance_left = Balances::balance(&Bridge::account_id()); +// assert_ok!(result); +// assert_eq!( +// balance_before.saturating_sub(10_000_000_000_000_000u128), +// balance_left +// ); +// assert_eq!(expected_message_root, message_root); +// assert_eq!( +// MessageStatus::::get(message_root), +// MessageStatusEnum::ExecutionSucceeded +// ); +// }); +// } +// +// #[test] +// fn test_execute_message_with_frozen_chain() { +// new_test_ext().execute_with(|| { +// Broadcasters::::set( +// 2, +// H256(hex!( +// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" +// )), +// ); +// +// let slot = 8581263; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// +// let message = get_valid_message(); +// let account_proof = get_valid_account_proof(); +// let storage_proof = get_valid_storage_proof(); +// +// // Goal: Prevent from executing message +// SourceChainFrozen::::set(2, true); +// let error = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message, +// account_proof, +// storage_proof, +// ); +// +// assert_err!(error, Error::::SourceChainFrozen); +// }); +// } +// +// #[test] +// fn test_execute_message_with_faulty_account_proof() { +// new_test_ext().execute_with(|| { +// Broadcasters::::set( +// 2, +// H256(hex!( +// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" +// )), +// ); +// +// let slot = 8581263; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// +// let account_proof = get_invalid_account_proof(); +// let storage_proof = get_valid_storage_proof(); +// let message = get_valid_message(); +// +// let fail = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message, +// account_proof, +// storage_proof, +// ); +// +// // invalid proof should return error +// assert_err!(fail, Error::::CannotGetStorageRoot); +// }); +// } +// +// #[test] +// fn test_execute_message_with_faulty_storage_proof() { +// new_test_ext().execute_with(|| { +// Broadcasters::::set( +// 2, +// H256(hex!( +// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" +// )), +// ); +// +// let slot = 8581263; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// let account_proof = get_valid_account_proof(); +// let storage_proof = get_invalid_storage_proof(); +// let message = get_valid_message(); +// +// let fail = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message, +// account_proof, +// storage_proof, +// ); +// +// // invalid storage proof should return error +// assert_err!(fail, Error::::CannotGetStorageValue); +// }); +// } +// +// #[test] +// fn test_execute_message_with_already_executed_message() { +// new_test_ext().execute_with(|| { +// let balance_before_transfer = Balances::balance(&Bridge::account_id()); +// +// Broadcasters::::set( +// 2, +// H256(hex!( +// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" +// )), +// ); +// +// let slot = 8581263; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// +// let message = get_valid_message(); +// let account_proof = get_valid_account_proof(); +// let storage_proof = get_valid_storage_proof(); +// let account: AccountId32 = AccountId32::from_slice(message.to.as_bytes()).unwrap(); +// let account_balance_before = Balances::balance(&account); +// +// let ok = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message.clone(), +// account_proof.clone(), +// storage_proof.clone(), +// ); +// +// assert_ok!(ok); +// let balance_after_transfer = Balances::balance(&Bridge::account_id()); +// let expected_transfered_value = 1000000000000000000u128; +// assert_eq!( +// balance_before_transfer, +// balance_after_transfer.saturating_add(expected_transfered_value) +// ); +// let account_balance = Balances::balance(&account); +// assert_eq!(account_balance_before, 0); +// assert_eq!(account_balance, expected_transfered_value); +// +// let fail = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message, +// account_proof, +// storage_proof, +// ); +// +// assert_err!(fail, Error::::MessageAlreadyExecuted); +// }); +// } +// +// #[test] +// fn test_execute_message_with_unsupported_domain() { +// new_test_ext().execute_with(|| { +// Broadcasters::::set( +// 2, +// H256(hex!( +// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" +// )), +// ); +// +// let slot = 8581263; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// +// let mut message = get_valid_message(); +// // alter message +// message.origin_domain = 4; +// +// let account_proof = get_valid_account_proof(); +// let storage_proof = get_valid_storage_proof(); +// +// let fail = Bridge::execute( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// slot, +// message, +// account_proof, +// storage_proof, +// ); +// +// assert_err!(fail, Error::::UnsupportedOriginChain); +// }); +// } +// +// #[test] +// fn test_fulfill_step_call() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// +// SyncCommitteePoseidons::::insert( +// 931, +// U256::from(hex!( +// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" +// )), +// ); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// +// assert_ok!(result); +// let finalized_slot = 7634848; +// // ensure that event is fired +// let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { +// slot: finalized_slot, +// finalization_root: H256(hex!( +// "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" +// )), +// execution_state_root: H256(hex!( +// "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" +// )), +// }); +// +// let finalized_slot = 7634848; +// +// let header = Headers::::get(finalized_slot); +// let head = Head::::get(); +// let ex_state_root = ExecutionStateRoots::::get(finalized_slot); +// +// assert_eq!( +// header, +// H256(hex!( +// "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" +// )) +// ); +// assert_eq!( +// ex_state_root, +// H256(hex!( +// "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" +// )) +// ); +// assert_eq!(head, finalized_slot); +// assert_eq!(expected_event, System::events()[0].event); +// }); +// } +// +// #[test] +// fn test_fulfill_step_call_wrong_poseidon() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// +// // current poseidon is not the same as the one in the valid proof +// SyncCommitteePoseidons::::insert( +// 931, +// U256::from(hex!( +// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332da" +// )), +// ); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::StepVerificationError); +// }); +// } +// +// #[test] +// fn test_fulfill_step_call_slot_behind_head() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// SyncCommitteePoseidons::::insert( +// 931, +// U256::from(hex!( +// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" +// )), +// ); +// +// // move head forward +// Head::::set(8634942); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::SlotBehindHead); +// }); +// } +// +// #[test] +// fn test_fulfill_rotate_call() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 342, +// }); +// +// Headers::::set( +// slot, +// H256(hex!( +// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" +// )), +// ); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// ROTATE_FUNCTION_ID, +// get_valid_rotate_input(), +// get_valid_rotate_output(), +// get_valid_rotate_proof(), +// slot, +// ); +// +// assert_ok!(result); +// // ensure that event is fired +// let expected_poseidon = U256::from_dec_str( +// "16399439943012933445970260519503780180385945954293268151243539801891563949197", +// ) +// .unwrap(); +// +// let current_period = 931; +// let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { +// period: current_period + 1, +// root: expected_poseidon, +// }); +// +// let poseidon = SyncCommitteePoseidons::::get(current_period + 1); +// +// assert_eq!(expected_event, System::events()[0].event); +// assert_eq!(poseidon, expected_poseidon); +// }); +// } +// +// #[test] +// fn test_fulfill_rotate_call_wrong_header() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 342, +// }); +// // set current wrong header for valid rotate call +// Headers::::set( +// slot, +// H256(hex!( +// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" +// )), +// ); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// ROTATE_FUNCTION_ID, +// get_valid_rotate_input(), +// get_valid_rotate_output(), +// get_valid_rotate_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::RotateVerificationError); +// }); +// } +// +// #[test] +// fn test_fulfill_call_function_ids_not_set() { +// new_test_ext().execute_with(|| { +// Updater::::set(H256(TEST_SENDER_VEC)); +// +// Bridge::set_function_ids(RawOrigin::Root.into(), None).unwrap(); +// let slot = 7634942; +// let err = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// assert_err!(err, Error::::FunctionIdsAreNotSet); +// }); +// } +// +// #[test] +// fn test_fulfill_step_call_verification_key_is_not_set() { +// new_test_ext().execute_with(|| { +// Bridge::set_step_verification_key(RawOrigin::Root.into(), None).unwrap(); +// Updater::::set(H256(TEST_SENDER_VEC)); +// +// let slot = 7634942; +// +// SyncCommitteePoseidons::::insert( +// 931, +// U256::from(hex!( +// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" +// )), +// ); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// +// let err = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// assert_err!(err, Error::::VerificationKeyIsNotSet); +// }); +// } +// +// #[test] +// fn test_fulfill_rotate_call_verification_key_is_not_set() { +// new_test_ext().execute_with(|| { +// Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None).unwrap(); +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 342, +// }); +// +// Headers::::set( +// slot, +// H256(hex!( +// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" +// )), +// ); +// +// let err = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// ROTATE_FUNCTION_ID, +// get_valid_rotate_input(), +// get_valid_rotate_output(), +// get_valid_rotate_proof(), +// slot, +// ); +// assert_err!(err, Error::::VerificationKeyIsNotSet); +// }); +// } +// +// #[test] +// fn set_whitelisted_domains_works_with_root() { +// new_test_ext().execute_with(|| { +// let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); +// assert_ne!(WhitelistedDomains::::get(), domains); +// +// let ok = Bridge::set_whitelisted_domains(RawOrigin::Root.into(), domains.clone()); +// assert_ok!(ok); +// assert_eq!(WhitelistedDomains::::get(), domains); +// +// System::assert_last_event(RuntimeEvent::Bridge(Event::WhitelistedDomainsUpdated)); +// }); +// } +// +// #[test] +// fn set_whitelisted_domains_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let ok = Bridge::set_whitelisted_domains(origin, domains.clone()); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn set_configuration_works_with_root() { +// new_test_ext().execute_with(|| { +// let conf = Configuration { +// slots_per_period: 1, +// finality_threshold: 69, +// }; +// assert_ne!(ConfigurationStorage::::get(), conf); +// +// let ok = Bridge::set_configuration(RawOrigin::Root.into(), conf); +// assert_ok!(ok); +// assert_eq!(ConfigurationStorage::::get(), conf); +// +// let expected_event = RuntimeEvent::Bridge(Event::ConfigurationUpdated { +// slots_per_period: conf.slots_per_period, +// finality_threshold: conf.finality_threshold, +// }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn set_configuration_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let conf = Configuration { +// slots_per_period: 1, +// finality_threshold: 69, +// }; +// +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let ok = Bridge::set_configuration(origin, conf); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn set_broadcaster_works_with_root() { +// new_test_ext().execute_with(|| { +// let domain = 2; +// let old = Broadcasters::::get(domain); +// assert_ne!(old, STEP_FUNCTION_ID); +// +// let ok = Bridge::set_broadcaster(RawOrigin::Root.into(), domain, STEP_FUNCTION_ID); +// assert_ok!(ok); +// assert_eq!(Broadcasters::::get(domain), STEP_FUNCTION_ID); +// +// let expected_event = RuntimeEvent::Bridge(Event::BroadcasterUpdated { +// old, +// new: STEP_FUNCTION_ID, +// domain, +// }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn set_broadcaster_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let ok = Bridge::set_broadcaster(origin, 2, STEP_FUNCTION_ID); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn set_poseidon_hash_works_with_root() { +// new_test_ext().execute_with(|| { +// let period = 2; +// let poseidon_hash = BoundedVec::try_from( +// [ +// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, +// 23, 24, 25, 26, 27, 28, 29, 30, 31, +// ] +// .to_vec(), +// ) +// .unwrap(); +// let root = U256::from_dec_str( +// "1780731860627700044960722568376592200742329637303199754547598369979440671", +// ) +// .unwrap(); +// assert_ne!(SyncCommitteePoseidons::::get(period), root); +// +// let ok = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); +// assert_ok!(ok); +// assert_eq!(SyncCommitteePoseidons::::get(period), root); +// +// let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { period, root }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn set_poseidon_hash_wrong_hash_length() { +// new_test_ext().execute_with(|| { +// let period = 2; +// let poseidon_hash = BoundedVec::try_from( +// [ +// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, +// 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, +// ] +// .to_vec(), +// ) +// .unwrap(); +// +// let error = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); +// assert_err!(error, Error::::CannotParseOutputData); +// assert_eq!(SyncCommitteePoseidons::::get(period), U256::zero()); +// }); +// } +// +// #[test] +// fn set_poseidon_hash_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let root = BoundedVec::try_from([0, 1, 2, 3, 4].to_vec()).unwrap(); +// +// let ok = Bridge::set_poseidon_hash(origin, 2, root); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn source_chain_froze_works_with_root() { +// new_test_ext().execute_with(|| { +// let source_chain_id = 2; +// let frozen = true; +// assert_ne!(SourceChainFrozen::::get(source_chain_id), frozen); +// +// let ok = Bridge::source_chain_froze(RawOrigin::Root.into(), source_chain_id, frozen); +// assert_ok!(ok); +// assert_eq!(SourceChainFrozen::::get(source_chain_id), frozen); +// +// let expected_event = RuntimeEvent::Bridge(Event::SourceChainFrozen { +// source_chain_id, +// frozen, +// }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn source_chain_froze_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// +// let ok = Bridge::source_chain_froze(origin, 2, true); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn send_message_arbitrary_message_works() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let message = Message::ArbitraryMessage(BoundedVec::truncate_from([0, 1, 2, 3].to_vec())); +// let to = ROTATE_FUNCTION_ID; +// let domain = 2; +// +// let event = Event::MessageSubmitted { +// from: TEST_SENDER_VEC.into(), +// to, +// message_type: message.r#type(), +// destination_domain: domain, +// message_id: tx_uid(1, 0), +// }; +// let ok = Bridge::send_message(origin, message, to, domain); +// assert_ok!(ok); +// System::assert_last_event(RuntimeEvent::Bridge(event)); +// }); +// } +// +// #[test] +// fn send_message_arbitrary_message_doesnt_accept_empty_data() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let message = Message::ArbitraryMessage(BoundedVec::truncate_from(vec![])); +// +// let ok = Bridge::send_message(origin, message, ROTATE_FUNCTION_ID, 2); +// assert_err!(ok, Error::::InvalidBridgeInputs); +// }); +// } +// +// #[test] +// fn send_message_fungible_token_works() { +// new_test_ext().execute_with(|| { +// use crate::BalanceOf; +// use frame_support::traits::Currency; +// +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let message = Message::FungibleToken { +// asset_id: H256::zero(), +// amount: 100, +// }; +// let to = ROTATE_FUNCTION_ID; +// let domain = 2; +// +// Balances::make_free_balance_be( +// &TEST_SENDER_VEC.into(), +// BalanceOf::::max_value() / 2u128, +// ); +// +// let event = Event::MessageSubmitted { +// from: TEST_SENDER_VEC.into(), +// to, +// message_type: message.r#type(), +// destination_domain: domain, +// message_id: tx_uid(1, 0), +// }; +// let ok = Bridge::send_message(origin, message, to, domain); +// assert_ok!(ok); +// System::assert_last_event(RuntimeEvent::Bridge(event)); +// }); +// } +// +// #[test] +// fn send_message_fungible_token_does_not_accept_zero_amount() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let message = Message::FungibleToken { +// asset_id: H256::zero(), +// amount: 0, +// }; +// let to = ROTATE_FUNCTION_ID; +// let domain = 2; +// +// let err = Bridge::send_message(origin, message, to, domain); +// assert_err!(err, Error::::InvalidBridgeInputs); +// }); +// } +// +// #[test] +// fn execute_arbitrary_message_works() { +// new_test_ext().execute_with(|| { +// use crate::BalanceOf; +// use frame_support::traits::Currency; +// +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// Balances::make_free_balance_be( +// &TEST_SENDER_VEC.into(), +// BalanceOf::::max_value() / 2u128, +// ); +// +// Broadcasters::::set( +// 2, +// H256(hex!( +// "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" +// )), +// ); +// +// let slot = 5085118; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// +// let message = get_valid_amb_message(); +// let account_proof = get_valid_amb_account_proof(); +// let storage_proof = get_valid_amb_storage_proof(); +// +// let ok = Bridge::execute( +// origin, +// slot, +// message.clone(), +// account_proof.clone(), +// storage_proof.clone(), +// ); +// assert_ok!(ok); +// let encoded_data = message.clone().abi_encode(); +// let message_root = H256(keccak_256(encoded_data.as_slice())); +// +// let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { +// from: message.from, +// to: message.to, +// message_id: message.id, +// message_root, +// }); +// System::assert_last_event(expected_event); +// assert_eq!( +// MessageStatus::::get(message_root), +// MessageStatusEnum::ExecutionSucceeded +// ) +// }); +// } +// +// #[test] +// fn test_double_execute_arbitrary_message() { +// new_test_ext().execute_with(|| { +// use crate::BalanceOf; +// use frame_support::traits::Currency; +// +// let origin1 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let origin2 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// Balances::make_free_balance_be( +// &TEST_SENDER_VEC.into(), +// BalanceOf::::max_value() / 2u128, +// ); +// +// Broadcasters::::set( +// 2, +// H256(hex!( +// "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" +// )), +// ); +// +// let slot = 5085118; +// ExecutionStateRoots::::set( +// slot, +// H256(hex!( +// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" +// )), +// ); +// +// let message = get_valid_amb_message(); +// +// let account_proof = get_valid_amb_account_proof(); +// let storage_proof = get_valid_amb_storage_proof(); +// +// let ok = Bridge::execute( +// origin1, +// slot, +// message.clone(), +// account_proof.clone(), +// storage_proof.clone(), +// ); +// assert_ok!(ok); +// +// let err = Bridge::execute( +// origin2, +// slot, +// message.clone(), +// account_proof.clone(), +// storage_proof.clone(), +// ); +// assert_err!(err, Error::::MessageAlreadyExecuted); +// +// let encoded_data = message.clone().abi_encode(); +// let message_root = H256(keccak_256(encoded_data.as_slice())); +// +// let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { +// from: message.from, +// to: message.to, +// message_id: message.id, +// message_root, +// }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn set_function_ids_works_with_root() { +// new_test_ext().execute_with(|| { +// let ok = Bridge::set_function_ids(RawOrigin::Root.into(), None); +// assert_ok!(ok); +// assert_eq!(FunctionIds::::get(), None); +// +// let value = Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID)); +// let ok = Bridge::set_function_ids(RawOrigin::Root.into(), value); +// assert_ok!(ok); +// assert_eq!(FunctionIds::::get(), value); +// +// let expected_event = RuntimeEvent::Bridge(Event::FunctionIdsUpdated { value }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn set_function_ids_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let ok = Bridge::set_function_ids(origin, None); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn set_step_verification_key_works_with_root() { +// new_test_ext().execute_with(|| { +// let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), None); +// assert_ok!(ok); +// assert_eq!(StepVerificationKey::::get(), None); +// +// let value = Some(BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap()); +// let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), value.clone()); +// assert_ok!(ok); +// assert_eq!(StepVerificationKey::::get(), value.clone()); +// +// let expected_event = RuntimeEvent::Bridge(Event::StepVerificationKeyUpdated { value }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn set_step_verification_key_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let ok = Bridge::set_step_verification_key(origin, None); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn set_rotate_verification_key_works_with_root() { +// new_test_ext().execute_with(|| { +// let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None); +// assert_ok!(ok); +// assert_eq!(RotateVerificationKey::::get(), None); +// +// let value = Some(BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap()); +// let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), value.clone()); +// assert_ok!(ok); +// assert_eq!(RotateVerificationKey::::get(), value.clone()); +// +// let expected_event = RuntimeEvent::Bridge(Event::RotateVerificationKeyUpdated { value }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn set_rotate_verification_key_does_not_work_with_non_root() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let ok = Bridge::set_rotate_verification_key(origin, None); +// assert_err!(ok, BadOrigin); +// }); +// } +// +// #[test] +// fn update_updater() { +// new_test_ext().execute_with(|| { +// let old_updater = H256(TEST_SENDER_VEC); +// Updater::::set(old_updater); +// +// let new_updater = H256([2u8; 32]); +// let ok = Bridge::set_updater(RawOrigin::Root.into(), new_updater); +// assert_ok!(ok); +// +// let expected_event = RuntimeEvent::Bridge(Event::NewUpdater { +// old: old_updater, +// new: new_updater, +// }); +// System::assert_last_event(expected_event); +// }); +// } +// +// #[test] +// fn update_updater_non_root() { +// new_test_ext().execute_with(|| { +// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); +// let old_updater = H256(TEST_SENDER_VEC); +// Updater::::set(old_updater); +// let new_updater = H256([2u8; 32]); +// +// let err = Bridge::set_updater(origin, new_updater); +// assert_err!(err, BadOrigin); +// assert_eq!(old_updater, Updater::::get()); +// }); +// } From da08f66820ac7b74dc3d44e45af098ca1a592426 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 14:17:10 -0700 Subject: [PATCH 05/53] comment out unused tests --- pallets/vector/src/tests.rs | 485 ++++++++++++++++++------------------ 1 file changed, 243 insertions(+), 242 deletions(-) diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 3da9e318c..d8b15fbe6 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -1,183 +1,183 @@ -// use crate::{ -// mock::{ -// new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, -// ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, -// }, -// state::Configuration, -// storage_utils::MessageStatusEnum, -// Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, -// FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, -// RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, -// ValidProof, WhitelistedDomains, -// }; -// use avail_core::data_proof::Message::FungibleToken; -// use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; -// -// use frame_support::{ -// assert_err, assert_ok, -// traits::{fungible::Inspect, DefensiveTruncateFrom}, -// BoundedVec, -// }; -// use frame_system::RawOrigin; -// use hex_literal::hex; -// use primitive_types::U256; -// use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; -// use sp_runtime::{testing::H256, traits::BadOrigin}; -// -// const TEST_SENDER_VEC: [u8; 32] = -// hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); -// const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); -// -// fn get_valid_step_input() -> FunctionInput { -// BoundedVec::truncate_from( -// hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") -// .to_vec(), -// ) -// } -// -// fn get_valid_step_output() -> FunctionOutput { -// BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) -// } -// -// fn get_valid_step_proof() -> FunctionProof { -// BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) -// } -// -// fn get_valid_rotate_input() -> FunctionInput { -// BoundedVec::truncate_from( -// hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), -// ) -// } -// -// fn get_valid_rotate_output() -> FunctionOutput { -// BoundedVec::truncate_from( -// hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), -// ) -// } -// -// fn get_valid_rotate_proof() -> FunctionProof { -// BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) -// } -// -// fn get_invalid_proof() -> FunctionProof { -// BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) -// } -// -// fn get_valid_account_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![ -// BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), -// BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), -// BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), -// BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), -// ]) -// } -// -// fn get_valid_trimmed_account_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![ -// BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), -// BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), -// BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), -// BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), -// ]) -// } -// -// fn get_valid_trimmed_storage_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![ -// BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), -// BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), -// BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), -// ]) -// } -// -// fn get_invalid_account_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![ -// BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), -// BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), -// BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), -// BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), -// ]) -// } -// -// fn get_valid_storage_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), -// BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), -// BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), -// ]) -// } -// -// fn get_invalid_storage_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), -// BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), -// BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), -// BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), -// ]) -// } -// -// fn get_valid_amb_account_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![ -// BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), -// BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), -// BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), -// BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), -// BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), -// ]) -// } -// -// fn get_valid_amb_storage_proof() -> ValidProof { -// BoundedVec::truncate_from(vec![ -// BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), -// BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), -// BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), -// ]) -// } -// -// pub fn get_valid_message() -> AddressedMessage { -// let asset_id = H256::zero(); -// let amount = 1_000_000_000_000_000_000u128; -// let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); -// let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); -// -// AddressedMessage { -// message: Message::FungibleToken { asset_id, amount }, -// from: from.into(), -// to: to.into(), -// origin_domain: 2, -// destination_domain: 1, -// id: 0, -// } -// } -// -// fn get_valid_amb_message() -> AddressedMessage { -// let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); -// let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); -// let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); -// -// AddressedMessage { -// message: Message::ArbitraryMessage(data), -// from: from.into(), -// to: recipient.into(), -// origin_domain: 2, -// destination_domain: 1, -// id: 0, -// } -// } +use crate::{ + mock::{ + new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, + ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, + }, + state::Configuration, + storage_utils::MessageStatusEnum, + Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, + FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, + RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, + ValidProof, WhitelistedDomains, +}; +use avail_core::data_proof::Message::FungibleToken; +use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; + +use frame_support::{ + assert_err, assert_ok, + traits::{fungible::Inspect, DefensiveTruncateFrom}, + BoundedVec, +}; +use frame_system::RawOrigin; +use hex_literal::hex; +use primitive_types::U256; +use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; +use sp_runtime::{testing::H256, traits::BadOrigin}; + +const TEST_SENDER_VEC: [u8; 32] = + hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); +const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); + +fn get_valid_step_input() -> FunctionInput { + BoundedVec::truncate_from( + hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") + .to_vec(), + ) +} + +fn get_valid_step_output() -> FunctionOutput { + BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) +} + +fn get_valid_step_proof() -> FunctionProof { + BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) +} + +fn get_valid_rotate_input() -> FunctionInput { + BoundedVec::truncate_from( + hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), + ) +} + +fn get_valid_rotate_output() -> FunctionOutput { + BoundedVec::truncate_from( + hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), + ) +} + +fn get_valid_rotate_proof() -> FunctionProof { + BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) +} + +fn get_invalid_proof() -> FunctionProof { + BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) +} + +fn get_valid_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), + BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), + BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), + BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), + ]) +} + +fn get_valid_trimmed_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), + BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), + BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), + ]) +} + +fn get_valid_trimmed_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), + BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), + BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), + ]) +} + +fn get_invalid_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), + BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), + BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), + ]) +} + +fn get_valid_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), + BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), + BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), + ]) +} + +fn get_invalid_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), + BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), + BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), + BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), + ]) +} + +fn get_valid_amb_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), + BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), + BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), + BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), + ]) +} + +fn get_valid_amb_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), + BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), + BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), + ]) +} + +pub fn get_valid_message() -> AddressedMessage { + let asset_id = H256::zero(); + let amount = 1_000_000_000_000_000_000u128; + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); + + AddressedMessage { + message: Message::FungibleToken { asset_id, amount }, + from: from.into(), + to: to.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } +} + +fn get_valid_amb_message() -> AddressedMessage { + let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); + + AddressedMessage { + message: Message::ArbitraryMessage(data), + from: from.into(), + to: recipient.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } +} // // #[test] // fn test_fulfill_step_call_proof_not_valid() { @@ -601,68 +601,69 @@ // }); // } // -// #[test] -// fn test_fulfill_step_call() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// -// SyncCommitteePoseidons::::insert( -// 931, -// U256::from(hex!( -// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" -// )), -// ); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// -// assert_ok!(result); -// let finalized_slot = 7634848; -// // ensure that event is fired -// let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { -// slot: finalized_slot, -// finalization_root: H256(hex!( -// "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" -// )), -// execution_state_root: H256(hex!( -// "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" -// )), -// }); -// -// let finalized_slot = 7634848; -// -// let header = Headers::::get(finalized_slot); -// let head = Head::::get(); -// let ex_state_root = ExecutionStateRoots::::get(finalized_slot); -// -// assert_eq!( -// header, -// H256(hex!( -// "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" -// )) -// ); -// assert_eq!( -// ex_state_root, -// H256(hex!( -// "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" -// )) -// ); -// assert_eq!(head, finalized_slot); -// assert_eq!(expected_event, System::events()[0].event); -// }); -// } +#[test] +fn test_fulfill_step_call() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + vec![], + slot, + ); + + assert_ok!(result); + let finalized_slot = 7634848; + // ensure that event is fired + let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { + slot: finalized_slot, + finalization_root: H256(hex!( + "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" + )), + execution_state_root: H256(hex!( + "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" + )), + }); + + let finalized_slot = 7634848; + + let header = Headers::::get(finalized_slot); + let head = Head::::get(); + let ex_state_root = ExecutionStateRoots::::get(finalized_slot); + + assert_eq!( + header, + H256(hex!( + "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" + )) + ); + assert_eq!( + ex_state_root, + H256(hex!( + "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" + )) + ); + assert_eq!(head, finalized_slot); + assert_eq!(expected_event, System::events()[0].event); + }); +} // // #[test] // fn test_fulfill_step_call_wrong_poseidon() { From 224bde6052bb7a49cd3b98c79c60f3ef748c47fe Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 15:21:12 -0700 Subject: [PATCH 06/53] not broken, first test loading --- pallets/vector/examples/call.cbor | Bin 0 -> 107347 bytes pallets/vector/src/tests.rs | 23 +++++++++-------------- 2 files changed, 9 insertions(+), 14 deletions(-) create mode 100644 pallets/vector/examples/call.cbor diff --git a/pallets/vector/examples/call.cbor b/pallets/vector/examples/call.cbor new file mode 100644 index 0000000000000000000000000000000000000000..e014f9ae6dda24dfd8f6bfcf29372c383771d0f1 GIT binary patch literal 107347 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 z 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%0A9!STC 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 AddressedMessage { // } // #[test] -fn test_fulfill_step_call() { +fn test_fulfill_call() { new_test_ext().execute_with(|| { let slot = 7634942; Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/call.cbor").unwrap(); SyncCommitteePoseidons::::insert( 931, @@ -625,7 +620,7 @@ fn test_fulfill_step_call() { get_valid_step_input(), get_valid_step_output(), get_valid_step_proof(), - vec![], + inputs, slot, ); From bf19ce57feee0b8ab8b0dd569379a425297020ff Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 15:29:39 -0700 Subject: [PATCH 07/53] thingy ma bob --- pallets/vector/src/lib.rs | 92 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 3ad6352b2..b8aeb34c1 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -455,6 +455,98 @@ pub mod pallet { execution_state_proof, } = serde_cbor::from_slice(&inputs).unwrap(); + let mut is_valid = true; + let prev_header: B256 = store + .finalized_header + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + let prev_head = store.finalized_header.slot; + + + + // 1. Apply sync committee updates, if any + for (index, update) in updates.iter().enumerate() { + println!("Processing update {} of {}", index + 1, updates.len()); + + is_valid = is_valid + && verify_update( + update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) + .is_ok(); + + + apply_update(&mut store, update); + + } + + // 2. Apply finality update + + is_valid = is_valid + && verify_finality_update( + &finality_update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) + .is_ok(); + apply_finality_update(&mut store, &finality_update); + + + // 3. Verify execution state root proof + + let execution_state_branch_nodes: Vec = execution_state_proof + .execution_state_branch + .iter() + .map(|b| Node::try_from(b.as_ref()).unwrap()) + .collect(); + + is_valid = is_valid + && is_valid_merkle_branch( + &Node::try_from(execution_state_proof.execution_state_root.as_ref()).unwrap(), + execution_state_branch_nodes.iter(), + MERKLE_BRANCH_DEPTH, + MERKLE_BRANCH_INDEX, + &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), + ); + + + assert!(is_valid); + + let header: B256 = store + .finalized_header + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + let sync_committee_hash: B256 = store + .current_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + let next_sync_committee_hash: B256 = match &mut store.next_sync_committee { + Some(next_sync_committee) => next_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(), + None => B256::ZERO, + }; + let head = store.finalized_header.slot; + // println!("Finalized head: {:?}", head); + // println!("befor ehead: {:?}", prev_head); + let sender: [u8; 32] = ensure_signed(origin)?.into(); let updater = Updater::::get(); // ensure sender is preconfigured From a6bbfc57dec601a045e16fae7f11b269504b774a Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 15:41:58 -0700 Subject: [PATCH 08/53] checkpoint --- pallets/vector/src/lib.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index b8aeb34c1..8c077043d 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -518,8 +518,6 @@ pub mod pallet { ); - assert!(is_valid); - let header: B256 = store .finalized_header .hash_tree_root() @@ -549,22 +547,21 @@ pub mod pallet { let sender: [u8; 32] = ensure_signed(origin)?.into(); let updater = Updater::::get(); + // ensure sender is preconfigured ensure!(H256(sender) == updater, Error::::UpdaterMisMatch); let config = ConfigurationStorage::::get(); - let input_hash = H256(sha2_256(input.as_slice())); - let output_hash = H256(sha2_256(output.as_slice())); - let (step_function_id, rotate_function_id) = Self::get_function_ids()?; - let verifier = Self::get_verifier(function_id, step_function_id, rotate_function_id)?; - let is_success = verifier - .verify(input_hash, output_hash, proof.to_vec()) - .map_err(|_| Error::::VerificationError)?; // make sure that verification call is valid - ensure!(is_success, Error::::VerificationFailed); + ensure!(is_valid, Error::::VerificationFailed); + if prev_head != head { + // step + + } + if // verification is success and, we can safely parse and validate output if function_id == step_function_id { let step_output = parse_step_output(output.to_vec()) From 187831354d1190be35091917567dab8122a9c808 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 16:10:35 -0700 Subject: [PATCH 09/53] gagooo --- pallets/vector/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 8c077043d..f5f2f54b3 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -561,7 +561,10 @@ pub mod pallet { } - if + + + + // verification is success and, we can safely parse and validate output if function_id == step_function_id { let step_output = parse_step_output(output.to_vec()) From d7aead33ebb2a03fcc1331b71efd6847c7d9db7b Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 17:16:41 -0700 Subject: [PATCH 10/53] LFG step working --- pallets/vector/src/lib.rs | 76 +++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index f5f2f54b3..563ad794b 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -50,6 +50,7 @@ pub type BalanceOf = #[frame_support::pallet] pub mod pallet { + use consensus_core::get_bits; use ethabi::Token; use ethabi::Token::Uint; use frame_support::dispatch::GetDispatchInfo; @@ -466,7 +467,6 @@ pub mod pallet { let prev_head = store.finalized_header.slot; - // 1. Apply sync committee updates, if any for (index, update) in updates.iter().enumerate() { println!("Processing update {} of {}", index + 1, updates.len()); @@ -488,6 +488,9 @@ pub mod pallet { // 2. Apply finality update + + + is_valid = is_valid && verify_finality_update( &finality_update, @@ -518,13 +521,12 @@ pub mod pallet { ); - let header: B256 = store + let finalized_header_root: [u8; 32] = store .finalized_header .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); + .unwrap().as_ref().try_into().unwrap(); + let execution_state_root: [u8; 32] = execution_state_proof.execution_state_root.as_slice().try_into().unwrap(); + let sync_committee_hash: B256 = store .current_sync_committee .hash_tree_root() @@ -542,57 +544,51 @@ pub mod pallet { None => B256::ZERO, }; let head = store.finalized_header.slot; - // println!("Finalized head: {:?}", head); - // println!("befor ehead: {:?}", prev_head); - let sender: [u8; 32] = ensure_signed(origin)?.into(); let updater = Updater::::get(); // ensure sender is preconfigured ensure!(H256(sender) == updater, Error::::UpdaterMisMatch); - - let config = ConfigurationStorage::::get(); - - - // make sure that verification call is valid ensure!(is_valid, Error::::VerificationFailed); + + let verified_output = VerifiedStepOutput { + finalized_header_root: H256::from(finalized_header_root), + execution_state_root: H256::from(execution_state_root), + finalized_slot: store.finalized_header.slot.as_u64(), + participation: store.current_max_active_participants.try_into().unwrap(), + }; if prev_head != head { - // step - + if Self::set_slot_roots(verified_output)? { + Self::deposit_event(Event::HeadUpdated { + slot: verified_output.finalized_slot, + finalization_root: verified_output.finalized_header_root, + execution_state_root: verified_output.execution_state_root, + }); + } } - // verification is success and, we can safely parse and validate output - if function_id == step_function_id { - let step_output = parse_step_output(output.to_vec()) - .map_err(|_| Error::::CannotParseOutputData)?; - let vs = VerifiedStep::new(function_id, input_hash, step_output); - if Self::step_into(slot, &config, &vs, step_function_id)? { - Self::deposit_event(Event::HeadUpdated { - slot: vs.verified_output.finalized_slot, - finalization_root: vs.verified_output.finalized_header_root, - execution_state_root: vs.verified_output.execution_state_root, - }); - } - } else if function_id == rotate_function_id { - let rotate_output = parse_rotate_output(output.to_vec()) - .map_err(|_| Error::::CannotParseOutputData)?; - let vr = VerifiedRotate::new(function_id, input_hash, rotate_output); - let period = Self::rotate_into(slot, &config, &vr, rotate_function_id)?; - Self::deposit_event(Event::SyncCommitteeUpdated { - period, - root: vr.sync_committee_poseidon, - }); - } else { - return Err(Error::::FunctionIdNotKnown.into()); - } + // } else if function_id == rotate_function_id { + // let rotate_output = parse_rotate_output(output.to_vec()) + // .map_err(|_| Error::::CannotParseOutputData)?; + // + // let vr = VerifiedRotate::new(function_id, input_hash, rotate_output); + // + // let period = Self::rotate_into(slot, &config, &vr, rotate_function_id)?; + // Self::deposit_event(Event::SyncCommitteeUpdated { + // period, + // root: vr.sync_committee_poseidon, + // }); + // } else { + // return Err(Error::::FunctionIdNotKnown.into()); + // } Ok(().into()) } From c9a669127bdf3e5989f5d350d63d072cd78ff70b Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 2 Aug 2024 18:20:21 -0700 Subject: [PATCH 11/53] not working for some reason? but fulfill_call gist done --- pallets/vector/src/lib.rs | 84 ++++++++++++++++++------------------- pallets/vector/src/tests.rs | 5 --- 2 files changed, 40 insertions(+), 49 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 563ad794b..ba76422c1 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -438,14 +438,9 @@ pub mod pallet { #[pallet::weight(weight_helper::fulfill_call::(* function_id))] pub fn fulfill_call( origin: OriginFor, - function_id: H256, - input: FunctionInput, - output: FunctionOutput, - proof: FunctionProof, - inputs: Vec, - #[pallet::compact] slot: u64, + inputs: Vec, // TODO: Convert to fixed bytes ) -> DispatchResultWithPostInfo { - + let config = ConfigurationStorage::::get(); let FunctionInputs { updates, finality_update, @@ -534,15 +529,7 @@ pub mod pallet { .as_ref() .try_into() .unwrap(); - let next_sync_committee_hash: B256 = match &mut store.next_sync_committee { - Some(next_sync_committee) => next_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(), - None => B256::ZERO, - }; + let head = store.finalized_header.slot; let sender: [u8; 32] = ensure_signed(origin)?.into(); let updater = Updater::::get(); @@ -550,45 +537,54 @@ pub mod pallet { // ensure sender is preconfigured ensure!(H256(sender) == updater, Error::::UpdaterMisMatch); ensure!(is_valid, Error::::VerificationFailed); - - let verified_output = VerifiedStepOutput { - finalized_header_root: H256::from(finalized_header_root), - execution_state_root: H256::from(execution_state_root), - finalized_slot: store.finalized_header.slot.as_u64(), - participation: store.current_max_active_participants.try_into().unwrap(), - }; + + let mut function_called = false; + + // Step if prev_head != head { + let verified_output = VerifiedStepOutput { + finalized_header_root: H256::from(finalized_header_root), + execution_state_root: H256::from(execution_state_root), + finalized_slot: store.finalized_header.slot.as_u64(), + participation: store.current_max_active_participants.try_into().unwrap(), + }; + if Self::set_slot_roots(verified_output)? { Self::deposit_event(Event::HeadUpdated { slot: verified_output.finalized_slot, finalization_root: verified_output.finalized_header_root, execution_state_root: verified_output.execution_state_root, }); + function_called = true; } } + // Rotate + if let Some(mut next_sync_committee) = store.next_sync_committee { + let next_sync_committee_hash: [u8; 32] = next_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + let next_sync_committee_hash = U256::from(next_sync_committee_hash); + + let period = head.as_u64() + .checked_div(config.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; + let next_period = period + 1; + Self::set_sync_committee_poseidon(next_period, next_sync_committee_hash)?; + + Self::deposit_event(Event::SyncCommitteeUpdated { + period: next_period, + root: next_sync_committee_hash, + }); + function_called=true; + } - - - - - - - - // } else if function_id == rotate_function_id { - // let rotate_output = parse_rotate_output(output.to_vec()) - // .map_err(|_| Error::::CannotParseOutputData)?; - // - // let vr = VerifiedRotate::new(function_id, input_hash, rotate_output); - // - // let period = Self::rotate_into(slot, &config, &vr, rotate_function_id)?; - // Self::deposit_event(Event::SyncCommitteeUpdated { - // period, - // root: vr.sync_committee_poseidon, - // }); - // } else { - // return Err(Error::::FunctionIdNotKnown.into()); - // } + if !function_called { + return Err(Error::::FunctionIdNotKnown.into()); + } Ok(().into()) } diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index e4acd3900..ed3d575c9 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -616,12 +616,7 @@ fn test_fulfill_call() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), inputs, - slot, ); assert_ok!(result); From d11b03de1d5f849585b5f8d766e039211f73a415 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 5 Aug 2024 11:50:13 -0700 Subject: [PATCH 12/53] dubski --- pallets/vector/src/lib.rs | 7 ++++++- pallets/vector/src/tests.rs | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index ba76422c1..6f4cc34c9 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -438,7 +438,12 @@ pub mod pallet { #[pallet::weight(weight_helper::fulfill_call::(* function_id))] pub fn fulfill_call( origin: OriginFor, - inputs: Vec, // TODO: Convert to fixed bytes + function_id: H256, + input: FunctionInput, + output: FunctionOutput, + proof: FunctionProof, + inputs: Vec, // TODO: Convert to fixed bytes + #[pallet::compact] slot: u64, ) -> DispatchResultWithPostInfo { let config = ConfigurationStorage::::get(); let FunctionInputs { diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index ed3d575c9..e4acd3900 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -616,7 +616,12 @@ fn test_fulfill_call() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), inputs, + slot, ); assert_ok!(result); From 42f2328b337f84fdb011251d995974d8e944a90d Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 5 Aug 2024 14:10:26 -0700 Subject: [PATCH 13/53] rotate and step tests work! --- .../examples/{call.cbor => rotate_call.cbor} | Bin pallets/vector/examples/step_call.cbor | Bin 0 -> 213621 bytes pallets/vector/src/lib.rs | 12 +- pallets/vector/src/tests.rs | 120 ++++++++++-------- 4 files changed, 74 insertions(+), 58 deletions(-) rename pallets/vector/examples/{call.cbor => rotate_call.cbor} (100%) create mode 100644 pallets/vector/examples/step_call.cbor diff --git a/pallets/vector/examples/call.cbor b/pallets/vector/examples/rotate_call.cbor similarity index 100% rename from pallets/vector/examples/call.cbor rename to pallets/vector/examples/rotate_call.cbor diff --git a/pallets/vector/examples/step_call.cbor b/pallets/vector/examples/step_call.cbor new file mode 100644 index 0000000000000000000000000000000000000000..71e8541ba88fcb139ade50bb03bdad9177b16038 GIT binary patch literal 213621 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 z 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%0A9!STC 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≀1#kUc;ScO~kw*LPVxsV|XiZ}V}SBy@4p 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 literal 0 HcmV?d00001 diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 6f4cc34c9..0bf9b9626 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -435,7 +435,7 @@ pub mod pallet { /// proof Function proof. /// slot Function slot to update. #[pallet::call_index(0)] - #[pallet::weight(weight_helper::fulfill_call::(* function_id))] + #[pallet::weight(weight_helper::fulfill_call::(* function_id))] // can't remove this pub fn fulfill_call( origin: OriginFor, function_id: H256, @@ -465,7 +465,7 @@ pub mod pallet { .try_into() .unwrap(); let prev_head = store.finalized_header.slot; - + let prev_next_sync_committee = store.next_sync_committee.clone(); // 1. Apply sync committee updates, if any for (index, update) in updates.iter().enumerate() { @@ -546,7 +546,11 @@ pub mod pallet { let mut function_called = false; // Step + println!("Prev_head: {}", prev_head.as_u64()); + println!("Head: {}", head.as_u64()); if prev_head != head { + println!("Step update!!! aaaa"); + println!("New step: {}", head.as_u64()); let verified_output = VerifiedStepOutput { finalized_header_root: H256::from(finalized_header_root), execution_state_root: H256::from(execution_state_root), @@ -565,7 +569,11 @@ pub mod pallet { } // Rotate + if let Some(mut next_sync_committee) = store.next_sync_committee { + println!("Sync committee update!!! bbbb"); + println!("New sync aggpubkey: {:?}", next_sync_committee.aggregate_pubkey); + println!("Prev next sync committwe: {:?}", prev_next_sync_committee); let next_sync_committee_hash: [u8; 32] = next_sync_committee .hash_tree_root() .unwrap() diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index e4acd3900..f104e18b2 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -596,11 +596,11 @@ fn get_valid_amb_message() -> AddressedMessage { // } // #[test] -fn test_fulfill_call() { +fn test_fulfill_step_call() { new_test_ext().execute_with(|| { let slot = 7634942; Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/call.cbor").unwrap(); + let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); SyncCommitteePoseidons::::insert( 931, @@ -620,42 +620,47 @@ fn test_fulfill_call() { get_valid_step_input(), get_valid_step_output(), get_valid_step_proof(), - inputs, + inputs.clone(), slot, ); assert_ok!(result); - let finalized_slot = 7634848; + + let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); + + let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); // ensure that event is fired let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { slot: finalized_slot, finalization_root: H256(hex!( - "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" + "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" )), execution_state_root: H256(hex!( - "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" + "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" )), }); - let finalized_slot = 7634848; let header = Headers::::get(finalized_slot); let head = Head::::get(); let ex_state_root = ExecutionStateRoots::::get(finalized_slot); - + println!("Header: {:?}", header); + println!("FInalized slot: {:?}", finalized_slot); + println!("Ex state root: {:?}", parsed_inputs.execution_state_proof.execution_state_root); assert_eq!( header, H256(hex!( - "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" + "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" )) ); assert_eq!( ex_state_root, H256(hex!( - "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" + "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" )) ); assert_eq!(head, finalized_slot); + println!("All ystem events: {:?}", System::events()); assert_eq!(expected_event, System::events()[0].event); }); } @@ -725,52 +730,55 @@ fn test_fulfill_call() { // }); // } // -// #[test] -// fn test_fulfill_rotate_call() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 342, -// }); -// -// Headers::::set( -// slot, -// H256(hex!( -// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" -// )), -// ); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// ROTATE_FUNCTION_ID, -// get_valid_rotate_input(), -// get_valid_rotate_output(), -// get_valid_rotate_proof(), -// slot, -// ); -// -// assert_ok!(result); -// // ensure that event is fired -// let expected_poseidon = U256::from_dec_str( -// "16399439943012933445970260519503780180385945954293268151243539801891563949197", -// ) -// .unwrap(); -// -// let current_period = 931; -// let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { -// period: current_period + 1, -// root: expected_poseidon, -// }); -// -// let poseidon = SyncCommitteePoseidons::::get(current_period + 1); -// -// assert_eq!(expected_event, System::events()[0].event); -// assert_eq!(poseidon, expected_poseidon); -// }); -// } +#[test] +fn test_fulfill_rotate_call() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); + let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" + )), + ); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + get_valid_rotate_input(), + get_valid_rotate_output(), + get_valid_rotate_proof(), + inputs, + slot, + ); + + assert_ok!(result); + // ensure that event is fired + let expected_poseidon = U256::from_dec_str( + "78004113044439342907882478475913997887515213797155324584820998418219758944903", + ) + .unwrap(); + + let current_period = 1178; + let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { + period: current_period + 1, + root: expected_poseidon, + }); + + let poseidon = SyncCommitteePoseidons::::get(current_period + 1); + + assert_eq!(expected_event, System::events()[0].event); + assert_eq!(poseidon, expected_poseidon); + }); +} // // #[test] // fn test_fulfill_rotate_call_wrong_header() { From 5b799faeb5fd96659fa9b9555ae39dc4983f5339 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 5 Aug 2024 18:31:29 -0700 Subject: [PATCH 14/53] cleanup --- pallets/vector/src/lib.rs | 30 +----------------------------- pallets/vector/src/tests.rs | 21 ++++----------------- 2 files changed, 5 insertions(+), 46 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 0bf9b9626..d8728afe9 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -430,20 +430,13 @@ pub mod pallet { { /// The entrypoint for fulfilling a call. /// function_id Function identifier. - /// input Function input. - /// output Function output. - /// proof Function proof. - /// slot Function slot to update. + /// inputs Function input. #[pallet::call_index(0)] #[pallet::weight(weight_helper::fulfill_call::(* function_id))] // can't remove this pub fn fulfill_call( origin: OriginFor, function_id: H256, - input: FunctionInput, - output: FunctionOutput, - proof: FunctionProof, inputs: Vec, // TODO: Convert to fixed bytes - #[pallet::compact] slot: u64, ) -> DispatchResultWithPostInfo { let config = ConfigurationStorage::::get(); let FunctionInputs { @@ -457,20 +450,11 @@ pub mod pallet { } = serde_cbor::from_slice(&inputs).unwrap(); let mut is_valid = true; - let prev_header: B256 = store - .finalized_header - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); let prev_head = store.finalized_header.slot; - let prev_next_sync_committee = store.next_sync_committee.clone(); // 1. Apply sync committee updates, if any for (index, update) in updates.iter().enumerate() { println!("Processing update {} of {}", index + 1, updates.len()); - is_valid = is_valid && verify_update( update, @@ -481,16 +465,10 @@ pub mod pallet { ) .is_ok(); - apply_update(&mut store, update); - } // 2. Apply finality update - - - - is_valid = is_valid && verify_finality_update( &finality_update, @@ -502,9 +480,7 @@ pub mod pallet { .is_ok(); apply_finality_update(&mut store, &finality_update); - // 3. Verify execution state root proof - let execution_state_branch_nodes: Vec = execution_state_proof .execution_state_branch .iter() @@ -569,11 +545,7 @@ pub mod pallet { } // Rotate - if let Some(mut next_sync_committee) = store.next_sync_committee { - println!("Sync committee update!!! bbbb"); - println!("New sync aggpubkey: {:?}", next_sync_committee.aggregate_pubkey); - println!("Prev next sync committwe: {:?}", prev_next_sync_committee); let next_sync_committee_hash: [u8; 32] = next_sync_committee .hash_tree_root() .unwrap() diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index f104e18b2..7f1e861ed 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -617,11 +617,7 @@ fn test_fulfill_step_call() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), inputs.clone(), - slot, ); assert_ok!(result); @@ -640,7 +636,6 @@ fn test_fulfill_step_call() { )), }); - let header = Headers::::get(finalized_slot); let head = Head::::get(); let ex_state_root = ExecutionStateRoots::::get(finalized_slot); @@ -733,7 +728,6 @@ fn test_fulfill_step_call() { #[test] fn test_fulfill_rotate_call() { new_test_ext().execute_with(|| { - let slot = 7634942; Updater::::set(H256(TEST_SENDER_VEC)); let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); @@ -743,21 +737,14 @@ fn test_fulfill_rotate_call() { finality_threshold: 342, }); - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" - )), - ); - let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), + // get_valid_rotate_input(), + // get_valid_rotate_output(), + // get_valid_rotate_proof(), inputs, - slot, + // slot, ); assert_ok!(result); From 94c0d956a195c750afcfa0cdf2e19692f9030f89 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 5 Aug 2024 18:37:50 -0700 Subject: [PATCH 15/53] SyncCommitteeHashes --- pallets/vector/src/lib.rs | 19 ++++++------------- runtime/src/apis.rs | 5 +++++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index d8728afe9..693f2e771 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -194,6 +194,11 @@ pub mod pallet { #[pallet::getter(fn sync_committee_poseidons)] pub type SyncCommitteePoseidons = StorageMap<_, Identity, u64, U256, ValueQuery>; + /// Maps from a period to the Sha256 commitment for the sync committee. + #[pallet::storage] + #[pallet::getter(fn sync_committee_hashes)] + pub type SyncCommitteeHashes = StorageMap<_, Identity, u64, U256, ValueQuery>; + /// Storage for a config of finality threshold and slots per period. #[pallet::storage] pub type ConfigurationStorage = StorageValue<_, Configuration, ValueQuery>; @@ -496,21 +501,12 @@ pub mod pallet { &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), ); - let finalized_header_root: [u8; 32] = store .finalized_header .hash_tree_root() .unwrap().as_ref().try_into().unwrap(); let execution_state_root: [u8; 32] = execution_state_proof.execution_state_root.as_slice().try_into().unwrap(); - let sync_committee_hash: B256 = store - .current_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); - let head = store.finalized_header.slot; let sender: [u8; 32] = ensure_signed(origin)?.into(); let updater = Updater::::get(); @@ -522,11 +518,7 @@ pub mod pallet { let mut function_called = false; // Step - println!("Prev_head: {}", prev_head.as_u64()); - println!("Head: {}", head.as_u64()); if prev_head != head { - println!("Step update!!! aaaa"); - println!("New step: {}", head.as_u64()); let verified_output = VerifiedStepOutput { finalized_header_root: H256::from(finalized_header_root), execution_state_root: H256::from(execution_state_root), @@ -546,6 +538,7 @@ pub mod pallet { // Rotate if let Some(mut next_sync_committee) = store.next_sync_committee { + let next_sync_committee_hash: [u8; 32] = next_sync_committee .hash_tree_root() .unwrap() diff --git a/runtime/src/apis.rs b/runtime/src/apis.rs index 9c414c977..6a5440539 100644 --- a/runtime/src/apis.rs +++ b/runtime/src/apis.rs @@ -58,6 +58,7 @@ decl_runtime_apis! { pub trait VectorApi { fn sync_committee_poseidons(slot: u64) -> U256; + fn sync_committee_hashes(slot: u64) -> U256; fn head() -> u64; fn headers(slot: u64) -> H256; } @@ -391,6 +392,10 @@ impl_runtime_apis! { pallet_vector::Pallet::::sync_committee_poseidons(slot) } + fn sync_committee_hashes(slot: u64) -> U256 { + pallet_vector::Pallet::::sync_committee_hashes(slot) + } + fn head() -> u64 { pallet_vector::Pallet::::head() } From 7dc9eaec9e42850172a2750eb33d7e4dc9b6e471 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 5 Aug 2024 18:50:51 -0700 Subject: [PATCH 16/53] re introduce contract logic --- .idea/.gitignore | 5 +++ .idea/AVAIL_GOOD.iml | 26 ++++++++++++ .idea/inspectionProfiles/Project_Default.xml | 6 +++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 6 +++ pallets/vector/src/lib.rs | 43 +++++++++++++------- 6 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/AVAIL_GOOD.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..b58b603fe --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/AVAIL_GOOD.iml b/.idea/AVAIL_GOOD.iml new file mode 100644 index 000000000..523a20570 --- /dev/null +++ b/.idea/AVAIL_GOOD.iml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..03d9549ea --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..22cb98442 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 693f2e771..1091d639b 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -537,27 +537,40 @@ pub mod pallet { } // Rotate - if let Some(mut next_sync_committee) = store.next_sync_committee { - let next_sync_committee_hash: [u8; 32] = next_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); - let next_sync_committee_hash = U256::from(next_sync_committee_hash); - + // If the sync committee for the new peroid is not set, set it. + // This can happen if the light client was very behind and had a lot of updates + // Note: Only the latest sync committee is stored, not the intermediate ones from every update. + // This may leave gaps in the sync committee history + if (syncCommittees[period] == bytes32(0)) { + syncCommittees[period] = po.syncCommitteeHash; + emit SyncCommitteeUpdate(period, po.syncCommitteeHash); + } + + if let Some(mut next_sync_committee) = store.next_sync_committee { let period = head.as_u64() .checked_div(config.slots_per_period) .ok_or(Error::::ConfigurationNotSet)?; let next_period = period + 1; - Self::set_sync_committee_poseidon(next_period, next_sync_committee_hash)?; + let stored_next_sync_committee_hash = SyncCommitteePoseidons::::get(next_period); + let next_sync_committee_hash: [u8; 32] = next_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + let next_sync_committee_hash = U256::from(next_sync_committee_hash); + + // If the next sync committee is already correct, we don't need to update it. + if stored_next_sync_committee_hash != next_sync_committee_hash.into() { + Self::deposit_event(Event::SyncCommitteeUpdated { + period: next_period, + root: next_sync_committee_hash, + }); + function_called = true; - Self::deposit_event(Event::SyncCommitteeUpdated { - period: next_period, - root: next_sync_committee_hash, - }); - function_called=true; + Self::set_sync_committee_poseidon(next_period, next_sync_committee_hash)?; + } } if !function_called { From edbf120a376558a134bd11fb8486b30090875dd0 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 5 Aug 2024 19:43:29 -0700 Subject: [PATCH 17/53] wip --- pallets/vector/src/lib.rs | 22 ++++++++++++---------- pallets/vector/src/tests.rs | 4 ---- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 1091d639b..68c44dc2b 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -459,7 +459,6 @@ pub mod pallet { // 1. Apply sync committee updates, if any for (index, update) in updates.iter().enumerate() { - println!("Processing update {} of {}", index + 1, updates.len()); is_valid = is_valid && verify_update( update, @@ -538,19 +537,22 @@ pub mod pallet { // Rotate - // If the sync committee for the new peroid is not set, set it. + // If the sync committee for the new period is not set, set it. // This can happen if the light client was very behind and had a lot of updates // Note: Only the latest sync committee is stored, not the intermediate ones from every update. // This may leave gaps in the sync committee history - if (syncCommittees[period] == bytes32(0)) { - syncCommittees[period] = po.syncCommitteeHash; - emit SyncCommitteeUpdate(period, po.syncCommitteeHash); - } - + // if (syncCommittees[period] == bytes32(0)) { + // syncCommittees[period] = po.syncCommitteeHash; + // emit SyncCommitteeUpdate(period, po.syncCommitteeHash); + // } + let period = head.as_u64() + .checked_div(config.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; + let stored_current_sync_committee = SyncCommitteePoseidons::::get(period); + println!("stored current sync committee {:?}", stored_current_sync_committee); + if let Some(mut next_sync_committee) = store.next_sync_committee { - let period = head.as_u64() - .checked_div(config.slots_per_period) - .ok_or(Error::::ConfigurationNotSet)?; + let next_period = period + 1; let stored_next_sync_committee_hash = SyncCommitteePoseidons::::get(next_period); let next_sync_committee_hash: [u8; 32] = next_sync_committee diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 7f1e861ed..84a201961 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -639,9 +639,6 @@ fn test_fulfill_step_call() { let header = Headers::::get(finalized_slot); let head = Head::::get(); let ex_state_root = ExecutionStateRoots::::get(finalized_slot); - println!("Header: {:?}", header); - println!("FInalized slot: {:?}", finalized_slot); - println!("Ex state root: {:?}", parsed_inputs.execution_state_proof.execution_state_root); assert_eq!( header, H256(hex!( @@ -655,7 +652,6 @@ fn test_fulfill_step_call() { )) ); assert_eq!(head, finalized_slot); - println!("All ystem events: {:?}", System::events()); assert_eq!(expected_event, System::events()[0].event); }); } From 8396f3ebec294df4f335bb40be4c724234c01bc7 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 6 Aug 2024 11:19:52 -0700 Subject: [PATCH 18/53] fixymajig --- pallets/vector/src/lib.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 68c44dc2b..28307c0b7 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -550,7 +550,22 @@ pub mod pallet { .ok_or(Error::::ConfigurationNotSet)?; let stored_current_sync_committee = SyncCommitteePoseidons::::get(period); println!("stored current sync committee {:?}", stored_current_sync_committee); - + if stored_current_sync_committee.is_zero() { + let current_sync_committee_hash: U256 = store + .current_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + Self::deposit_event(Event::SyncCommitteeUpdated { + period, + root: current_sync_committee_hash, + }); + function_called = true; + + Self::set_sync_committee_poseidon(period, current_sync_committee_hash)?; + } if let Some(mut next_sync_committee) = store.next_sync_committee { let next_period = period + 1; From a021f97f181b52afbe43df8e940f29d98b80e465 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 6 Aug 2024 11:21:21 -0700 Subject: [PATCH 19/53] re add comments --- pallets/vector/src/lib.rs | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 28307c0b7..b38cde99d 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -516,7 +516,7 @@ pub mod pallet { let mut function_called = false; - // Step + // 4. Store step if needed if prev_head != head { let verified_output = VerifiedStepOutput { finalized_header_root: H256::from(finalized_header_root), @@ -535,16 +535,8 @@ pub mod pallet { } } - // Rotate - - // If the sync committee for the new period is not set, set it. - // This can happen if the light client was very behind and had a lot of updates - // Note: Only the latest sync committee is stored, not the intermediate ones from every update. - // This may leave gaps in the sync committee history - // if (syncCommittees[period] == bytes32(0)) { - // syncCommittees[period] = po.syncCommitteeHash; - // emit SyncCommitteeUpdate(period, po.syncCommitteeHash); - // } + // 5. Store rotate if needed + // a) Store current sync committee if stored one is empty (i.e. first time or after a range of updates) let period = head.as_u64() .checked_div(config.slots_per_period) .ok_or(Error::::ConfigurationNotSet)?; @@ -566,6 +558,8 @@ pub mod pallet { Self::set_sync_committee_poseidon(period, current_sync_committee_hash)?; } + + // b) Store next sync committee if available if let Some(mut next_sync_committee) = store.next_sync_committee { let next_period = period + 1; From 322c29ba82a6274f16f88399e070724f3566ce4f Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 6 Aug 2024 11:22:07 -0700 Subject: [PATCH 20/53] fixymajig --- pallets/vector/src/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 84a201961..90caa19cc 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -758,7 +758,7 @@ fn test_fulfill_rotate_call() { let poseidon = SyncCommitteePoseidons::::get(current_period + 1); - assert_eq!(expected_event, System::events()[0].event); + assert_eq!(expected_event, System::events()[1].event); assert_eq!(poseidon, expected_poseidon); }); } From e72f648e1e68f22922215764113ef1b3df571b0f Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 6 Aug 2024 11:35:28 -0700 Subject: [PATCH 21/53] switch to SyncCommitteeHashes --- pallets/vector/src/lib.rs | 2192 ++++++++++++++++++----------------- pallets/vector/src/state.rs | 328 +++--- pallets/vector/src/tests.rs | 274 +++-- 3 files changed, 1398 insertions(+), 1396 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index b38cde99d..ca7bab374 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -11,9 +11,9 @@ use ssz_rs::prelude::*; use codec::Compact; use frame_support::{ - pallet_prelude::*, - traits::{Currency, ExistenceRequirement, UnixTime}, - PalletId, + pallet_prelude::*, + traits::{Currency, ExistenceRequirement, UnixTime}, + PalletId, }; use sp_core::H256; use sp_runtime::SaturatedConversion; @@ -46,1178 +46,1192 @@ pub const ROTATE_POSEIDON_OUTPUT_LENGTH: u32 = 32; pub const STEP_OUTPUT_LENGTH: u32 = 74; pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; +<::Currency as Currency<::AccountId>>::Balance; #[frame_support::pallet] pub mod pallet { - use consensus_core::get_bits; - use ethabi::Token; - use ethabi::Token::Uint; - use frame_support::dispatch::GetDispatchInfo; - use frame_support::traits::{LockableCurrency, UnfilteredDispatchable}; - use frame_support::{pallet_prelude::ValueQuery, DefaultNoBound}; - use frame_system::pallet_prelude::*; - use primitive_types::H160; - use primitive_types::{H256, U256}; - use sp_io::hashing::keccak_256; - use sp_io::hashing::sha2_256; - use sp_runtime::traits::AccountIdConversion; - pub use weights::WeightInfo; - - use crate::state::Configuration; - use crate::state::{ - parse_rotate_output, parse_step_output, VerifiedRotate, VerifiedStep, VerifiedStepOutput, - }; - use crate::storage_utils::{get_storage_root, get_storage_value}; - use crate::verifier::encode_packed; - - use super::*; - - #[pallet::error] - pub enum Error { - VerificationError, - NotEnoughParticipants, - ConfigurationNotSet, - SlotBehindHead, - VerificationKeyIsNotSet, - MalformedVerificationKey, - FunctionIdNotKnown, - StepVerificationError, - RotateVerificationError, - HeaderRootNotSet, - VerificationFailed, - HeaderRootAlreadySet, - StateRootAlreadySet, - SyncCommitteeAlreadySet, - SyncCommitteeNotSet, - MessageAlreadyExecuted, - WrongDestinationChain, - UnsupportedOriginChain, - BroadcasterSourceChainNotSet, - SourceChainFrozen, - CannotGetStorageRoot, - CannotGetStorageValue, - InvalidMessageHash, - CannotDecodeData, - CannotDecodeDestinationAccountId, - /// Given AssetId is not supported - AssetNotSupported, - /// Given inputs for the selected MessageType are invalid - InvalidBridgeInputs, - /// Domain is not supported - DomainNotSupported, - /// Function ids (step / rotate) are not set - FunctionIdsAreNotSet, - /// Inherent call outside of block execution context. - BadContext, - /// Invalid FailedIndices - InvalidFailedIndices, - /// Invalid updater - UpdaterMisMatch, - /// Proof output parsing error - CannotParseOutputData, - /// Cannot get current message id - CurrentMessageIdNotFound, - } - - #[pallet::event] - #[pallet::generate_deposit(pub (super) fn deposit_event)] - pub enum Event { - /// Emit event once the head is updated. - HeadUpdated { - slot: u64, - finalization_root: H256, - execution_state_root: H256, - }, - /// Emit event once the sync committee updates. - SyncCommitteeUpdated { period: u64, root: U256 }, - /// Emit when new updater is set. - BroadcasterUpdated { old: H256, new: H256, domain: u32 }, - /// Emit when message gets executed. - MessageExecuted { - from: H256, - to: H256, - message_id: u64, - message_root: H256, - }, - /// Emit if source chain gets frozen. - SourceChainFrozen { source_chain_id: u32, frozen: bool }, - /// Emit when message is submitted. - MessageSubmitted { - from: T::AccountId, - to: H256, - message_type: MessageType, - destination_domain: u32, - message_id: u64, - }, - /// Emit whitelisted domains that are updated. - WhitelistedDomainsUpdated, - /// Emit when configuration is updated. - ConfigurationUpdated { - slots_per_period: u64, - finality_threshold: u16, - }, - /// Emit function Ids that are updated. - FunctionIdsUpdated { value: Option<(H256, H256)> }, - /// Emit updated step verification key. - StepVerificationKeyUpdated { - value: Option>>, - }, - /// Emit updated rotate verification key. - RotateVerificationKeyUpdated { - value: Option>>, - }, - /// Emit new updater. - NewUpdater { old: H256, new: H256 }, - } - - /// Storage for a head updates. - #[pallet::storage] - #[pallet::getter(fn head)] - pub type Head = StorageValue<_, u64, ValueQuery>; - - /// Maps from a slot to a block header root. - #[pallet::storage] - #[pallet::getter(fn headers)] - pub type Headers = StorageMap<_, Identity, u64, H256, ValueQuery>; - - /// Maps slot to the timestamp of when the headers mapping was updated with slot as a key - #[pallet::storage] - pub type Timestamps = StorageMap<_, Identity, u64, u64, ValueQuery>; - - /// Maps from a slot to the current finalized ethereum execution state root. - #[pallet::storage] - pub type ExecutionStateRoots = StorageMap<_, Identity, u64, H256, ValueQuery>; - - /// Maps from a period to the poseidon commitment for the sync committee. - #[pallet::storage] - #[pallet::getter(fn sync_committee_poseidons)] - pub type SyncCommitteePoseidons = StorageMap<_, Identity, u64, U256, ValueQuery>; - - /// Maps from a period to the Sha256 commitment for the sync committee. - #[pallet::storage] - #[pallet::getter(fn sync_committee_hashes)] - pub type SyncCommitteeHashes = StorageMap<_, Identity, u64, U256, ValueQuery>; - - /// Storage for a config of finality threshold and slots per period. - #[pallet::storage] - pub type ConfigurationStorage = StorageValue<_, Configuration, ValueQuery>; - - /// Maps status of the message to the message root. - #[pallet::storage] - pub type MessageStatus = StorageMap<_, Identity, H256, MessageStatusEnum, ValueQuery>; - - /// Mapping between source chainId and the address of the broadcaster on that chain. - #[pallet::storage] - pub type Broadcasters = StorageMap<_, Identity, u32, H256, ValueQuery>; - - /// Flags source chain to be frozen. - #[pallet::storage] - pub type SourceChainFrozen = StorageMap<_, Identity, u32, bool, ValueQuery>; - - /// List of permitted domains. - #[pallet::storage] - pub type WhitelistedDomains = StorageValue<_, BoundedVec>, ValueQuery>; - - /// The storage for the step function identifier and the rotate function identifier. - /// Step function id is used to distinguish step-related functionality within the fulfill_call function. - /// Rotate function id is used to handle rotate-related functionality within the fulfill_call function. - /// When the provided function_id matches the step/rotate function identifier, specific logic related to step/rotate functions is executed. - /// The order of storage is (step_function_id, rotate_function_id) - #[pallet::storage] - #[pallet::getter(fn function_ids)] - pub type FunctionIds = StorageValue<_, Option<(H256, H256)>, ValueQuery>; - - /// Step verification key storage. - #[pallet::storage] - #[pallet::getter(fn step_verification_key)] - pub type StepVerificationKey = - StorageValue<_, Option>>, ValueQuery>; - - /// Rotate verification key storage. - #[pallet::storage] - #[pallet::getter(fn rotate_verification_key)] - pub type RotateVerificationKey = - StorageValue<_, Option>>, ValueQuery>; - - /// Genesis validator root, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn genesis_validator_root)] - pub type GenesisValidatorRoot = StorageValue<_, H256, ValueQuery>; - - /// Genesis timestamp, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn genesis_timestamp)] - pub type GenesisTimestamp = StorageValue<_, u64, ValueQuery>; - - /// Seconds per slot, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn seconds_per_slot)] - pub type SecondsPerSlot = StorageValue<_, u64, ValueQuery>; - - /// Source chain id, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn source_chain_id)] - pub type SourceChainId = StorageValue<_, u64, ValueQuery>; - - /// Updater that can submit updates - #[pallet::storage] - #[pallet::getter(fn updater)] - pub type Updater = StorageValue<_, H256, ValueQuery>; - - /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. - pub mod config_preludes { - use super::*; - use frame_support::derive_impl; - use frame_support::parameter_types; - use frame_support::traits::ConstU64; - - parameter_types! { + use consensus_core::get_bits; + use ethabi::Token; + use ethabi::Token::Uint; + use frame_support::dispatch::GetDispatchInfo; + use frame_support::traits::{LockableCurrency, UnfilteredDispatchable}; + use frame_support::{pallet_prelude::ValueQuery, DefaultNoBound}; + use frame_system::pallet_prelude::*; + use primitive_types::H160; + use primitive_types::{H256, U256}; + use sp_io::hashing::keccak_256; + use sp_io::hashing::sha2_256; + use sp_runtime::traits::AccountIdConversion; + pub use weights::WeightInfo; + + use crate::state::Configuration; + use crate::state::{ + parse_rotate_output, parse_step_output, VerifiedRotate, VerifiedStep, VerifiedStepOutput, + }; + use crate::storage_utils::{get_storage_root, get_storage_value}; + use crate::verifier::encode_packed; + + use super::*; + + #[pallet::error] + pub enum Error { + VerificationError, + NotEnoughParticipants, + ConfigurationNotSet, + SlotBehindHead, + VerificationKeyIsNotSet, + MalformedVerificationKey, + FunctionIdNotKnown, + StepVerificationError, + RotateVerificationError, + HeaderRootNotSet, + VerificationFailed, + HeaderRootAlreadySet, + StateRootAlreadySet, + SyncCommitteeAlreadySet, + SyncCommitteeNotSet, + MessageAlreadyExecuted, + WrongDestinationChain, + UnsupportedOriginChain, + BroadcasterSourceChainNotSet, + SourceChainFrozen, + CannotGetStorageRoot, + CannotGetStorageValue, + InvalidMessageHash, + CannotDecodeData, + CannotDecodeDestinationAccountId, + /// Given AssetId is not supported + AssetNotSupported, + /// Given inputs for the selected MessageType are invalid + InvalidBridgeInputs, + /// Domain is not supported + DomainNotSupported, + /// Function ids (step / rotate) are not set + FunctionIdsAreNotSet, + /// Inherent call outside of block execution context. + BadContext, + /// Invalid FailedIndices + InvalidFailedIndices, + /// Invalid updater + UpdaterMisMatch, + /// Proof output parsing error + CannotParseOutputData, + /// Cannot get current message id + CurrentMessageIdNotFound, + } + + #[pallet::event] + #[pallet::generate_deposit(pub (super) fn deposit_event)] + pub enum Event { + /// Emit event once the head is updated. + HeadUpdated { + slot: u64, + finalization_root: H256, + execution_state_root: H256, + }, + /// Emit event once the sync committee updates. + SyncCommitteeUpdated { period: u64, root: U256 }, + /// Emit when new updater is set. + BroadcasterUpdated { old: H256, new: H256, domain: u32 }, + /// Emit when message gets executed. + MessageExecuted { + from: H256, + to: H256, + message_id: u64, + message_root: H256, + }, + /// Emit if source chain gets frozen. + SourceChainFrozen { source_chain_id: u32, frozen: bool }, + /// Emit when message is submitted. + MessageSubmitted { + from: T::AccountId, + to: H256, + message_type: MessageType, + destination_domain: u32, + message_id: u64, + }, + /// Emit whitelisted domains that are updated. + WhitelistedDomainsUpdated, + /// Emit when configuration is updated. + ConfigurationUpdated { + slots_per_period: u64, + finality_threshold: u16, + }, + /// Emit function Ids that are updated. + FunctionIdsUpdated { value: Option<(H256, H256)> }, + /// Emit updated step verification key. + StepVerificationKeyUpdated { + value: Option>>, + }, + /// Emit updated rotate verification key. + RotateVerificationKeyUpdated { + value: Option>>, + }, + /// Emit new updater. + NewUpdater { old: H256, new: H256 }, + } + + /// Storage for a head updates. + #[pallet::storage] + #[pallet::getter(fn head)] + pub type Head = StorageValue<_, u64, ValueQuery>; + + /// Maps from a slot to a block header root. + #[pallet::storage] + #[pallet::getter(fn headers)] + pub type Headers = StorageMap<_, Identity, u64, H256, ValueQuery>; + + /// Maps slot to the timestamp of when the headers mapping was updated with slot as a key + #[pallet::storage] + pub type Timestamps = StorageMap<_, Identity, u64, u64, ValueQuery>; + + /// Maps from a slot to the current finalized ethereum execution state root. + #[pallet::storage] + pub type ExecutionStateRoots = StorageMap<_, Identity, u64, H256, ValueQuery>; + + /// DEPRECATED: Use SyncCommitteeHashes instead. + /// Maps from a period to the poseidon commitment for the sync committee. + #[pallet::storage] + #[pallet::getter(fn sync_committee_poseidons)] + pub type SyncCommitteePoseidons = StorageMap<_, Identity, u64, U256, ValueQuery>; + + /// Maps from a period to the Sha256 commitment for the sync committee. + #[pallet::storage] + #[pallet::getter(fn sync_committee_hashes)] + pub type SyncCommitteeHashes = StorageMap<_, Identity, u64, U256, ValueQuery>; + + /// Storage for a config of finality threshold and slots per period. + #[pallet::storage] + pub type ConfigurationStorage = StorageValue<_, Configuration, ValueQuery>; + + /// Maps status of the message to the message root. + #[pallet::storage] + pub type MessageStatus = StorageMap<_, Identity, H256, MessageStatusEnum, ValueQuery>; + + /// Mapping between source chainId and the address of the broadcaster on that chain. + #[pallet::storage] + pub type Broadcasters = StorageMap<_, Identity, u32, H256, ValueQuery>; + + /// Flags source chain to be frozen. + #[pallet::storage] + pub type SourceChainFrozen = StorageMap<_, Identity, u32, bool, ValueQuery>; + + /// List of permitted domains. + #[pallet::storage] + pub type WhitelistedDomains = StorageValue<_, BoundedVec>, ValueQuery>; + + /// The storage for the step function identifier and the rotate function identifier. + /// Step function id is used to distinguish step-related functionality within the fulfill_call function. + /// Rotate function id is used to handle rotate-related functionality within the fulfill_call function. + /// When the provided function_id matches the step/rotate function identifier, specific logic related to step/rotate functions is executed. + /// The order of storage is (step_function_id, rotate_function_id) + #[pallet::storage] + #[pallet::getter(fn function_ids)] + pub type FunctionIds = StorageValue<_, Option<(H256, H256)>, ValueQuery>; + + /// Step verification key storage. + #[pallet::storage] + #[pallet::getter(fn step_verification_key)] + pub type StepVerificationKey = + StorageValue<_, Option>>, ValueQuery>; + + /// Rotate verification key storage. + #[pallet::storage] + #[pallet::getter(fn rotate_verification_key)] + pub type RotateVerificationKey = + StorageValue<_, Option>>, ValueQuery>; + + /// Genesis validator root, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn genesis_validator_root)] + pub type GenesisValidatorRoot = StorageValue<_, H256, ValueQuery>; + + /// Genesis timestamp, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn genesis_timestamp)] + pub type GenesisTimestamp = StorageValue<_, u64, ValueQuery>; + + /// Seconds per slot, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn seconds_per_slot)] + pub type SecondsPerSlot = StorageValue<_, u64, ValueQuery>; + + /// Source chain id, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn source_chain_id)] + pub type SourceChainId = StorageValue<_, u64, ValueQuery>; + + /// Updater that can submit updates + #[pallet::storage] + #[pallet::getter(fn updater)] + pub type Updater = StorageValue<_, H256, ValueQuery>; + + /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. + pub mod config_preludes { + use super::*; + use frame_support::derive_impl; + use frame_support::parameter_types; + use frame_support::traits::ConstU64; + + parameter_types! { pub const BridgePalletId: PalletId = PalletId(*b"avl/brdg"); } - /// Provides a viable default config that can be used with - /// [`derive_impl`](`frame_support::derive_impl`) to derive a testing pallet config - /// based on this one. - pub struct TestDefaultConfig; - - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] - impl frame_system::DefaultConfig for TestDefaultConfig {} - - #[frame_support::register_default_impl(TestDefaultConfig)] - impl DefaultConfig for TestDefaultConfig { - type WeightInfo = (); - type MessageMappingStorageIndex = ConstU64<1>; - type AvailDomain = ConstU32<1>; - #[inject_runtime_type] - type RuntimeEvent = (); - #[inject_runtime_type] - type RuntimeCall = (); - type PalletId = BridgePalletId; - } - } - - #[pallet::config(with_default)] - pub trait Config: frame_system::Config { - /// Because this pallet emits events, it depends on the runtime's definition of an event. - #[pallet::no_default_bounds] - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. - #[pallet::no_default_bounds] - type RuntimeCall: Parameter - + UnfilteredDispatchable - + GetDispatchInfo; - /// Weight information for extrinsics in this pallet. - type WeightInfo: WeightInfo; - /// Currency type for this pallet. - #[pallet::no_default] - type Currency: LockableCurrency>; - /// Dependency that can provide current time. - #[pallet::no_default] - type TimeProvider: UnixTime; - /// The index of the `messages` mapping in contract. - /// This is mandatory when calling execute messages via storage proofs. - #[pallet::constant] - type MessageMappingStorageIndex: Get; - /// Bridge's pallet id, used for deriving its sovereign account ID. - #[pallet::constant] - type PalletId: Get; - /// Unique value associated with Avail Network. Used to distinguish messages between Avail and non-Avail networks. - #[pallet::constant] - type AvailDomain: Get; - } - - #[pallet::genesis_config] - #[derive(DefaultNoBound)] - pub struct GenesisConfig { - pub slots_per_period: u64, - pub finality_threshold: u16, - pub function_ids: (H256, H256), - pub sync_committee_poseidon: U256, - pub period: u64, - pub broadcaster: H256, - pub broadcaster_domain: u32, - pub step_verification_key: Vec, - pub rotate_verification_key: Vec, - pub whitelisted_domains: Vec, - pub genesis_validator_root: H256, - pub genesis_time: u64, - pub seconds_per_slot: u64, - pub source_chain_id: u64, - pub _phantom: PhantomData, - } - - #[pallet::genesis_build] - impl BuildGenesisConfig for GenesisConfig { - fn build(&self) { - // Preconfigure init data - >::put(Configuration { - slots_per_period: self.slots_per_period, - finality_threshold: self.finality_threshold, - }); - - let mut domains = self.whitelisted_domains.clone(); - - // Whitelisted domains sanitization. - domains.sort(); - domains.dedup(); - let domains = - BoundedVec::try_from(domains).expect("Cannot have more than 10_000 domains."); - WhitelistedDomains::::put(domains); - - Broadcasters::::set(self.broadcaster_domain, self.broadcaster); - - FunctionIds::::set(Some(self.function_ids)); - - let step_verification_key = BoundedVec::try_from(self.step_verification_key.clone()) - .expect("Step verification key should be valid at genesis."); - StepVerificationKey::::set(Some(step_verification_key)); - - let rotate_verification_key = - BoundedVec::try_from(self.rotate_verification_key.clone()) - .expect("Rotate verification key should be valid at genesis."); - RotateVerificationKey::::set(Some(rotate_verification_key)); - - SyncCommitteePoseidons::::insert(self.period, self.sync_committee_poseidon); - - GenesisValidatorRoot::::set(self.genesis_validator_root); - - GenesisTimestamp::::set(self.genesis_time); - - SecondsPerSlot::::set(self.seconds_per_slot); - - SourceChainId::::set(self.source_chain_id); - } - } - - #[pallet::pallet] - pub struct Pallet(_); - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_initialize(_n: BlockNumberFor) -> Weight { - if let Some(failed_txs) = - MemoryTemporaryStorage::take::>>(FAILED_SEND_MSG_ID) - { - log::trace!(target: LOG_TARGET, "Failed Txs cleaned: {failed_txs:?}"); - } - - Weight::zero() - } - } - // TODO: Rename to FunctionInput - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] - pub struct FunctionInputs { - pub updates: Vec, - pub finality_update: FinalityUpdate, - pub expected_current_slot: u64, - pub store: LightClientStore, - pub genesis_root: Bytes32, - pub forks: Forks, - pub execution_state_proof: ExecutionStateProof, - } - - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] - pub struct ExecutionStateProof { - #[serde(rename = "executionStateRoot")] - pub execution_state_root: B256, - #[serde(rename = "executionStateBranch")] - pub execution_state_branch: Vec, - pub gindex: String, - } - /// Merkle branch index & depth for the execution state root proof. - pub const MERKLE_BRANCH_INDEX: usize = 802; - pub const MERKLE_BRANCH_DEPTH: usize = 9; - #[pallet::call] - impl Pallet - where - [u8; 32]: From, - { - /// The entrypoint for fulfilling a call. - /// function_id Function identifier. - /// inputs Function input. - #[pallet::call_index(0)] - #[pallet::weight(weight_helper::fulfill_call::(* function_id))] // can't remove this - pub fn fulfill_call( - origin: OriginFor, - function_id: H256, - inputs: Vec, // TODO: Convert to fixed bytes - ) -> DispatchResultWithPostInfo { - let config = ConfigurationStorage::::get(); - let FunctionInputs { - updates, - finality_update, - expected_current_slot, - mut store, - genesis_root, - forks, - execution_state_proof, - } = serde_cbor::from_slice(&inputs).unwrap(); - - let mut is_valid = true; - let prev_head = store.finalized_header.slot; - - // 1. Apply sync committee updates, if any - for (index, update) in updates.iter().enumerate() { - is_valid = is_valid - && verify_update( - update, - expected_current_slot, - &store, - genesis_root.clone(), - &forks, - ) - .is_ok(); - - apply_update(&mut store, update); - } - - // 2. Apply finality update - is_valid = is_valid - && verify_finality_update( - &finality_update, - expected_current_slot, - &store, - genesis_root.clone(), - &forks, - ) - .is_ok(); - apply_finality_update(&mut store, &finality_update); - - // 3. Verify execution state root proof - let execution_state_branch_nodes: Vec = execution_state_proof - .execution_state_branch - .iter() - .map(|b| Node::try_from(b.as_ref()).unwrap()) - .collect(); - - is_valid = is_valid - && is_valid_merkle_branch( - &Node::try_from(execution_state_proof.execution_state_root.as_ref()).unwrap(), - execution_state_branch_nodes.iter(), - MERKLE_BRANCH_DEPTH, - MERKLE_BRANCH_INDEX, - &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), - ); - - let finalized_header_root: [u8; 32] = store - .finalized_header - .hash_tree_root() - .unwrap().as_ref().try_into().unwrap(); - let execution_state_root: [u8; 32] = execution_state_proof.execution_state_root.as_slice().try_into().unwrap(); - - let head = store.finalized_header.slot; - let sender: [u8; 32] = ensure_signed(origin)?.into(); - let updater = Updater::::get(); - - // ensure sender is preconfigured - ensure!(H256(sender) == updater, Error::::UpdaterMisMatch); - ensure!(is_valid, Error::::VerificationFailed); - - let mut function_called = false; - - // 4. Store step if needed - if prev_head != head { - let verified_output = VerifiedStepOutput { - finalized_header_root: H256::from(finalized_header_root), - execution_state_root: H256::from(execution_state_root), - finalized_slot: store.finalized_header.slot.as_u64(), - participation: store.current_max_active_participants.try_into().unwrap(), - }; - - if Self::set_slot_roots(verified_output)? { - Self::deposit_event(Event::HeadUpdated { - slot: verified_output.finalized_slot, - finalization_root: verified_output.finalized_header_root, - execution_state_root: verified_output.execution_state_root, - }); - function_called = true; - } - } - - // 5. Store rotate if needed - // a) Store current sync committee if stored one is empty (i.e. first time or after a range of updates) - let period = head.as_u64() - .checked_div(config.slots_per_period) - .ok_or(Error::::ConfigurationNotSet)?; - let stored_current_sync_committee = SyncCommitteePoseidons::::get(period); - println!("stored current sync committee {:?}", stored_current_sync_committee); - if stored_current_sync_committee.is_zero() { - let current_sync_committee_hash: U256 = store - .current_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); - Self::deposit_event(Event::SyncCommitteeUpdated { - period, - root: current_sync_committee_hash, - }); - function_called = true; - - Self::set_sync_committee_poseidon(period, current_sync_committee_hash)?; - } - - // b) Store next sync committee if available - if let Some(mut next_sync_committee) = store.next_sync_committee { - - let next_period = period + 1; - let stored_next_sync_committee_hash = SyncCommitteePoseidons::::get(next_period); - let next_sync_committee_hash: [u8; 32] = next_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); - let next_sync_committee_hash = U256::from(next_sync_committee_hash); - - // If the next sync committee is already correct, we don't need to update it. - if stored_next_sync_committee_hash != next_sync_committee_hash.into() { - Self::deposit_event(Event::SyncCommitteeUpdated { - period: next_period, - root: next_sync_committee_hash, - }); - function_called = true; - - Self::set_sync_committee_poseidon(next_period, next_sync_committee_hash)?; - } - } - - if !function_called { - return Err(Error::::FunctionIdNotKnown.into()); - } - - Ok(().into()) - } - - /// Executes message if a valid proofs are provided for the supported message type, assets and domains. - #[pallet::call_index(1)] - #[pallet::weight({ - match addr_message.message { - Message::ArbitraryMessage(ref data) => T::WeightInfo::execute_arbitrary_message(data.len() as u32), - Message::FungibleToken {..} => T::WeightInfo::execute_fungible_token(), - } - })] - pub fn execute( - origin: OriginFor, - #[pallet::compact] slot: u64, - addr_message: AddressedMessage, - account_proof: ValidProof, - storage_proof: ValidProof, - ) -> DispatchResultWithPostInfo { - ensure_signed(origin)?; - let encoded_data = addr_message.clone().abi_encode(); - let message_root = H256(keccak_256(encoded_data.as_slice())); - - Self::check_preconditions(&addr_message, message_root)?; - - ensure!( + /// Provides a viable default config that can be used with + /// [`derive_impl`](`frame_support::derive_impl`) to derive a testing pallet config + /// based on this one. + pub struct TestDefaultConfig; + + #[derive_impl( + frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types + )] + impl frame_system::DefaultConfig for TestDefaultConfig {} + + #[frame_support::register_default_impl(TestDefaultConfig)] + impl DefaultConfig for TestDefaultConfig { + type WeightInfo = (); + type MessageMappingStorageIndex = ConstU64<1>; + type AvailDomain = ConstU32<1>; + #[inject_runtime_type] + type RuntimeEvent = (); + #[inject_runtime_type] + type RuntimeCall = (); + type PalletId = BridgePalletId; + } + } + + #[pallet::config(with_default)] + pub trait Config: frame_system::Config { + /// Because this pallet emits events, it depends on the runtime's definition of an event. + #[pallet::no_default_bounds] + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. + #[pallet::no_default_bounds] + type RuntimeCall: Parameter + + UnfilteredDispatchable + + GetDispatchInfo; + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; + /// Currency type for this pallet. + #[pallet::no_default] + type Currency: LockableCurrency>; + /// Dependency that can provide current time. + #[pallet::no_default] + type TimeProvider: UnixTime; + /// The index of the `messages` mapping in contract. + /// This is mandatory when calling execute messages via storage proofs. + #[pallet::constant] + type MessageMappingStorageIndex: Get; + /// Bridge's pallet id, used for deriving its sovereign account ID. + #[pallet::constant] + type PalletId: Get; + /// Unique value associated with Avail Network. Used to distinguish messages between Avail and non-Avail networks. + #[pallet::constant] + type AvailDomain: Get; + } + + #[pallet::genesis_config] + #[derive(DefaultNoBound)] + pub struct GenesisConfig { + pub slots_per_period: u64, + pub finality_threshold: u16, + pub function_ids: (H256, H256), + pub sync_committee_hash: U256, + pub period: u64, + pub broadcaster: H256, + pub broadcaster_domain: u32, + pub step_verification_key: Vec, + pub rotate_verification_key: Vec, + pub whitelisted_domains: Vec, + pub genesis_validator_root: H256, + pub genesis_time: u64, + pub seconds_per_slot: u64, + pub source_chain_id: u64, + pub _phantom: PhantomData, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) { + // Preconfigure init data + >::put(Configuration { + slots_per_period: self.slots_per_period, + finality_threshold: self.finality_threshold, + }); + + let mut domains = self.whitelisted_domains.clone(); + + // Whitelisted domains sanitization. + domains.sort(); + domains.dedup(); + let domains = + BoundedVec::try_from(domains).expect("Cannot have more than 10_000 domains."); + WhitelistedDomains::::put(domains); + + Broadcasters::::set(self.broadcaster_domain, self.broadcaster); + + FunctionIds::::set(Some(self.function_ids)); + + let step_verification_key = BoundedVec::try_from(self.step_verification_key.clone()) + .expect("Step verification key should be valid at genesis."); + StepVerificationKey::::set(Some(step_verification_key)); + + let rotate_verification_key = + BoundedVec::try_from(self.rotate_verification_key.clone()) + .expect("Rotate verification key should be valid at genesis."); + RotateVerificationKey::::set(Some(rotate_verification_key)); + + SyncCommitteeHashes::::insert(self.period, self.sync_committee_hash); + + GenesisValidatorRoot::::set(self.genesis_validator_root); + + GenesisTimestamp::::set(self.genesis_time); + + SecondsPerSlot::::set(self.seconds_per_slot); + + SourceChainId::::set(self.source_chain_id); + } + } + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> Weight { + if let Some(failed_txs) = + MemoryTemporaryStorage::take::>>(FAILED_SEND_MSG_ID) + { + log::trace!(target: LOG_TARGET, "Failed Txs cleaned: {failed_txs:?}"); + } + + Weight::zero() + } + } + // TODO: Rename to FunctionInput + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + pub struct FunctionInputs { + pub updates: Vec, + pub finality_update: FinalityUpdate, + pub expected_current_slot: u64, + pub store: LightClientStore, + pub genesis_root: Bytes32, + pub forks: Forks, + pub execution_state_proof: ExecutionStateProof, + } + + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + pub struct ExecutionStateProof { + #[serde(rename = "executionStateRoot")] + pub execution_state_root: B256, + #[serde(rename = "executionStateBranch")] + pub execution_state_branch: Vec, + pub gindex: String, + } + /// Merkle branch index & depth for the execution state root proof. + pub const MERKLE_BRANCH_INDEX: usize = 802; + pub const MERKLE_BRANCH_DEPTH: usize = 9; + #[pallet::call] + impl Pallet + where + [u8; 32]: From, + { + /// The entrypoint for fulfilling a call. + /// function_id Function identifier. + /// inputs Function input. + #[pallet::call_index(0)] + #[pallet::weight(weight_helper::fulfill_call::< T > (* function_id))] // can't remove this + pub fn fulfill_call( + origin: OriginFor, + function_id: H256, + inputs: Vec, // TODO: Convert to fixed bytes + ) -> DispatchResultWithPostInfo { + let config = ConfigurationStorage::::get(); + let FunctionInputs { + updates, + finality_update, + expected_current_slot, + mut store, + genesis_root, + forks, + execution_state_proof, + } = serde_cbor::from_slice(&inputs).unwrap(); + + let mut is_valid = true; + let prev_head = store.finalized_header.slot; + + // 1. Apply sync committee updates, if any + for (index, update) in updates.iter().enumerate() { + is_valid = is_valid + && verify_update( + update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) + .is_ok(); + + apply_update(&mut store, update); + } + + // 2. Apply finality update + is_valid = is_valid + && verify_finality_update( + &finality_update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) + .is_ok(); + apply_finality_update(&mut store, &finality_update); + + // 3. Verify execution state root proof + let execution_state_branch_nodes: Vec = execution_state_proof + .execution_state_branch + .iter() + .map(|b| Node::try_from(b.as_ref()).unwrap()) + .collect(); + + is_valid = is_valid + && is_valid_merkle_branch( + &Node::try_from(execution_state_proof.execution_state_root.as_ref()).unwrap(), + execution_state_branch_nodes.iter(), + MERKLE_BRANCH_DEPTH, + MERKLE_BRANCH_INDEX, + &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), + ); + + let finalized_header_root: [u8; 32] = store + .finalized_header + .hash_tree_root() + .unwrap().as_ref().try_into().unwrap(); + let execution_state_root: [u8; 32] = execution_state_proof.execution_state_root.as_slice().try_into().unwrap(); + + let head = store.finalized_header.slot; + let sender: [u8; 32] = ensure_signed(origin)?.into(); + let updater = Updater::::get(); + + // ensure sender is preconfigured + ensure!(H256(sender) == updater, Error::::UpdaterMisMatch); + ensure!(is_valid, Error::::VerificationFailed); + + let mut function_called = false; + + // 4. Store step if needed + if prev_head != head { + let verified_output = VerifiedStepOutput { + finalized_header_root: H256::from(finalized_header_root), + execution_state_root: H256::from(execution_state_root), + finalized_slot: store.finalized_header.slot.as_u64(), + participation: store.current_max_active_participants.try_into().unwrap(), + }; + + if Self::set_slot_roots(verified_output)? { + Self::deposit_event(Event::HeadUpdated { + slot: verified_output.finalized_slot, + finalization_root: verified_output.finalized_header_root, + execution_state_root: verified_output.execution_state_root, + }); + function_called = true; + } + } + + // 5. Store rotate if needed + // a) Store current sync committee if stored one is empty (i.e. first time or after a range of updates) + let period = head.as_u64() + .checked_div(config.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; + let stored_current_sync_committee = SyncCommitteeHashes::::get(period); + if stored_current_sync_committee.is_zero() { + let current_sync_committee_hash: U256 = store + .current_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + Self::deposit_event(Event::SyncCommitteeUpdated { + period, + root: current_sync_committee_hash, + }); + function_called = true; + + Self::set_sync_committee_hash(period, current_sync_committee_hash)?; + } + + // b) Store next sync committee if available + if let Some(mut next_sync_committee) = store.next_sync_committee { + let next_period = period + 1; + let stored_next_sync_committee_hash = SyncCommitteeHashes::::get(next_period); + let next_sync_committee_hash: [u8; 32] = next_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + let next_sync_committee_hash = U256::from(next_sync_committee_hash); + + // If the next sync committee is already correct, we don't need to update it. + if stored_next_sync_committee_hash != next_sync_committee_hash.into() { + Self::deposit_event(Event::SyncCommitteeUpdated { + period: next_period, + root: next_sync_committee_hash, + }); + function_called = true; + + Self::set_sync_committee_hash(next_period, next_sync_committee_hash)?; + } + } + + if !function_called { + return Err(Error::::FunctionIdNotKnown.into()); + } + + Ok(().into()) + } + + /// Executes message if a valid proofs are provided for the supported message type, assets and domains. + #[pallet::call_index(1)] + #[pallet::weight({ + match addr_message.message { + Message::ArbitraryMessage(ref data) => T::WeightInfo::execute_arbitrary_message(data.len() as u32), + Message::FungibleToken {..} => T::WeightInfo::execute_fungible_token(), + } + })] + pub fn execute( + origin: OriginFor, + #[pallet::compact] slot: u64, + addr_message: AddressedMessage, + account_proof: ValidProof, + storage_proof: ValidProof, + ) -> DispatchResultWithPostInfo { + ensure_signed(origin)?; + let encoded_data = addr_message.clone().abi_encode(); + let message_root = H256(keccak_256(encoded_data.as_slice())); + + Self::check_preconditions(&addr_message, message_root)?; + + ensure!( !SourceChainFrozen::::get(addr_message.origin_domain), Error::::SourceChainFrozen ); - let root = ExecutionStateRoots::::get(slot); - let broadcaster = Broadcasters::::get(addr_message.origin_domain); + let root = ExecutionStateRoots::::get(slot); + let broadcaster = Broadcasters::::get(addr_message.origin_domain); - // extract contract address - let contract_broadcaster_address = H160::from_slice(broadcaster[..20].as_ref()); - let account_proof_vec = account_proof - .iter() - .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) - .collect(); + // extract contract address + let contract_broadcaster_address = H160::from_slice(broadcaster[..20].as_ref()); + let account_proof_vec = account_proof + .iter() + .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) + .collect(); - let storage_root = - get_storage_root(account_proof_vec, contract_broadcaster_address, root) - .map_err(|_| Error::::CannotGetStorageRoot)?; + let storage_root = + get_storage_root(account_proof_vec, contract_broadcaster_address, root) + .map_err(|_| Error::::CannotGetStorageRoot)?; - let message_id = Uint(U256::from(addr_message.id)); - let mm_idx = Uint(U256::from(T::MessageMappingStorageIndex::get())); - let slot_key = H256(keccak_256(ethabi::encode(&[message_id, mm_idx]).as_slice())); + let message_id = Uint(U256::from(addr_message.id)); + let mm_idx = Uint(U256::from(T::MessageMappingStorageIndex::get())); + let slot_key = H256(keccak_256(ethabi::encode(&[message_id, mm_idx]).as_slice())); - let storage_proof_vec = storage_proof - .iter() - .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) - .collect(); + let storage_proof_vec = storage_proof + .iter() + .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) + .collect(); - let slot_value = get_storage_value(slot_key, storage_root, storage_proof_vec) - .map_err(|_| Error::::CannotGetStorageValue)?; + let slot_value = get_storage_value(slot_key, storage_root, storage_proof_vec) + .map_err(|_| Error::::CannotGetStorageValue)?; - ensure!(slot_value == message_root, Error::::InvalidMessageHash); + ensure!(slot_value == message_root, Error::::InvalidMessageHash); - if let Message::FungibleToken { asset_id, amount } = &addr_message.message { - ensure!( + if let Message::FungibleToken { asset_id, amount } = &addr_message.message { + ensure!( SUPPORTED_ASSET_ID == *asset_id, Error::::AssetNotSupported ); - let destination_account_id = - T::AccountId::decode(&mut &addr_message.to.encode()[..]) - .map_err(|_| Error::::CannotDecodeDestinationAccountId)?; - - T::Currency::transfer( - &Self::account_id(), - &destination_account_id, - (*amount).saturated_into(), - ExistenceRequirement::AllowDeath, - )?; - } - - MessageStatus::::set(message_root, MessageStatusEnum::ExecutionSucceeded); - Self::deposit_event(Event::::MessageExecuted { - from: addr_message.from, - to: addr_message.to, - message_id: addr_message.id, - message_root, - }); - - Ok(().into()) - } - - /// source_chain_froze froze source chain and prevent messages to be executed. - // - // Test names: source_chain_froze_works_with_root(), source_chain_froze_does_not_work_with_non_root() - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::source_chain_froze())] - pub fn source_chain_froze( - origin: OriginFor, - #[pallet::compact] source_chain_id: u32, - frozen: bool, - ) -> DispatchResult { - ensure_root(origin)?; - - SourceChainFrozen::::set(source_chain_id, frozen); - Self::deposit_event(Event::::SourceChainFrozen { - source_chain_id, - frozen, - }); - - Ok(()) - } - - /// send_message sends a message from an origin chain to the destination chain. - // - // Test names: - // send_message_fungible_token_works(), send_message_fungible_token_doesnt_accept_data(), - // send_message_fungible_token_doesnt_accept_empty_asset_id(), send_message_fungible_token_doesnt_accept_empty_value(), - // send_message_arbitrary_message_works(), send_message_arbitrary_message_doesnt_accept_value(), - // send_message_arbitrary_message_doesnt_accept_asset_id(), send_message_arbitrary_message_doesnt_accept_empty_data() - #[pallet::call_index(3)] - #[pallet::weight({ - match message { - Message::ArbitraryMessage(ref data) => T::WeightInfo::send_message_arbitrary_message(data.len() as u32), - Message::FungibleToken{..} => T::WeightInfo::send_message_fungible_token(), - } - })] - pub fn send_message( - origin: OriginFor, - message: Message, - to: H256, - #[pallet::compact] domain: u32, - ) -> DispatchResultWithPostInfo { - let who = ensure_signed(origin)?; - - let dispatch = Self::do_send_message(who, message, to, domain); - if dispatch.is_err() { - let _ = MemoryTemporaryStorage::update::>, _>( - FAILED_SEND_MSG_ID.to_vec(), - |failed| { - let tx_idx_result = >::extrinsic_index(); - // this should never happen and we can just log warn - if tx_idx_result.is_none() { - log::warn!(target: LOG_TARGET, "Transaction index is none!"); - } - let tx_idx = tx_idx_result.unwrap_or_default(); - failed.push(tx_idx.into()); - log::trace!(target: LOG_TARGET, "Send Message failed txs: {failed:?}"); - }, - ); - } - - dispatch - } - - /// set_poseidon_hash sets poseidon hash of the sync committee for the particular period. - // - // Test names: set_poseidon_hash_works_with_root(), set_poseidon_hash_does_not_work_with_non_root() - #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::set_poseidon_hash())] - pub fn set_poseidon_hash( - origin: OriginFor, - #[pallet::compact] period: u64, - poseidon_hash: BoundedVec>, - ) -> DispatchResultWithPostInfo { - ensure_root(origin)?; - - // poseidon_hash.len() is always less than `u32::MAX` because it is bounded by BoundedVec - ensure!( + let destination_account_id = + T::AccountId::decode(&mut &addr_message.to.encode()[..]) + .map_err(|_| Error::::CannotDecodeDestinationAccountId)?; + + T::Currency::transfer( + &Self::account_id(), + &destination_account_id, + (*amount).saturated_into(), + ExistenceRequirement::AllowDeath, + )?; + } + + MessageStatus::::set(message_root, MessageStatusEnum::ExecutionSucceeded); + Self::deposit_event(Event::::MessageExecuted { + from: addr_message.from, + to: addr_message.to, + message_id: addr_message.id, + message_root, + }); + + Ok(().into()) + } + + /// source_chain_froze froze source chain and prevent messages to be executed. + // + // Test names: source_chain_froze_works_with_root(), source_chain_froze_does_not_work_with_non_root() + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::source_chain_froze())] + pub fn source_chain_froze( + origin: OriginFor, + #[pallet::compact] source_chain_id: u32, + frozen: bool, + ) -> DispatchResult { + ensure_root(origin)?; + + SourceChainFrozen::::set(source_chain_id, frozen); + Self::deposit_event(Event::::SourceChainFrozen { + source_chain_id, + frozen, + }); + + Ok(()) + } + + /// send_message sends a message from an origin chain to the destination chain. + // + // Test names: + // send_message_fungible_token_works(), send_message_fungible_token_doesnt_accept_data(), + // send_message_fungible_token_doesnt_accept_empty_asset_id(), send_message_fungible_token_doesnt_accept_empty_value(), + // send_message_arbitrary_message_works(), send_message_arbitrary_message_doesnt_accept_value(), + // send_message_arbitrary_message_doesnt_accept_asset_id(), send_message_arbitrary_message_doesnt_accept_empty_data() + #[pallet::call_index(3)] + #[pallet::weight({ + match message { + Message::ArbitraryMessage(ref data) => T::WeightInfo::send_message_arbitrary_message(data.len() as u32), + Message::FungibleToken{..} => T::WeightInfo::send_message_fungible_token(), + } + })] + pub fn send_message( + origin: OriginFor, + message: Message, + to: H256, + #[pallet::compact] domain: u32, + ) -> DispatchResultWithPostInfo { + let who = ensure_signed(origin)?; + + let dispatch = Self::do_send_message(who, message, to, domain); + if dispatch.is_err() { + let _ = MemoryTemporaryStorage::update::>, _>( + FAILED_SEND_MSG_ID.to_vec(), + |failed| { + let tx_idx_result = >::extrinsic_index(); + // this should never happen and we can just log warn + if tx_idx_result.is_none() { + log::warn!(target: LOG_TARGET, "Transaction index is none!"); + } + let tx_idx = tx_idx_result.unwrap_or_default(); + failed.push(tx_idx.into()); + log::trace!(target: LOG_TARGET, "Send Message failed txs: {failed:?}"); + }, + ); + } + + dispatch + } + + /// set_poseidon_hash sets poseidon hash of the sync committee for the particular period. + // + // Test names: set_poseidon_hash_works_with_root(), set_poseidon_hash_does_not_work_with_non_root() + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::set_poseidon_hash())] + pub fn set_poseidon_hash( + origin: OriginFor, + #[pallet::compact] period: u64, + poseidon_hash: BoundedVec>, + ) -> DispatchResultWithPostInfo { + ensure_root(origin)?; + + // poseidon_hash.len() is always less than `u32::MAX` because it is bounded by BoundedVec + ensure!( poseidon_hash.len() as u32 <= ROTATE_POSEIDON_OUTPUT_LENGTH, Error::::CannotParseOutputData ); - let hash = U256::from(poseidon_hash.to_vec().as_slice()); - - SyncCommitteePoseidons::::insert(period, hash); - Self::deposit_event(Event::SyncCommitteeUpdated { period, root: hash }); - Ok(().into()) - } - - /// set_broadcaster sets the broadcaster address of the message from the origin chain. - // - // Test names: set_broadcaster_works_with_root(), set_broadcaster_does_not_work_with_non_root() - #[pallet::call_index(5)] - #[pallet::weight(T::WeightInfo::set_broadcaster())] - pub fn set_broadcaster( - origin: OriginFor, - #[pallet::compact] broadcaster_domain: u32, - broadcaster: H256, - ) -> DispatchResult { - ensure_root(origin)?; - let old_bc = Broadcasters::::get(broadcaster_domain); - - Broadcasters::::set(broadcaster_domain, broadcaster); - - Self::deposit_event(Event::BroadcasterUpdated { - old: old_bc, - new: broadcaster, - domain: broadcaster_domain, - }); - - Ok(()) - } - - /// The set_whitelisted_domains function allows the root (administrator) to set the whitelisted domains. It is a - /// privileged function intended for administrative purposes, used to manage a list of permitted domains. - // - // Test names: set_whitelisted_domains_works_with_root(), set_whitelisted_domains_does_not_work_with_non_root() - #[pallet::call_index(6)] - #[pallet::weight(T::WeightInfo::set_whitelisted_domains())] - pub fn set_whitelisted_domains( - origin: OriginFor, - value: BoundedVec>, - ) -> DispatchResult { - ensure_root(origin)?; - WhitelistedDomains::::put(value); - - Self::deposit_event(Event::WhitelistedDomainsUpdated); - - Ok(()) - } - - /// The set_configuration function allows the root (administrator) to set the configuration. It is a - /// privileged function intended for administrative purposes, used to manage slots_per_period and finality_threshold values. - // - // Test names: set_configuration_works_with_root(), set_configuration_does_not_work_with_non_root() - #[pallet::call_index(7)] - #[pallet::weight(T::WeightInfo::set_configuration())] - pub fn set_configuration(origin: OriginFor, value: Configuration) -> DispatchResult { - ensure_root(origin)?; - ConfigurationStorage::::put(value); - - Self::deposit_event(Event::ConfigurationUpdated { - slots_per_period: value.slots_per_period, - finality_threshold: value.finality_threshold, - }); - - Ok(()) - } - - #[pallet::call_index(8)] - #[pallet::weight(T::WeightInfo::set_function_ids())] - pub fn set_function_ids( - origin: OriginFor, - value: Option<(H256, H256)>, - ) -> DispatchResult { - ensure_root(origin)?; - FunctionIds::::put(value); - - Self::deposit_event(Event::FunctionIdsUpdated { value }); - - Ok(()) - } - - #[pallet::call_index(9)] - #[pallet::weight(T::WeightInfo::set_step_verification_key())] - pub fn set_step_verification_key( - origin: OriginFor, - value: Option>>, - ) -> DispatchResult { - ensure_root(origin)?; - if let Some(vk) = value.clone() { - let _ = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - } - - StepVerificationKey::::put(value.clone()); - - Self::deposit_event(Event::StepVerificationKeyUpdated { value }); - - Ok(()) - } - - #[pallet::call_index(10)] - #[pallet::weight(T::WeightInfo::set_rotate_verification_key())] - pub fn set_rotate_verification_key( - origin: OriginFor, - value: Option>>, - ) -> DispatchResult { - ensure_root(origin)?; - if let Some(vk) = value.clone() { - let _ = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - } - - RotateVerificationKey::::put(value.clone()); - - Self::deposit_event(Event::RotateVerificationKeyUpdated { value }); - - Ok(()) - } - - #[pallet::call_index(11)] - #[pallet::weight(( - T::WeightInfo::failed_tx_index(0u32), - DispatchClass::Mandatory - ))] - pub fn failed_send_message_txs( - origin: OriginFor, - failed_txs: Vec>, - ) -> DispatchResult { - ensure_none(origin)?; - let local_failed_txs = - MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) - .unwrap_or_default(); - ensure!( + let hash = U256::from(poseidon_hash.to_vec().as_slice()); + + SyncCommitteePoseidons::::insert(period, hash); + Self::deposit_event(Event::SyncCommitteeUpdated { period, root: hash }); + Ok(().into()) + } + + /// set_broadcaster sets the broadcaster address of the message from the origin chain. + // + // Test names: set_broadcaster_works_with_root(), set_broadcaster_does_not_work_with_non_root() + #[pallet::call_index(5)] + #[pallet::weight(T::WeightInfo::set_broadcaster())] + pub fn set_broadcaster( + origin: OriginFor, + #[pallet::compact] broadcaster_domain: u32, + broadcaster: H256, + ) -> DispatchResult { + ensure_root(origin)?; + let old_bc = Broadcasters::::get(broadcaster_domain); + + Broadcasters::::set(broadcaster_domain, broadcaster); + + Self::deposit_event(Event::BroadcasterUpdated { + old: old_bc, + new: broadcaster, + domain: broadcaster_domain, + }); + + Ok(()) + } + + /// The set_whitelisted_domains function allows the root (administrator) to set the whitelisted domains. It is a + /// privileged function intended for administrative purposes, used to manage a list of permitted domains. + // + // Test names: set_whitelisted_domains_works_with_root(), set_whitelisted_domains_does_not_work_with_non_root() + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::set_whitelisted_domains())] + pub fn set_whitelisted_domains( + origin: OriginFor, + value: BoundedVec>, + ) -> DispatchResult { + ensure_root(origin)?; + WhitelistedDomains::::put(value); + + Self::deposit_event(Event::WhitelistedDomainsUpdated); + + Ok(()) + } + + /// The set_configuration function allows the root (administrator) to set the configuration. It is a + /// privileged function intended for administrative purposes, used to manage slots_per_period and finality_threshold values. + // + // Test names: set_configuration_works_with_root(), set_configuration_does_not_work_with_non_root() + #[pallet::call_index(7)] + #[pallet::weight(T::WeightInfo::set_configuration())] + pub fn set_configuration(origin: OriginFor, value: Configuration) -> DispatchResult { + ensure_root(origin)?; + ConfigurationStorage::::put(value); + + Self::deposit_event(Event::ConfigurationUpdated { + slots_per_period: value.slots_per_period, + finality_threshold: value.finality_threshold, + }); + + Ok(()) + } + + #[pallet::call_index(8)] + #[pallet::weight(T::WeightInfo::set_function_ids())] + pub fn set_function_ids( + origin: OriginFor, + value: Option<(H256, H256)>, + ) -> DispatchResult { + ensure_root(origin)?; + FunctionIds::::put(value); + + Self::deposit_event(Event::FunctionIdsUpdated { value }); + + Ok(()) + } + + #[pallet::call_index(9)] + #[pallet::weight(T::WeightInfo::set_step_verification_key())] + pub fn set_step_verification_key( + origin: OriginFor, + value: Option>>, + ) -> DispatchResult { + ensure_root(origin)?; + if let Some(vk) = value.clone() { + let _ = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + } + + StepVerificationKey::::put(value.clone()); + + Self::deposit_event(Event::StepVerificationKeyUpdated { value }); + + Ok(()) + } + + #[pallet::call_index(10)] + #[pallet::weight(T::WeightInfo::set_rotate_verification_key())] + pub fn set_rotate_verification_key( + origin: OriginFor, + value: Option>>, + ) -> DispatchResult { + ensure_root(origin)?; + if let Some(vk) = value.clone() { + let _ = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + } + + RotateVerificationKey::::put(value.clone()); + + Self::deposit_event(Event::RotateVerificationKeyUpdated { value }); + + Ok(()) + } + + #[pallet::call_index(11)] + #[pallet::weight(( + T::WeightInfo::failed_tx_index(0u32), + DispatchClass::Mandatory + ))] + pub fn failed_send_message_txs( + origin: OriginFor, + failed_txs: Vec>, + ) -> DispatchResult { + ensure_none(origin)?; + let local_failed_txs = + MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) + .unwrap_or_default(); + ensure!( local_failed_txs == failed_txs, Error::::InvalidFailedIndices ); - Ok(()) - } - - #[pallet::call_index(12)] - #[pallet::weight(T::WeightInfo::set_updater())] - pub fn set_updater(origin: OriginFor, updater: H256) -> DispatchResult { - ensure_root(origin)?; - let old = Updater::::get(); - Updater::::set(updater); - - Self::deposit_event(Event::::NewUpdater { old, new: updater }); - Ok(()) - } - } - - impl Pallet { - fn do_send_message( - who: T::AccountId, - message: Message, - to: H256, - domain: u32, - ) -> DispatchResultWithPostInfo { - // Ensure the domain is currently supported - ensure!( + Ok(()) + } + + #[pallet::call_index(12)] + #[pallet::weight(T::WeightInfo::set_updater())] + pub fn set_updater(origin: OriginFor, updater: H256) -> DispatchResult { + ensure_root(origin)?; + let old = Updater::::get(); + Updater::::set(updater); + + Self::deposit_event(Event::::NewUpdater { old, new: updater }); + Ok(()) + } + } + + impl Pallet { + fn do_send_message( + who: T::AccountId, + message: Message, + to: H256, + domain: u32, + ) -> DispatchResultWithPostInfo { + // Ensure the domain is currently supported + ensure!( Self::is_domain_valid(domain), Error::::DomainNotSupported ); - // Check MessageType and enforce the rules - let message_type = message.r#type(); - match message { - Message::FungibleToken { asset_id, amount } => { - ensure!( + // Check MessageType and enforce the rules + let message_type = message.r#type(); + match message { + Message::FungibleToken { asset_id, amount } => { + ensure!( SUPPORTED_ASSET_ID == asset_id, Error::::AssetNotSupported ); - ensure!( + ensure!( amount.saturated_into::() > 0, Error::::InvalidBridgeInputs ); - T::Currency::transfer( - &who, - &Self::account_id(), - amount.saturated_into(), - ExistenceRequirement::KeepAlive, - )?; - }, - Message::ArbitraryMessage(data) => { - ensure!(!data.is_empty(), Error::::InvalidBridgeInputs) - }, - }; - - let message_id = Self::fetch_curr_message_id().map_err(|e| e)?; - - Self::deposit_event(Event::MessageSubmitted { - from: who, - to, - message_type, - destination_domain: domain, - message_id, - }); - - Ok(().into()) - } - - fn fetch_curr_message_id() -> Result { - let number = >::block_number().saturated_into::(); - let tx_index_option = >::extrinsic_index(); - - match tx_index_option { - Some(tx_index) => Ok(tx_uid(number, tx_index)), - None => Err(Error::::CurrentMessageIdNotFound.into()), - } - } - - fn check_preconditions( - message: &AddressedMessage, - message_root: H256, - ) -> Result<(), DispatchError> { - let message_status = MessageStatus::::get(message_root); - // Message must not be executed - ensure!( + T::Currency::transfer( + &who, + &Self::account_id(), + amount.saturated_into(), + ExistenceRequirement::KeepAlive, + )?; + } + Message::ArbitraryMessage(data) => { + ensure!(!data.is_empty(), Error::::InvalidBridgeInputs) + } + }; + + let message_id = Self::fetch_curr_message_id().map_err(|e| e)?; + + Self::deposit_event(Event::MessageSubmitted { + from: who, + to, + message_type, + destination_domain: domain, + message_id, + }); + + Ok(().into()) + } + + fn fetch_curr_message_id() -> Result { + let number = >::block_number().saturated_into::(); + let tx_index_option = >::extrinsic_index(); + + match tx_index_option { + Some(tx_index) => Ok(tx_uid(number, tx_index)), + None => Err(Error::::CurrentMessageIdNotFound.into()), + } + } + + fn check_preconditions( + message: &AddressedMessage, + message_root: H256, + ) -> Result<(), DispatchError> { + let message_status = MessageStatus::::get(message_root); + // Message must not be executed + ensure!( message_status == MessageStatusEnum::NotExecuted, Error::::MessageAlreadyExecuted ); - ensure!( + ensure!( message.destination_domain == T::AvailDomain::get(), Error::::WrongDestinationChain ); - ensure!( + ensure!( WhitelistedDomains::::get().contains(&message.origin_domain), Error::::UnsupportedOriginChain ); - let source_chain = Broadcasters::::get(message.origin_domain); - ensure!( + let source_chain = Broadcasters::::get(message.origin_domain); + ensure!( source_chain != H256::zero(), Error::::BroadcasterSourceChainNotSet ); - Ok(()) - } - - /// The account ID of the bridge's pot. - pub fn account_id() -> T::AccountId { - T::PalletId::get().into_account_truncating() - } - - fn rotate_into( - finalized_slot: u64, - cfg: &Configuration, - verified_rotate_call: &VerifiedRotate, - rotate_function_id: H256, - ) -> Result { - let finalized_header_root = Headers::::get(finalized_slot); - ensure!( + Ok(()) + } + + /// The account ID of the bridge's pot. + pub fn account_id() -> T::AccountId { + T::PalletId::get().into_account_truncating() + } + + fn rotate_into( + finalized_slot: u64, + cfg: &Configuration, + verified_rotate_call: &VerifiedRotate, + rotate_function_id: H256, + ) -> Result { + let finalized_header_root = Headers::::get(finalized_slot); + ensure!( finalized_header_root != H256::zero(), Error::::HeaderRootNotSet ); - let input = ethabi::encode(&[Token::FixedBytes(finalized_header_root.0.to_vec())]); - let sync_committee_poseidon: U256 = - Self::verified_rotate_call(rotate_function_id, input, verified_rotate_call)?; + let input = ethabi::encode(&[Token::FixedBytes(finalized_header_root.0.to_vec())]); + let sync_committee_hash: U256 = + Self::verified_rotate_call(rotate_function_id, input, verified_rotate_call)?; - let period = finalized_slot - .checked_div(cfg.slots_per_period) - .ok_or(Error::::ConfigurationNotSet)?; - let next_period = period + 1; + let period = finalized_slot + .checked_div(cfg.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; + let next_period = period + 1; - Self::set_sync_committee_poseidon(next_period, sync_committee_poseidon)?; + Self::set_sync_committee_hash(next_period, sync_committee_hash)?; - Ok(next_period) - } + Ok(next_period) + } + + fn step_into( + attested_slot: u64, + cfg: &Configuration, + verified_step_call: &VerifiedStep, + step_function_id: H256, + ) -> Result { + let period = attested_slot + .checked_div(cfg.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; - fn step_into( - attested_slot: u64, - cfg: &Configuration, - verified_step_call: &VerifiedStep, - step_function_id: H256, - ) -> Result { - let period = attested_slot - .checked_div(cfg.slots_per_period) - .ok_or(Error::::ConfigurationNotSet)?; - - let sc_poseidon = SyncCommitteePoseidons::::get(period); - ensure!(sc_poseidon != U256::zero(), Error::::SyncCommitteeNotSet); - - let input = encode_packed(sc_poseidon, attested_slot); - let result = Self::verified_step_call(step_function_id, input, verified_step_call)?; - ensure!( + let sc_hash = SyncCommitteeHashes::::get(period); + ensure!(sc_hash != U256::zero(), Error::::SyncCommitteeNotSet); + + let input = encode_packed(sc_hash, attested_slot); + let result = Self::verified_step_call(step_function_id, input, verified_step_call)?; + ensure!( result.participation >= cfg.finality_threshold, Error::::NotEnoughParticipants ); - let head = Head::::get(); - ensure!(result.finalized_slot > head, Error::::SlotBehindHead); + let head = Head::::get(); + ensure!(result.finalized_slot > head, Error::::SlotBehindHead); - let updated = Self::set_slot_roots(result)?; + let updated = Self::set_slot_roots(result)?; - Ok(updated) - } + Ok(updated) + } - /// Sets the current slot for the chain the light client is reflecting. - /// checks is the roots exists for the slot already. If there is - /// an existing header but no conflict, do nothing. Avoids timestamp renewal DoS attacks. - fn set_slot_roots(step_output: VerifiedStepOutput) -> Result { - let header = Headers::::get(step_output.finalized_slot); - ensure!(header == H256::zero(), Error::::HeaderRootAlreadySet); + /// Sets the current slot for the chain the light client is reflecting. + /// checks is the roots exists for the slot already. If there is + /// an existing header but no conflict, do nothing. Avoids timestamp renewal DoS attacks. + fn set_slot_roots(step_output: VerifiedStepOutput) -> Result { + let header = Headers::::get(step_output.finalized_slot); + ensure!(header == H256::zero(), Error::::HeaderRootAlreadySet); - let execution_state_root = ExecutionStateRoots::::get(step_output.finalized_slot); - ensure!( + let execution_state_root = ExecutionStateRoots::::get(step_output.finalized_slot); + ensure!( execution_state_root == H256::zero(), Error::::StateRootAlreadySet ); - Head::::set(step_output.finalized_slot); - Headers::::insert( - step_output.finalized_slot, - step_output.finalized_header_root, - ); - ExecutionStateRoots::::insert( - step_output.finalized_slot, - step_output.execution_state_root, - ); - - Timestamps::::insert(step_output.finalized_slot, T::TimeProvider::now().as_secs()); - - Ok(true) - } - - /// Sets the sync committee poseidon for a given period. - fn set_sync_committee_poseidon(period: u64, poseidon: U256) -> Result<(), DispatchError> { - let sync_committee_poseidons = SyncCommitteePoseidons::::get(period); - ensure!( + Head::::set(step_output.finalized_slot); + Headers::::insert( + step_output.finalized_slot, + step_output.finalized_header_root, + ); + ExecutionStateRoots::::insert( + step_output.finalized_slot, + step_output.execution_state_root, + ); + + Timestamps::::insert(step_output.finalized_slot, T::TimeProvider::now().as_secs()); + + Ok(true) + } + + /// Sets the sync committee poseidon for a given period. + fn set_sync_committee_poseidon(period: u64, poseidon: U256) -> Result<(), DispatchError> { + let sync_committee_poseidons = SyncCommitteePoseidons::::get(period); + ensure!( sync_committee_poseidons == U256::zero(), Error::::SyncCommitteeAlreadySet ); - SyncCommitteePoseidons::::set(period, poseidon); - - Ok(()) - } - - /// get_verifier returns verifier based on the provided function id. - fn get_verifier( - function_id: H256, - step_function_id: H256, - rotate_function_id: H256, - ) -> Result> { - if function_id == step_function_id { - Self::get_step_verifier() - } else if function_id == rotate_function_id { - Self::get_rotate_verifier() - } else { - Err(Error::::FunctionIdNotKnown) - } - } - - fn get_step_verifier() -> Result> { - if let Some(vk) = StepVerificationKey::::get() { - let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - Ok(deserialized_vk) - } else { - Err(Error::::VerificationKeyIsNotSet) - } - } - - fn get_rotate_verifier() -> Result> { - if let Some(vk) = RotateVerificationKey::::get() { - let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - Ok(deserialized_vk) - } else { - Err(Error::::VerificationKeyIsNotSet) - } - } + SyncCommitteePoseidons::::set(period, poseidon); - fn verified_step_call( - function_id: H256, - input: ethabi::Bytes, - verified_call: &VerifiedStep, - ) -> Result { - let input_hash = sha2_256(input.as_slice()); - - if verified_call.verified_function_id == function_id - && verified_call.verified_input_hash == H256(input_hash) - { - let verified_output: VerifiedStepOutput = verified_call.verified_output; - Ok(verified_output) - } else { - Err(Error::::StepVerificationError.into()) - } - } + Ok(()) + } - fn verified_rotate_call( - function_id: H256, - input: ethabi::Bytes, - verified_call: &VerifiedRotate, - ) -> Result { - let input_hash = sha2_256(input.as_slice()); - - if verified_call.verified_function_id == function_id - && verified_call.verified_input_hash == H256(input_hash) - { - Ok(verified_call.sync_committee_poseidon) - } else { - Err(Error::::RotateVerificationError.into()) - } - } - - /// Check if the given domain is supported or not - fn is_domain_valid(domain: u32) -> bool { - WhitelistedDomains::::get().contains(&domain) - } + /// Sets the sync committee hash for a given period. + fn set_sync_committee_hash(period: u64, hash: U256) -> Result<(), DispatchError> { + let sync_committee_hashes = SyncCommitteeHashes::::get(period); + ensure!( + sync_committee_hashes == U256::zero(), + Error::::SyncCommitteeAlreadySet + ); - fn get_function_ids() -> Result<(H256, H256), DispatchError> { - if let Some(function_ids) = FunctionIds::::get() { - Ok(function_ids) - } else { - Err(Error::::FunctionIdsAreNotSet.into()) - } - } - } + SyncCommitteeHashes::::set(period, hash); + + Ok(()) + } + + /// get_verifier returns verifier based on the provided function id. + fn get_verifier( + function_id: H256, + step_function_id: H256, + rotate_function_id: H256, + ) -> Result> { + if function_id == step_function_id { + Self::get_step_verifier() + } else if function_id == rotate_function_id { + Self::get_rotate_verifier() + } else { + Err(Error::::FunctionIdNotKnown) + } + } + + fn get_step_verifier() -> Result> { + if let Some(vk) = StepVerificationKey::::get() { + let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + Ok(deserialized_vk) + } else { + Err(Error::::VerificationKeyIsNotSet) + } + } + + fn get_rotate_verifier() -> Result> { + if let Some(vk) = RotateVerificationKey::::get() { + let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + Ok(deserialized_vk) + } else { + Err(Error::::VerificationKeyIsNotSet) + } + } + + fn verified_step_call( + function_id: H256, + input: ethabi::Bytes, + verified_call: &VerifiedStep, + ) -> Result { + let input_hash = sha2_256(input.as_slice()); + + if verified_call.verified_function_id == function_id + && verified_call.verified_input_hash == H256(input_hash) + { + let verified_output: VerifiedStepOutput = verified_call.verified_output; + Ok(verified_output) + } else { + Err(Error::::StepVerificationError.into()) + } + } + + fn verified_rotate_call( + function_id: H256, + input: ethabi::Bytes, + verified_call: &VerifiedRotate, + ) -> Result { + let input_hash = sha2_256(input.as_slice()); + + if verified_call.verified_function_id == function_id + && verified_call.verified_input_hash == H256(input_hash) + { + Ok(verified_call.sync_committee_hash) + } else { + Err(Error::::RotateVerificationError.into()) + } + } + + /// Check if the given domain is supported or not + fn is_domain_valid(domain: u32) -> bool { + WhitelistedDomains::::get().contains(&domain) + } + + fn get_function_ids() -> Result<(H256, H256), DispatchError> { + if let Some(function_ids) = FunctionIds::::get() { + Ok(function_ids) + } else { + Err(Error::::FunctionIdsAreNotSet.into()) + } + } + } } impl ProvidePostInherent for Pallet where - [u8; 32]: From, + [u8; 32]: From, { - type Call = Call; - type Error = (); - - fn create_inherent(_: &avail_base::StorageMap) -> Option { - let failed_txs = MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) - .unwrap_or_default(); - - log::trace!(target: LOG_TARGET, "Create post inherent failed vector txs: {failed_txs:?}"); - Some(Call::failed_send_message_txs { failed_txs }) - } - - fn is_inherent(call: &Self::Call) -> bool { - matches!(call, Call::failed_send_message_txs { .. }) - } - - fn check_inherent(call: &Self::Call) -> Result<(), Self::Error> { - if let Call::failed_send_message_txs { failed_txs } = call { - let local_failed_txs = - MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) - .unwrap_or_default(); - ensure!(&local_failed_txs == failed_txs, ()); - } - Ok(()) - } + type Call = Call; + type Error = (); + + fn create_inherent(_: &avail_base::StorageMap) -> Option { + let failed_txs = MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) + .unwrap_or_default(); + + log::trace!(target: LOG_TARGET, "Create post inherent failed vector txs: {failed_txs:?}"); + Some(Call::failed_send_message_txs { failed_txs }) + } + + fn is_inherent(call: &Self::Call) -> bool { + matches!(call, Call::failed_send_message_txs { .. }) + } + + fn check_inherent(call: &Self::Call) -> Result<(), Self::Error> { + if let Call::failed_send_message_txs { failed_txs } = call { + let local_failed_txs = + MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) + .unwrap_or_default(); + ensure!(&local_failed_txs == failed_txs, ()); + } + Ok(()) + } } pub mod weight_helper { - use super::*; - - /// Weight for `dataAvailability::submit_data`. - pub fn fulfill_call(function_id: H256) -> (Weight, DispatchClass) { - if let Some((step_function_id, _)) = FunctionIds::::get() { - if step_function_id == function_id { - return (T::WeightInfo::fulfill_call_step(), DispatchClass::Normal); - } - } - (T::WeightInfo::fulfill_call_rotate(), DispatchClass::Normal) - } + use super::*; + + /// Weight for `dataAvailability::submit_data`. + pub fn fulfill_call(function_id: H256) -> (Weight, DispatchClass) { + if let Some((step_function_id, _)) = FunctionIds::::get() { + if step_function_id == function_id { + return (T::WeightInfo::fulfill_call_step(), DispatchClass::Normal); + } + } + (T::WeightInfo::fulfill_call_rotate(), DispatchClass::Normal) + } } diff --git a/pallets/vector/src/state.rs b/pallets/vector/src/state.rs index e9a80bf1d..f83e92271 100644 --- a/pallets/vector/src/state.rs +++ b/pallets/vector/src/state.rs @@ -16,68 +16,68 @@ use crate::verifier::{str_to_fq, VerificationError}; #[derive(Debug, PartialEq, Clone)] pub enum ParseError { - ParsingError, + ParsingError, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Encode, Decode, TypeInfo)] pub struct Groth16Proof { - pub a: Vec, - pub b: Vec>, - pub c: Vec, + pub a: Vec, + pub b: Vec>, + pub c: Vec, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct CircomProof { - #[serde(rename = "pi_a")] - pub pi_a: Vec, - #[serde(rename = "pi_b")] - pub pi_b: Vec>, - #[serde(rename = "pi_c")] - pub pi_c: Vec, - pub protocol: String, - pub curve: String, + #[serde(rename = "pi_a")] + pub pi_a: Vec, + #[serde(rename = "pi_b")] + pub pi_b: Vec>, + #[serde(rename = "pi_c")] + pub pi_c: Vec, + pub protocol: String, + pub curve: String, } impl CircomProof { - pub fn new(a: Vec, b: Vec>, c: Vec) -> Self { - CircomProof { - pi_a: a, - pi_b: b, - pi_c: c, - protocol: "groth16".to_string(), - curve: "bn128".to_string(), - } - } - - pub fn proof(self) -> Result, VerificationError> { - let a = G1Affine::new(str_to_fq(&self.pi_a[0])?, str_to_fq(&self.pi_a[1])?, false); - let b = G2Affine::new( - QuadExtField::new(str_to_fq(&self.pi_b[0][0])?, str_to_fq(&self.pi_b[0][1])?), - QuadExtField::new(str_to_fq(&self.pi_b[1][0])?, str_to_fq(&self.pi_b[1][1])?), - false, - ); - - let c = G1Affine::new(str_to_fq(&self.pi_c[0])?, str_to_fq(&self.pi_c[1])?, false); - Ok(Proof { a, b, c }) - } + pub fn new(a: Vec, b: Vec>, c: Vec) -> Self { + CircomProof { + pi_a: a, + pi_b: b, + pi_c: c, + protocol: "groth16".to_string(), + curve: "bn128".to_string(), + } + } + + pub fn proof(self) -> Result, VerificationError> { + let a = G1Affine::new(str_to_fq(&self.pi_a[0])?, str_to_fq(&self.pi_a[1])?, false); + let b = G2Affine::new( + QuadExtField::new(str_to_fq(&self.pi_b[0][0])?, str_to_fq(&self.pi_b[0][1])?), + QuadExtField::new(str_to_fq(&self.pi_b[1][0])?, str_to_fq(&self.pi_b[1][1])?), + false, + ); + + let c = G1Affine::new(str_to_fq(&self.pi_c[0])?, str_to_fq(&self.pi_c[1])?, false); + Ok(Proof { a, b, c }) + } } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct PublicSignals(pub Vec); impl PublicSignals { - pub fn from(public_signals: Vec) -> Self { - PublicSignals(public_signals) - } - - pub fn get(self) -> Result, VerificationError> { - let mut inputs: Vec = Vec::new(); - for input in self.0 { - let fr = Fr::from_str(&input).map_err(|_| VerificationError::InvalidVK)?; - inputs.push(fr); - } - Ok(inputs) - } + pub fn from(public_signals: Vec) -> Self { + PublicSignals(public_signals) + } + + pub fn get(self) -> Result, VerificationError> { + let mut inputs: Vec = Vec::new(); + for input in self.0 { + let fr = Fr::from_str(&input).map_err(|_| VerificationError::InvalidVK)?; + inputs.push(fr); + } + Ok(inputs) + } } /// Configuration struct that holds basic pallet configuration. @@ -85,54 +85,54 @@ impl PublicSignals { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Default)] pub struct Configuration { - #[codec(compact)] - pub slots_per_period: u64, - #[codec(compact)] - pub finality_threshold: u16, + #[codec(compact)] + pub slots_per_period: u64, + #[codec(compact)] + pub finality_threshold: u16, } /// VerifiedStep struct that holds verified params from a step call. #[derive(Default, Debug)] pub struct VerifiedStep { - pub verified_function_id: H256, - pub verified_input_hash: H256, - pub verified_output: VerifiedStepOutput, + pub verified_function_id: H256, + pub verified_input_hash: H256, + pub verified_output: VerifiedStepOutput, } impl VerifiedStep { - pub(crate) const fn new( - verified_function_id: H256, - verified_input_hash: H256, - verified_output: VerifiedStepOutput, - ) -> VerifiedStep { - VerifiedStep { - verified_function_id, - verified_input_hash, - verified_output, - } - } + pub(crate) const fn new( + verified_function_id: H256, + verified_input_hash: H256, + verified_output: VerifiedStepOutput, + ) -> VerifiedStep { + VerifiedStep { + verified_function_id, + verified_input_hash, + verified_output, + } + } } /// VerifiedRotate struct that holds verified params from a rotate call. #[derive(Default)] pub struct VerifiedRotate { - pub verified_function_id: H256, - pub verified_input_hash: H256, - pub sync_committee_poseidon: U256, + pub verified_function_id: H256, + pub verified_input_hash: H256, + pub sync_committee_hash: U256, } impl VerifiedRotate { - pub(crate) const fn new( - verified_function_id: H256, - verified_input_hash: H256, - sync_committee_poseidon: U256, - ) -> VerifiedRotate { - VerifiedRotate { - verified_function_id, - verified_input_hash, - sync_committee_poseidon, - } - } + pub(crate) const fn new( + verified_function_id: H256, + verified_input_hash: H256, + sync_committee_hash: U256, + ) -> VerifiedRotate { + VerifiedRotate { + verified_function_id, + verified_input_hash, + sync_committee_hash, + } + } } /// VerifiedStepOutput struct that holds a step output params. @@ -140,111 +140,111 @@ impl VerifiedRotate { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Default)] pub struct VerifiedStepOutput { - pub finalized_header_root: H256, - pub execution_state_root: H256, - pub finalized_slot: u64, - pub participation: u16, + pub finalized_header_root: H256, + pub execution_state_root: H256, + pub finalized_slot: u64, + pub participation: u16, } /// parse_rotate_output converts the output of the successful rotate verification call pub fn parse_rotate_output(output: Vec) -> Result { - // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec - if output.len() as u32 > ROTATE_POSEIDON_OUTPUT_LENGTH { - return Err(ParsingError); - } - Ok(U256::from_big_endian(output.as_slice())) + // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec + if output.len() as u32 > ROTATE_POSEIDON_OUTPUT_LENGTH { + return Err(ParsingError); + } + Ok(U256::from_big_endian(output.as_slice())) } /// parse_step_output parses the output of the successful step verification call pub fn parse_step_output(output: Vec) -> Result { - // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec - if output.len() as u32 != STEP_OUTPUT_LENGTH { - return Err(ParsingError); - } - - let mut finalized_header_root: [u8; 32] = [0; 32]; - let mut execution_state_root: [u8; 32] = [0; 32]; - let mut finalized_slot: [u8; 8] = [0; 8]; - let mut participation: [u8; 2] = [0; 2]; - - finalized_header_root[..32].copy_from_slice(&output[..32]); - execution_state_root[..32].copy_from_slice(&output[32..64]); - - finalized_slot[..8].copy_from_slice(&output[64..72]); - participation[..2].copy_from_slice(&output[72..74]); - - Ok(VerifiedStepOutput { - finalized_header_root: H256(finalized_header_root), - execution_state_root: H256(execution_state_root), - finalized_slot: u64::from_be_bytes(finalized_slot), - participation: u16::from_be_bytes(participation), - }) + // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec + if output.len() as u32 != STEP_OUTPUT_LENGTH { + return Err(ParsingError); + } + + let mut finalized_header_root: [u8; 32] = [0; 32]; + let mut execution_state_root: [u8; 32] = [0; 32]; + let mut finalized_slot: [u8; 8] = [0; 8]; + let mut participation: [u8; 2] = [0; 2]; + + finalized_header_root[..32].copy_from_slice(&output[..32]); + execution_state_root[..32].copy_from_slice(&output[32..64]); + + finalized_slot[..8].copy_from_slice(&output[64..72]); + participation[..2].copy_from_slice(&output[72..74]); + + Ok(VerifiedStepOutput { + finalized_header_root: H256(finalized_header_root), + execution_state_root: H256(execution_state_root), + finalized_slot: u64::from_be_bytes(finalized_slot), + participation: u16::from_be_bytes(participation), + }) } #[cfg(test)] mod tests { - use frame_support::{assert_err, assert_ok}; - use hex_literal::hex; - use sp_core::H256; + use frame_support::{assert_err, assert_ok}; + use hex_literal::hex; + use sp_core::H256; - use crate::state::ParseError::ParsingError; - use crate::state::{parse_rotate_output, parse_step_output}; + use crate::state::ParseError::ParsingError; + use crate::state::{parse_rotate_output, parse_step_output}; - #[test] - fn test_step_input() { - let input = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd"); - let pars = parse_step_output(input.to_vec()); + #[test] + fn test_step_input() { + let input = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd"); + let pars = parse_step_output(input.to_vec()); - assert_ok!(pars.clone()); - let parsed_data = pars.unwrap(); + assert_ok!(pars.clone()); + let parsed_data = pars.unwrap(); - assert_eq!(509, parsed_data.participation); - assert_eq!(7634848, parsed_data.finalized_slot); - assert_eq!( - H256(hex!( + assert_eq!(509, parsed_data.participation); + assert_eq!(7634848, parsed_data.finalized_slot); + assert_eq!( + H256(hex!( "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" )), - parsed_data.finalized_header_root - ); - assert_eq!( - H256(hex!( + parsed_data.finalized_header_root + ); + assert_eq!( + H256(hex!( "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" )), - parsed_data.execution_state_root - ); - } - - #[test] - fn test_parse_step_output_wrong_length() { - let input_less_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa01f"); - let pars = parse_step_output(input_less_then_expected.to_vec()); - - assert_err!(pars, ParsingError); - - let input_more_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b900000000000747fa001fdd"); - let pars = parse_step_output(input_more_then_expected.to_vec()); - - assert_err!(pars, ParsingError); - } - - #[test] - fn test_rotate_input() { - let input = hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4ed"); - let result = parse_rotate_output(input.to_vec()); - assert_ok!(result.clone()); - let poseidon_hash = result.unwrap(); - - assert_eq!( - "54093540030416808909802883566252424299549864556922470137474442232175269827821", - poseidon_hash.to_string() - ); - } - - #[test] - fn test_rotate_parse_wrong_length() { - let input_more_then_expected = - hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4edca"); - let result = parse_rotate_output(input_more_then_expected.to_vec()); - assert_err!(result, ParsingError); - } + parsed_data.execution_state_root + ); + } + + #[test] + fn test_parse_step_output_wrong_length() { + let input_less_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa01f"); + let pars = parse_step_output(input_less_then_expected.to_vec()); + + assert_err!(pars, ParsingError); + + let input_more_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b900000000000747fa001fdd"); + let pars = parse_step_output(input_more_then_expected.to_vec()); + + assert_err!(pars, ParsingError); + } + + #[test] + fn test_rotate_input() { + let input = hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4ed"); + let result = parse_rotate_output(input.to_vec()); + assert_ok!(result.clone()); + let poseidon_hash = result.unwrap(); + + assert_eq!( + "54093540030416808909802883566252424299549864556922470137474442232175269827821", + poseidon_hash.to_string() + ); + } + + #[test] + fn test_rotate_parse_wrong_length() { + let input_more_then_expected = + hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4edca"); + let result = parse_rotate_output(input_more_then_expected.to_vec()); + assert_err!(result, ParsingError); + } } diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 90caa19cc..49f48544b 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -1,16 +1,16 @@ use crate::{mock::{ - new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, - ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, -}, state::Configuration, storage_utils::MessageStatusEnum, Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, ValidProof, WhitelistedDomains, FunctionInputs}; + new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, + ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, +}, state::Configuration, storage_utils::MessageStatusEnum, Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, ValidProof, WhitelistedDomains, FunctionInputs, SyncCommitteeHashes}; use std::fs::File; use std::fs; use avail_core::data_proof::Message::FungibleToken; use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; use frame_support::{ - assert_err, assert_ok, - traits::{fungible::Inspect, DefensiveTruncateFrom}, - BoundedVec, + assert_err, assert_ok, + traits::{fungible::Inspect, DefensiveTruncateFrom}, + BoundedVec, }; use frame_system::RawOrigin; use hex_literal::hex; @@ -19,46 +19,46 @@ use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; use sp_runtime::{testing::H256, traits::BadOrigin}; const TEST_SENDER_VEC: [u8; 32] = - hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); + hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); fn get_valid_step_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") - .to_vec(), - ) + BoundedVec::truncate_from( + hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") + .to_vec(), + ) } fn get_valid_step_output() -> FunctionOutput { - BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) + BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) } fn get_valid_step_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) + BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) } fn get_valid_rotate_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), - ) + BoundedVec::truncate_from( + hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), + ) } fn get_valid_rotate_output() -> FunctionOutput { - BoundedVec::truncate_from( - hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), - ) + BoundedVec::truncate_from( + hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), + ) } fn get_valid_rotate_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) + BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) } fn get_invalid_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) + BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) } fn get_valid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(vec![ BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), @@ -71,30 +71,30 @@ fn get_valid_account_proof() -> ValidProof { } fn get_valid_trimmed_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), - BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), - BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), + BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), + BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), + ]) } fn get_valid_trimmed_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), - BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), - BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), + BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), + BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), + ]) } fn get_invalid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(vec![ BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), @@ -107,14 +107,14 @@ fn get_invalid_account_proof() -> ValidProof { } fn get_valid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), ]) } fn get_invalid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), @@ -122,7 +122,7 @@ fn get_invalid_storage_proof() -> ValidProof { } fn get_valid_amb_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(vec![ BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), @@ -135,7 +135,7 @@ fn get_valid_amb_account_proof() -> ValidProof { } fn get_valid_amb_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(vec![ BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), @@ -143,34 +143,34 @@ fn get_valid_amb_storage_proof() -> ValidProof { } pub fn get_valid_message() -> AddressedMessage { - let asset_id = H256::zero(); - let amount = 1_000_000_000_000_000_000u128; - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); + let asset_id = H256::zero(); + let amount = 1_000_000_000_000_000_000u128; + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); - AddressedMessage { - message: Message::FungibleToken { asset_id, amount }, - from: from.into(), - to: to.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } + AddressedMessage { + message: Message::FungibleToken { asset_id, amount }, + from: from.into(), + to: to.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } } fn get_valid_amb_message() -> AddressedMessage { - let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); + let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); - AddressedMessage { - message: Message::ArbitraryMessage(data), - from: from.into(), - to: recipient.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } + AddressedMessage { + message: Message::ArbitraryMessage(data), + from: from.into(), + to: recipient.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } } // // #[test] @@ -597,63 +597,56 @@ fn get_valid_amb_message() -> AddressedMessage { // #[test] fn test_fulfill_step_call() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); - - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - inputs.clone(), - ); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + inputs.clone(), + ); - assert_ok!(result); + assert_ok!(result); - let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); + let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); - let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); - // ensure that event is fired - let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { - slot: finalized_slot, - finalization_root: H256(hex!( + let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); + // ensure that event is fired + let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { + slot: finalized_slot, + finalization_root: H256(hex!( "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" )), - execution_state_root: H256(hex!( + execution_state_root: H256(hex!( "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" )), - }); + }); + + let header = Headers::::get(finalized_slot); + let head = Head::::get(); + let ex_state_root = ExecutionStateRoots::::get(finalized_slot); - let header = Headers::::get(finalized_slot); - let head = Head::::get(); - let ex_state_root = ExecutionStateRoots::::get(finalized_slot); - assert_eq!( - header, - H256(hex!( - "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" + assert_eq!( + header, + H256(hex!( + "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" )) - ); - assert_eq!( - ex_state_root, - H256(hex!( + ); + assert_eq!( + ex_state_root, + H256(hex!( "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" )) - ); - assert_eq!(head, finalized_slot); - assert_eq!(expected_event, System::events()[0].event); - }); + ); + assert_eq!(head, finalized_slot); + assert_eq!(expected_event, System::events()[0].event); + }); } // // #[test] @@ -723,44 +716,39 @@ fn test_fulfill_step_call() { // #[test] fn test_fulfill_rotate_call() { - new_test_ext().execute_with(|| { - Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); - let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - // get_valid_rotate_input(), - // get_valid_rotate_output(), - // get_valid_rotate_proof(), - inputs, - // slot, - ); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + inputs, + ); - assert_ok!(result); - // ensure that event is fired - let expected_poseidon = U256::from_dec_str( - "78004113044439342907882478475913997887515213797155324584820998418219758944903", - ) - .unwrap(); + assert_ok!(result); + // ensure that event is fired + let expected_hash = U256::from_dec_str( + "78004113044439342907882478475913997887515213797155324584820998418219758944903", + ) + .unwrap(); - let current_period = 1178; - let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { - period: current_period + 1, - root: expected_poseidon, - }); + let current_period = 1178; + let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { + period: current_period + 1, + root: expected_hash, + }); - let poseidon = SyncCommitteePoseidons::::get(current_period + 1); + let poseidon = SyncCommitteeHashes::::get(current_period + 1); - assert_eq!(expected_event, System::events()[1].event); - assert_eq!(poseidon, expected_poseidon); - }); + assert_eq!(expected_event, System::events()[1].event); + assert_eq!(poseidon, expected_hash); + }); } // // #[test] From 6eba6ad171c6aede5c5ff7264dc36ccb60cfa9bd Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 6 Aug 2024 11:38:38 -0700 Subject: [PATCH 22/53] switch to SyncCommitteeHashes --- avail-rust/src/api_dev.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/avail-rust/src/api_dev.rs b/avail-rust/src/api_dev.rs index 75bf46a31..e5c3126b3 100644 --- a/avail-rust/src/api_dev.rs +++ b/avail-rust/src/api_dev.rs @@ -24012,6 +24012,11 @@ pub mod api { pub type SyncCommitteePoseidons = runtime_types::primitive_types::U256; pub type Param0 = ::core::primitive::u64; } + pub mod sync_committee_hashes{ + use super::runtime_types; + pub type SyncCommitteeHashes = runtime_types::primitive_types::U256; + pub type Param0 = ::core::primitive::u64; + } pub mod configuration_storage { use super::runtime_types; pub type ConfigurationStorage = From 4a1b617dff868d0022cbbcb172a948bff94dd716 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 6 Aug 2024 12:26:42 -0700 Subject: [PATCH 23/53] update another test to work with helios --- pallets/vector/src/lib.rs | 3 + pallets/vector/src/tests.rs | 110 ++++++++++++++++-------------------- 2 files changed, 53 insertions(+), 60 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index ca7bab374..9907df722 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -528,6 +528,9 @@ pub mod pallet { participation: store.current_max_active_participants.try_into().unwrap(), }; + let head = Head::::get(); + ensure!(verified_output.finalized_slot > head, Error::::SlotBehindHead); + if Self::set_slot_roots(verified_output)? { Self::deposit_event(Event::HeadUpdated { slot: verified_output.finalized_slot, diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 49f48544b..439fc7028 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -648,72 +648,62 @@ fn test_fulfill_step_call() { assert_eq!(expected_event, System::events()[0].event); }); } -// + // #[test] // fn test_fulfill_step_call_wrong_poseidon() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); +// new_test_ext().execute_with(|| { +// Updater::::set(H256(TEST_SENDER_VEC)); // -// // current poseidon is not the same as the one in the valid proof -// SyncCommitteePoseidons::::insert( -// 931, -// U256::from(hex!( +// // current poseidon is not the same as the one in the valid proof +// SyncCommitteePoseidons::::insert( +// 931, +// U256::from(hex!( // "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332da" // )), -// ); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::StepVerificationError); -// }); -// } -// -// #[test] -// fn test_fulfill_step_call_slot_behind_head() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// SyncCommitteePoseidons::::insert( -// 931, -// U256::from(hex!( -// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" -// )), -// ); -// -// // move head forward -// Head::::set(8634942); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::SlotBehindHead); -// }); +// ); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 461, +// }); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// STEP_FUNCTION_ID, +// get_valid_step_input(), +// get_valid_step_output(), +// get_valid_step_proof(), +// slot, +// ); +// +// assert_err!(result, Error::::StepVerificationError); +// }); // } -// + +#[test] +fn test_fulfill_step_call_slot_behind_head() { + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); + + // move head forward + Head::::set(9678877); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + inputs, + ); + + assert_err!(result, Error::::SlotBehindHead); + }); +} + #[test] fn test_fulfill_rotate_call() { new_test_ext().execute_with(|| { From 4a54409b013bc0e2779d96a3801dd67757d4d03b Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 6 Aug 2024 13:20:29 -0700 Subject: [PATCH 24/53] update tests --- pallets/vector/src/tests.rs | 62 ++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 439fc7028..4040090d4 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -740,38 +740,36 @@ fn test_fulfill_rotate_call() { assert_eq!(poseidon, expected_hash); }); } -// -// #[test] -// fn test_fulfill_rotate_call_wrong_header() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 342, -// }); -// // set current wrong header for valid rotate call -// Headers::::set( -// slot, -// H256(hex!( -// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" -// )), -// ); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// ROTATE_FUNCTION_ID, -// get_valid_rotate_input(), -// get_valid_rotate_output(), -// get_valid_rotate_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::RotateVerificationError); -// }); -// } -// + +#[test] +fn test_fulfill_rotate_call_wrong_header() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + // set current wrong header for valid rotate call + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" + )), + ); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + inputs, + ); + + assert_err!(result, Error::::RotateVerificationError); + }); +} + // #[test] // fn test_fulfill_call_function_ids_not_set() { // new_test_ext().execute_with(|| { From fc557ba121ea1ac4b3f735845f4fda5fdf7cc53c Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 9 Aug 2024 14:59:02 -0400 Subject: [PATCH 25/53] update tests --- pallets/vector/src/tests.rs | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 4040090d4..723151ee2 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -741,34 +741,34 @@ fn test_fulfill_rotate_call() { }); } -#[test] -fn test_fulfill_rotate_call_wrong_header() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - // set current wrong header for valid rotate call - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" - )), - ); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - inputs, - ); - - assert_err!(result, Error::::RotateVerificationError); - }); -} +// #[test] +// fn test_fulfill_rotate_call_wrong_header() { +// new_test_ext().execute_with(|| { +// let slot = 7634942; +// Updater::::set(H256(TEST_SENDER_VEC)); +// let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); +// +// ConfigurationStorage::::set(Configuration { +// slots_per_period: 8192, +// finality_threshold: 342, +// }); +// // set current wrong header for valid rotate call +// Headers::::set( +// slot, +// H256(hex!( +// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" +// )), +// ); +// +// let result = Bridge::fulfill_call( +// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), +// ROTATE_FUNCTION_ID, +// inputs, +// ); +// +// assert_err!(result, Error::::RotateVerificationError); +// }); +// } // #[test] // fn test_fulfill_call_function_ids_not_set() { From ad404d34559cd5e63c33cb6c22b6e2f0686e93d6 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 9 Aug 2024 15:05:14 -0400 Subject: [PATCH 26/53] remove .idea --- .gitignore | 1 + .idea/.gitignore | 5 ---- .idea/AVAIL_GOOD.iml | 26 -------------------- .idea/inspectionProfiles/Project_Default.xml | 6 ----- .idea/modules.xml | 8 ------ .idea/vcs.xml | 6 ----- 6 files changed, 1 insertion(+), 51 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/AVAIL_GOOD.iml delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore index c7073e8e3..cc1e9431d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ dist tests/rust_scripts/target .vscode output +.idea \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index b58b603fe..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/AVAIL_GOOD.iml b/.idea/AVAIL_GOOD.iml deleted file mode 100644 index 523a20570..000000000 --- a/.idea/AVAIL_GOOD.iml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 03d9549ea..000000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 22cb98442..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfb..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 28b2c2c26aaca457076722f7388223c5f7ceb371 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Fri, 9 Aug 2024 15:11:08 -0400 Subject: [PATCH 27/53] fix indebts --- pallets/vector/src/lib.rs | 2204 +++++++++++++++++------------------ pallets/vector/src/state.rs | 330 +++--- pallets/vector/src/tests.rs | 364 +++--- 3 files changed, 1450 insertions(+), 1448 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 9907df722..9a4bfd021 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -11,9 +11,9 @@ use ssz_rs::prelude::*; use codec::Compact; use frame_support::{ - pallet_prelude::*, - traits::{Currency, ExistenceRequirement, UnixTime}, - PalletId, + pallet_prelude::*, + traits::{Currency, ExistenceRequirement, UnixTime}, + PalletId, }; use sp_core::H256; use sp_runtime::SaturatedConversion; @@ -50,1191 +50,1191 @@ pub type BalanceOf = #[frame_support::pallet] pub mod pallet { - use consensus_core::get_bits; - use ethabi::Token; - use ethabi::Token::Uint; - use frame_support::dispatch::GetDispatchInfo; - use frame_support::traits::{LockableCurrency, UnfilteredDispatchable}; - use frame_support::{pallet_prelude::ValueQuery, DefaultNoBound}; - use frame_system::pallet_prelude::*; - use primitive_types::H160; - use primitive_types::{H256, U256}; - use sp_io::hashing::keccak_256; - use sp_io::hashing::sha2_256; - use sp_runtime::traits::AccountIdConversion; - pub use weights::WeightInfo; - - use crate::state::Configuration; - use crate::state::{ - parse_rotate_output, parse_step_output, VerifiedRotate, VerifiedStep, VerifiedStepOutput, - }; - use crate::storage_utils::{get_storage_root, get_storage_value}; - use crate::verifier::encode_packed; - - use super::*; - - #[pallet::error] - pub enum Error { - VerificationError, - NotEnoughParticipants, - ConfigurationNotSet, - SlotBehindHead, - VerificationKeyIsNotSet, - MalformedVerificationKey, - FunctionIdNotKnown, - StepVerificationError, - RotateVerificationError, - HeaderRootNotSet, - VerificationFailed, - HeaderRootAlreadySet, - StateRootAlreadySet, - SyncCommitteeAlreadySet, - SyncCommitteeNotSet, - MessageAlreadyExecuted, - WrongDestinationChain, - UnsupportedOriginChain, - BroadcasterSourceChainNotSet, - SourceChainFrozen, - CannotGetStorageRoot, - CannotGetStorageValue, - InvalidMessageHash, - CannotDecodeData, - CannotDecodeDestinationAccountId, - /// Given AssetId is not supported - AssetNotSupported, - /// Given inputs for the selected MessageType are invalid - InvalidBridgeInputs, - /// Domain is not supported - DomainNotSupported, - /// Function ids (step / rotate) are not set - FunctionIdsAreNotSet, - /// Inherent call outside of block execution context. - BadContext, - /// Invalid FailedIndices - InvalidFailedIndices, - /// Invalid updater - UpdaterMisMatch, - /// Proof output parsing error - CannotParseOutputData, - /// Cannot get current message id - CurrentMessageIdNotFound, - } - - #[pallet::event] - #[pallet::generate_deposit(pub (super) fn deposit_event)] - pub enum Event { - /// Emit event once the head is updated. - HeadUpdated { - slot: u64, - finalization_root: H256, - execution_state_root: H256, - }, - /// Emit event once the sync committee updates. - SyncCommitteeUpdated { period: u64, root: U256 }, - /// Emit when new updater is set. - BroadcasterUpdated { old: H256, new: H256, domain: u32 }, - /// Emit when message gets executed. - MessageExecuted { - from: H256, - to: H256, - message_id: u64, - message_root: H256, - }, - /// Emit if source chain gets frozen. - SourceChainFrozen { source_chain_id: u32, frozen: bool }, - /// Emit when message is submitted. - MessageSubmitted { - from: T::AccountId, - to: H256, - message_type: MessageType, - destination_domain: u32, - message_id: u64, - }, - /// Emit whitelisted domains that are updated. - WhitelistedDomainsUpdated, - /// Emit when configuration is updated. - ConfigurationUpdated { - slots_per_period: u64, - finality_threshold: u16, - }, - /// Emit function Ids that are updated. - FunctionIdsUpdated { value: Option<(H256, H256)> }, - /// Emit updated step verification key. - StepVerificationKeyUpdated { - value: Option>>, - }, - /// Emit updated rotate verification key. - RotateVerificationKeyUpdated { - value: Option>>, - }, - /// Emit new updater. - NewUpdater { old: H256, new: H256 }, - } - - /// Storage for a head updates. - #[pallet::storage] - #[pallet::getter(fn head)] - pub type Head = StorageValue<_, u64, ValueQuery>; - - /// Maps from a slot to a block header root. - #[pallet::storage] - #[pallet::getter(fn headers)] - pub type Headers = StorageMap<_, Identity, u64, H256, ValueQuery>; - - /// Maps slot to the timestamp of when the headers mapping was updated with slot as a key - #[pallet::storage] - pub type Timestamps = StorageMap<_, Identity, u64, u64, ValueQuery>; - - /// Maps from a slot to the current finalized ethereum execution state root. - #[pallet::storage] - pub type ExecutionStateRoots = StorageMap<_, Identity, u64, H256, ValueQuery>; - - /// DEPRECATED: Use SyncCommitteeHashes instead. - /// Maps from a period to the poseidon commitment for the sync committee. - #[pallet::storage] - #[pallet::getter(fn sync_committee_poseidons)] - pub type SyncCommitteePoseidons = StorageMap<_, Identity, u64, U256, ValueQuery>; - - /// Maps from a period to the Sha256 commitment for the sync committee. - #[pallet::storage] - #[pallet::getter(fn sync_committee_hashes)] - pub type SyncCommitteeHashes = StorageMap<_, Identity, u64, U256, ValueQuery>; - - /// Storage for a config of finality threshold and slots per period. - #[pallet::storage] - pub type ConfigurationStorage = StorageValue<_, Configuration, ValueQuery>; - - /// Maps status of the message to the message root. - #[pallet::storage] - pub type MessageStatus = StorageMap<_, Identity, H256, MessageStatusEnum, ValueQuery>; - - /// Mapping between source chainId and the address of the broadcaster on that chain. - #[pallet::storage] - pub type Broadcasters = StorageMap<_, Identity, u32, H256, ValueQuery>; - - /// Flags source chain to be frozen. - #[pallet::storage] - pub type SourceChainFrozen = StorageMap<_, Identity, u32, bool, ValueQuery>; - - /// List of permitted domains. - #[pallet::storage] - pub type WhitelistedDomains = StorageValue<_, BoundedVec>, ValueQuery>; - - /// The storage for the step function identifier and the rotate function identifier. - /// Step function id is used to distinguish step-related functionality within the fulfill_call function. - /// Rotate function id is used to handle rotate-related functionality within the fulfill_call function. - /// When the provided function_id matches the step/rotate function identifier, specific logic related to step/rotate functions is executed. - /// The order of storage is (step_function_id, rotate_function_id) - #[pallet::storage] - #[pallet::getter(fn function_ids)] - pub type FunctionIds = StorageValue<_, Option<(H256, H256)>, ValueQuery>; - - /// Step verification key storage. - #[pallet::storage] - #[pallet::getter(fn step_verification_key)] - pub type StepVerificationKey = - StorageValue<_, Option>>, ValueQuery>; - - /// Rotate verification key storage. - #[pallet::storage] - #[pallet::getter(fn rotate_verification_key)] - pub type RotateVerificationKey = - StorageValue<_, Option>>, ValueQuery>; - - /// Genesis validator root, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn genesis_validator_root)] - pub type GenesisValidatorRoot = StorageValue<_, H256, ValueQuery>; - - /// Genesis timestamp, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn genesis_timestamp)] - pub type GenesisTimestamp = StorageValue<_, u64, ValueQuery>; - - /// Seconds per slot, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn seconds_per_slot)] - pub type SecondsPerSlot = StorageValue<_, u64, ValueQuery>; - - /// Source chain id, used to check initialization. - #[pallet::storage] - #[pallet::getter(fn source_chain_id)] - pub type SourceChainId = StorageValue<_, u64, ValueQuery>; - - /// Updater that can submit updates - #[pallet::storage] - #[pallet::getter(fn updater)] - pub type Updater = StorageValue<_, H256, ValueQuery>; - - /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. - pub mod config_preludes { - use super::*; - use frame_support::derive_impl; - use frame_support::parameter_types; - use frame_support::traits::ConstU64; - - parameter_types! { + use consensus_core::get_bits; + use ethabi::Token; + use ethabi::Token::Uint; + use frame_support::dispatch::GetDispatchInfo; + use frame_support::traits::{LockableCurrency, UnfilteredDispatchable}; + use frame_support::{pallet_prelude::ValueQuery, DefaultNoBound}; + use frame_system::pallet_prelude::*; + use primitive_types::H160; + use primitive_types::{H256, U256}; + use sp_io::hashing::keccak_256; + use sp_io::hashing::sha2_256; + use sp_runtime::traits::AccountIdConversion; + pub use weights::WeightInfo; + + use crate::state::Configuration; + use crate::state::{ + parse_rotate_output, parse_step_output, VerifiedRotate, VerifiedStep, VerifiedStepOutput, + }; + use crate::storage_utils::{get_storage_root, get_storage_value}; + use crate::verifier::encode_packed; + + use super::*; + + #[pallet::error] + pub enum Error { + VerificationError, + NotEnoughParticipants, + ConfigurationNotSet, + SlotBehindHead, + VerificationKeyIsNotSet, + MalformedVerificationKey, + FunctionIdNotKnown, + StepVerificationError, + RotateVerificationError, + HeaderRootNotSet, + VerificationFailed, + HeaderRootAlreadySet, + StateRootAlreadySet, + SyncCommitteeAlreadySet, + SyncCommitteeNotSet, + MessageAlreadyExecuted, + WrongDestinationChain, + UnsupportedOriginChain, + BroadcasterSourceChainNotSet, + SourceChainFrozen, + CannotGetStorageRoot, + CannotGetStorageValue, + InvalidMessageHash, + CannotDecodeData, + CannotDecodeDestinationAccountId, + /// Given AssetId is not supported + AssetNotSupported, + /// Given inputs for the selected MessageType are invalid + InvalidBridgeInputs, + /// Domain is not supported + DomainNotSupported, + /// Function ids (step / rotate) are not set + FunctionIdsAreNotSet, + /// Inherent call outside of block execution context. + BadContext, + /// Invalid FailedIndices + InvalidFailedIndices, + /// Invalid updater + UpdaterMisMatch, + /// Proof output parsing error + CannotParseOutputData, + /// Cannot get current message id + CurrentMessageIdNotFound, + } + + #[pallet::event] + #[pallet::generate_deposit(pub (super) fn deposit_event)] + pub enum Event { + /// Emit event once the head is updated. + HeadUpdated { + slot: u64, + finalization_root: H256, + execution_state_root: H256, + }, + /// Emit event once the sync committee updates. + SyncCommitteeUpdated { period: u64, root: U256 }, + /// Emit when new updater is set. + BroadcasterUpdated { old: H256, new: H256, domain: u32 }, + /// Emit when message gets executed. + MessageExecuted { + from: H256, + to: H256, + message_id: u64, + message_root: H256, + }, + /// Emit if source chain gets frozen. + SourceChainFrozen { source_chain_id: u32, frozen: bool }, + /// Emit when message is submitted. + MessageSubmitted { + from: T::AccountId, + to: H256, + message_type: MessageType, + destination_domain: u32, + message_id: u64, + }, + /// Emit whitelisted domains that are updated. + WhitelistedDomainsUpdated, + /// Emit when configuration is updated. + ConfigurationUpdated { + slots_per_period: u64, + finality_threshold: u16, + }, + /// Emit function Ids that are updated. + FunctionIdsUpdated { value: Option<(H256, H256)> }, + /// Emit updated step verification key. + StepVerificationKeyUpdated { + value: Option>>, + }, + /// Emit updated rotate verification key. + RotateVerificationKeyUpdated { + value: Option>>, + }, + /// Emit new updater. + NewUpdater { old: H256, new: H256 }, + } + + /// Storage for a head updates. + #[pallet::storage] + #[pallet::getter(fn head)] + pub type Head = StorageValue<_, u64, ValueQuery>; + + /// Maps from a slot to a block header root. + #[pallet::storage] + #[pallet::getter(fn headers)] + pub type Headers = StorageMap<_, Identity, u64, H256, ValueQuery>; + + /// Maps slot to the timestamp of when the headers mapping was updated with slot as a key + #[pallet::storage] + pub type Timestamps = StorageMap<_, Identity, u64, u64, ValueQuery>; + + /// Maps from a slot to the current finalized ethereum execution state root. + #[pallet::storage] + pub type ExecutionStateRoots = StorageMap<_, Identity, u64, H256, ValueQuery>; + + /// DEPRECATED: Use SyncCommitteeHashes instead. + /// Maps from a period to the poseidon commitment for the sync committee. + #[pallet::storage] + #[pallet::getter(fn sync_committee_poseidons)] + pub type SyncCommitteePoseidons = StorageMap<_, Identity, u64, U256, ValueQuery>; + + /// Maps from a period to the Sha256 commitment for the sync committee. + #[pallet::storage] + #[pallet::getter(fn sync_committee_hashes)] + pub type SyncCommitteeHashes = StorageMap<_, Identity, u64, U256, ValueQuery>; + + /// Storage for a config of finality threshold and slots per period. + #[pallet::storage] + pub type ConfigurationStorage = StorageValue<_, Configuration, ValueQuery>; + + /// Maps status of the message to the message root. + #[pallet::storage] + pub type MessageStatus = StorageMap<_, Identity, H256, MessageStatusEnum, ValueQuery>; + + /// Mapping between source chainId and the address of the broadcaster on that chain. + #[pallet::storage] + pub type Broadcasters = StorageMap<_, Identity, u32, H256, ValueQuery>; + + /// Flags source chain to be frozen. + #[pallet::storage] + pub type SourceChainFrozen = StorageMap<_, Identity, u32, bool, ValueQuery>; + + /// List of permitted domains. + #[pallet::storage] + pub type WhitelistedDomains = StorageValue<_, BoundedVec>, ValueQuery>; + + /// The storage for the step function identifier and the rotate function identifier. + /// Step function id is used to distinguish step-related functionality within the fulfill_call function. + /// Rotate function id is used to handle rotate-related functionality within the fulfill_call function. + /// When the provided function_id matches the step/rotate function identifier, specific logic related to step/rotate functions is executed. + /// The order of storage is (step_function_id, rotate_function_id) + #[pallet::storage] + #[pallet::getter(fn function_ids)] + pub type FunctionIds = StorageValue<_, Option<(H256, H256)>, ValueQuery>; + + /// Step verification key storage. + #[pallet::storage] + #[pallet::getter(fn step_verification_key)] + pub type StepVerificationKey = + StorageValue<_, Option>>, ValueQuery>; + + /// Rotate verification key storage. + #[pallet::storage] + #[pallet::getter(fn rotate_verification_key)] + pub type RotateVerificationKey = + StorageValue<_, Option>>, ValueQuery>; + + /// Genesis validator root, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn genesis_validator_root)] + pub type GenesisValidatorRoot = StorageValue<_, H256, ValueQuery>; + + /// Genesis timestamp, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn genesis_timestamp)] + pub type GenesisTimestamp = StorageValue<_, u64, ValueQuery>; + + /// Seconds per slot, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn seconds_per_slot)] + pub type SecondsPerSlot = StorageValue<_, u64, ValueQuery>; + + /// Source chain id, used to check initialization. + #[pallet::storage] + #[pallet::getter(fn source_chain_id)] + pub type SourceChainId = StorageValue<_, u64, ValueQuery>; + + /// Updater that can submit updates + #[pallet::storage] + #[pallet::getter(fn updater)] + pub type Updater = StorageValue<_, H256, ValueQuery>; + + /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. + pub mod config_preludes { + use super::*; + use frame_support::derive_impl; + use frame_support::parameter_types; + use frame_support::traits::ConstU64; + + parameter_types! { pub const BridgePalletId: PalletId = PalletId(*b"avl/brdg"); } - /// Provides a viable default config that can be used with - /// [`derive_impl`](`frame_support::derive_impl`) to derive a testing pallet config - /// based on this one. - pub struct TestDefaultConfig; - - #[derive_impl( - frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types - )] - impl frame_system::DefaultConfig for TestDefaultConfig {} - - #[frame_support::register_default_impl(TestDefaultConfig)] - impl DefaultConfig for TestDefaultConfig { - type WeightInfo = (); - type MessageMappingStorageIndex = ConstU64<1>; - type AvailDomain = ConstU32<1>; - #[inject_runtime_type] - type RuntimeEvent = (); - #[inject_runtime_type] - type RuntimeCall = (); - type PalletId = BridgePalletId; - } - } - - #[pallet::config(with_default)] - pub trait Config: frame_system::Config { - /// Because this pallet emits events, it depends on the runtime's definition of an event. - #[pallet::no_default_bounds] - type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. - #[pallet::no_default_bounds] - type RuntimeCall: Parameter - + UnfilteredDispatchable - + GetDispatchInfo; - /// Weight information for extrinsics in this pallet. - type WeightInfo: WeightInfo; - /// Currency type for this pallet. - #[pallet::no_default] - type Currency: LockableCurrency>; - /// Dependency that can provide current time. - #[pallet::no_default] - type TimeProvider: UnixTime; - /// The index of the `messages` mapping in contract. - /// This is mandatory when calling execute messages via storage proofs. - #[pallet::constant] - type MessageMappingStorageIndex: Get; - /// Bridge's pallet id, used for deriving its sovereign account ID. - #[pallet::constant] - type PalletId: Get; - /// Unique value associated with Avail Network. Used to distinguish messages between Avail and non-Avail networks. - #[pallet::constant] - type AvailDomain: Get; - } - - #[pallet::genesis_config] - #[derive(DefaultNoBound)] - pub struct GenesisConfig { - pub slots_per_period: u64, - pub finality_threshold: u16, - pub function_ids: (H256, H256), - pub sync_committee_hash: U256, - pub period: u64, - pub broadcaster: H256, - pub broadcaster_domain: u32, - pub step_verification_key: Vec, - pub rotate_verification_key: Vec, - pub whitelisted_domains: Vec, - pub genesis_validator_root: H256, - pub genesis_time: u64, - pub seconds_per_slot: u64, - pub source_chain_id: u64, - pub _phantom: PhantomData, - } - - #[pallet::genesis_build] - impl BuildGenesisConfig for GenesisConfig { - fn build(&self) { - // Preconfigure init data - >::put(Configuration { - slots_per_period: self.slots_per_period, - finality_threshold: self.finality_threshold, - }); - - let mut domains = self.whitelisted_domains.clone(); - - // Whitelisted domains sanitization. - domains.sort(); - domains.dedup(); - let domains = - BoundedVec::try_from(domains).expect("Cannot have more than 10_000 domains."); - WhitelistedDomains::::put(domains); - - Broadcasters::::set(self.broadcaster_domain, self.broadcaster); - - FunctionIds::::set(Some(self.function_ids)); - - let step_verification_key = BoundedVec::try_from(self.step_verification_key.clone()) - .expect("Step verification key should be valid at genesis."); - StepVerificationKey::::set(Some(step_verification_key)); - - let rotate_verification_key = - BoundedVec::try_from(self.rotate_verification_key.clone()) - .expect("Rotate verification key should be valid at genesis."); - RotateVerificationKey::::set(Some(rotate_verification_key)); - - SyncCommitteeHashes::::insert(self.period, self.sync_committee_hash); - - GenesisValidatorRoot::::set(self.genesis_validator_root); - - GenesisTimestamp::::set(self.genesis_time); - - SecondsPerSlot::::set(self.seconds_per_slot); - - SourceChainId::::set(self.source_chain_id); - } - } - - #[pallet::pallet] - pub struct Pallet(_); - - #[pallet::hooks] - impl Hooks> for Pallet { - fn on_initialize(_n: BlockNumberFor) -> Weight { - if let Some(failed_txs) = - MemoryTemporaryStorage::take::>>(FAILED_SEND_MSG_ID) - { - log::trace!(target: LOG_TARGET, "Failed Txs cleaned: {failed_txs:?}"); - } - - Weight::zero() - } - } - // TODO: Rename to FunctionInput - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] - pub struct FunctionInputs { - pub updates: Vec, - pub finality_update: FinalityUpdate, - pub expected_current_slot: u64, - pub store: LightClientStore, - pub genesis_root: Bytes32, - pub forks: Forks, - pub execution_state_proof: ExecutionStateProof, - } - - #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] - pub struct ExecutionStateProof { - #[serde(rename = "executionStateRoot")] - pub execution_state_root: B256, - #[serde(rename = "executionStateBranch")] - pub execution_state_branch: Vec, - pub gindex: String, - } - /// Merkle branch index & depth for the execution state root proof. - pub const MERKLE_BRANCH_INDEX: usize = 802; - pub const MERKLE_BRANCH_DEPTH: usize = 9; - #[pallet::call] - impl Pallet - where - [u8; 32]: From, - { - /// The entrypoint for fulfilling a call. - /// function_id Function identifier. - /// inputs Function input. - #[pallet::call_index(0)] - #[pallet::weight(weight_helper::fulfill_call::< T > (* function_id))] // can't remove this - pub fn fulfill_call( - origin: OriginFor, - function_id: H256, - inputs: Vec, // TODO: Convert to fixed bytes - ) -> DispatchResultWithPostInfo { - let config = ConfigurationStorage::::get(); - let FunctionInputs { - updates, - finality_update, - expected_current_slot, - mut store, - genesis_root, - forks, - execution_state_proof, - } = serde_cbor::from_slice(&inputs).unwrap(); - - let mut is_valid = true; - let prev_head = store.finalized_header.slot; - - // 1. Apply sync committee updates, if any - for (index, update) in updates.iter().enumerate() { - is_valid = is_valid - && verify_update( - update, - expected_current_slot, - &store, - genesis_root.clone(), - &forks, - ) - .is_ok(); - - apply_update(&mut store, update); - } - - // 2. Apply finality update - is_valid = is_valid - && verify_finality_update( - &finality_update, - expected_current_slot, - &store, - genesis_root.clone(), - &forks, - ) - .is_ok(); - apply_finality_update(&mut store, &finality_update); - - // 3. Verify execution state root proof - let execution_state_branch_nodes: Vec = execution_state_proof - .execution_state_branch - .iter() - .map(|b| Node::try_from(b.as_ref()).unwrap()) - .collect(); - - is_valid = is_valid - && is_valid_merkle_branch( - &Node::try_from(execution_state_proof.execution_state_root.as_ref()).unwrap(), - execution_state_branch_nodes.iter(), - MERKLE_BRANCH_DEPTH, - MERKLE_BRANCH_INDEX, - &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), - ); - - let finalized_header_root: [u8; 32] = store - .finalized_header - .hash_tree_root() - .unwrap().as_ref().try_into().unwrap(); - let execution_state_root: [u8; 32] = execution_state_proof.execution_state_root.as_slice().try_into().unwrap(); - - let head = store.finalized_header.slot; - let sender: [u8; 32] = ensure_signed(origin)?.into(); - let updater = Updater::::get(); - - // ensure sender is preconfigured - ensure!(H256(sender) == updater, Error::::UpdaterMisMatch); - ensure!(is_valid, Error::::VerificationFailed); - - let mut function_called = false; - - // 4. Store step if needed - if prev_head != head { - let verified_output = VerifiedStepOutput { - finalized_header_root: H256::from(finalized_header_root), - execution_state_root: H256::from(execution_state_root), - finalized_slot: store.finalized_header.slot.as_u64(), - participation: store.current_max_active_participants.try_into().unwrap(), - }; - - let head = Head::::get(); - ensure!(verified_output.finalized_slot > head, Error::::SlotBehindHead); - - if Self::set_slot_roots(verified_output)? { - Self::deposit_event(Event::HeadUpdated { - slot: verified_output.finalized_slot, - finalization_root: verified_output.finalized_header_root, - execution_state_root: verified_output.execution_state_root, - }); - function_called = true; - } - } - - // 5. Store rotate if needed - // a) Store current sync committee if stored one is empty (i.e. first time or after a range of updates) - let period = head.as_u64() - .checked_div(config.slots_per_period) - .ok_or(Error::::ConfigurationNotSet)?; - let stored_current_sync_committee = SyncCommitteeHashes::::get(period); - if stored_current_sync_committee.is_zero() { - let current_sync_committee_hash: U256 = store - .current_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); - Self::deposit_event(Event::SyncCommitteeUpdated { - period, - root: current_sync_committee_hash, - }); - function_called = true; - - Self::set_sync_committee_hash(period, current_sync_committee_hash)?; - } - - // b) Store next sync committee if available - if let Some(mut next_sync_committee) = store.next_sync_committee { - let next_period = period + 1; - let stored_next_sync_committee_hash = SyncCommitteeHashes::::get(next_period); - let next_sync_committee_hash: [u8; 32] = next_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); - let next_sync_committee_hash = U256::from(next_sync_committee_hash); - - // If the next sync committee is already correct, we don't need to update it. - if stored_next_sync_committee_hash != next_sync_committee_hash.into() { - Self::deposit_event(Event::SyncCommitteeUpdated { - period: next_period, - root: next_sync_committee_hash, - }); - function_called = true; - - Self::set_sync_committee_hash(next_period, next_sync_committee_hash)?; - } - } - - if !function_called { - return Err(Error::::FunctionIdNotKnown.into()); - } - - Ok(().into()) - } - - /// Executes message if a valid proofs are provided for the supported message type, assets and domains. - #[pallet::call_index(1)] - #[pallet::weight({ - match addr_message.message { - Message::ArbitraryMessage(ref data) => T::WeightInfo::execute_arbitrary_message(data.len() as u32), - Message::FungibleToken {..} => T::WeightInfo::execute_fungible_token(), - } - })] - pub fn execute( - origin: OriginFor, - #[pallet::compact] slot: u64, - addr_message: AddressedMessage, - account_proof: ValidProof, - storage_proof: ValidProof, - ) -> DispatchResultWithPostInfo { - ensure_signed(origin)?; - let encoded_data = addr_message.clone().abi_encode(); - let message_root = H256(keccak_256(encoded_data.as_slice())); - - Self::check_preconditions(&addr_message, message_root)?; - - ensure!( + /// Provides a viable default config that can be used with + /// [`derive_impl`](`frame_support::derive_impl`) to derive a testing pallet config + /// based on this one. + pub struct TestDefaultConfig; + + #[derive_impl( + frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types + )] + impl frame_system::DefaultConfig for TestDefaultConfig {} + + #[frame_support::register_default_impl(TestDefaultConfig)] + impl DefaultConfig for TestDefaultConfig { + type WeightInfo = (); + type MessageMappingStorageIndex = ConstU64<1>; + type AvailDomain = ConstU32<1>; + #[inject_runtime_type] + type RuntimeEvent = (); + #[inject_runtime_type] + type RuntimeCall = (); + type PalletId = BridgePalletId; + } + } + + #[pallet::config(with_default)] + pub trait Config: frame_system::Config { + /// Because this pallet emits events, it depends on the runtime's definition of an event. + #[pallet::no_default_bounds] + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. + #[pallet::no_default_bounds] + type RuntimeCall: Parameter + + UnfilteredDispatchable + + GetDispatchInfo; + /// Weight information for extrinsics in this pallet. + type WeightInfo: WeightInfo; + /// Currency type for this pallet. + #[pallet::no_default] + type Currency: LockableCurrency>; + /// Dependency that can provide current time. + #[pallet::no_default] + type TimeProvider: UnixTime; + /// The index of the `messages` mapping in contract. + /// This is mandatory when calling execute messages via storage proofs. + #[pallet::constant] + type MessageMappingStorageIndex: Get; + /// Bridge's pallet id, used for deriving its sovereign account ID. + #[pallet::constant] + type PalletId: Get; + /// Unique value associated with Avail Network. Used to distinguish messages between Avail and non-Avail networks. + #[pallet::constant] + type AvailDomain: Get; + } + + #[pallet::genesis_config] + #[derive(DefaultNoBound)] + pub struct GenesisConfig { + pub slots_per_period: u64, + pub finality_threshold: u16, + pub function_ids: (H256, H256), + pub sync_committee_hash: U256, + pub period: u64, + pub broadcaster: H256, + pub broadcaster_domain: u32, + pub step_verification_key: Vec, + pub rotate_verification_key: Vec, + pub whitelisted_domains: Vec, + pub genesis_validator_root: H256, + pub genesis_time: u64, + pub seconds_per_slot: u64, + pub source_chain_id: u64, + pub _phantom: PhantomData, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) { + // Preconfigure init data + >::put(Configuration { + slots_per_period: self.slots_per_period, + finality_threshold: self.finality_threshold, + }); + + let mut domains = self.whitelisted_domains.clone(); + + // Whitelisted domains sanitization. + domains.sort(); + domains.dedup(); + let domains = + BoundedVec::try_from(domains).expect("Cannot have more than 10_000 domains."); + WhitelistedDomains::::put(domains); + + Broadcasters::::set(self.broadcaster_domain, self.broadcaster); + + FunctionIds::::set(Some(self.function_ids)); + + let step_verification_key = BoundedVec::try_from(self.step_verification_key.clone()) + .expect("Step verification key should be valid at genesis."); + StepVerificationKey::::set(Some(step_verification_key)); + + let rotate_verification_key = + BoundedVec::try_from(self.rotate_verification_key.clone()) + .expect("Rotate verification key should be valid at genesis."); + RotateVerificationKey::::set(Some(rotate_verification_key)); + + SyncCommitteeHashes::::insert(self.period, self.sync_committee_hash); + + GenesisValidatorRoot::::set(self.genesis_validator_root); + + GenesisTimestamp::::set(self.genesis_time); + + SecondsPerSlot::::set(self.seconds_per_slot); + + SourceChainId::::set(self.source_chain_id); + } + } + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> Weight { + if let Some(failed_txs) = + MemoryTemporaryStorage::take::>>(FAILED_SEND_MSG_ID) + { + log::trace!(target: LOG_TARGET, "Failed Txs cleaned: {failed_txs:?}"); + } + + Weight::zero() + } + } + // TODO: Rename to FunctionInput + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + pub struct FunctionInputs { + pub updates: Vec, + pub finality_update: FinalityUpdate, + pub expected_current_slot: u64, + pub store: LightClientStore, + pub genesis_root: Bytes32, + pub forks: Forks, + pub execution_state_proof: ExecutionStateProof, + } + + #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] + pub struct ExecutionStateProof { + #[serde(rename = "executionStateRoot")] + pub execution_state_root: B256, + #[serde(rename = "executionStateBranch")] + pub execution_state_branch: Vec, + pub gindex: String, + } + /// Merkle branch index & depth for the execution state root proof. + pub const MERKLE_BRANCH_INDEX: usize = 802; + pub const MERKLE_BRANCH_DEPTH: usize = 9; + #[pallet::call] + impl Pallet + where + [u8; 32]: From, + { + /// The entrypoint for fulfilling a call. + /// function_id Function identifier. + /// inputs Function input. + #[pallet::call_index(0)] + #[pallet::weight(weight_helper::fulfill_call::< T > (* function_id))] // can't remove this + pub fn fulfill_call( + origin: OriginFor, + function_id: H256, + inputs: Vec, // TODO: Convert to fixed bytes + ) -> DispatchResultWithPostInfo { + let config = ConfigurationStorage::::get(); + let FunctionInputs { + updates, + finality_update, + expected_current_slot, + mut store, + genesis_root, + forks, + execution_state_proof, + } = serde_cbor::from_slice(&inputs).unwrap(); + + let mut is_valid = true; + let prev_head = store.finalized_header.slot; + + // 1. Apply sync committee updates, if any + for (index, update) in updates.iter().enumerate() { + is_valid = is_valid + && verify_update( + update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) + .is_ok(); + + apply_update(&mut store, update); + } + + // 2. Apply finality update + is_valid = is_valid + && verify_finality_update( + &finality_update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) + .is_ok(); + apply_finality_update(&mut store, &finality_update); + + // 3. Verify execution state root proof + let execution_state_branch_nodes: Vec = execution_state_proof + .execution_state_branch + .iter() + .map(|b| Node::try_from(b.as_ref()).unwrap()) + .collect(); + + is_valid = is_valid + && is_valid_merkle_branch( + &Node::try_from(execution_state_proof.execution_state_root.as_ref()).unwrap(), + execution_state_branch_nodes.iter(), + MERKLE_BRANCH_DEPTH, + MERKLE_BRANCH_INDEX, + &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), + ); + + let finalized_header_root: [u8; 32] = store + .finalized_header + .hash_tree_root() + .unwrap().as_ref().try_into().unwrap(); + let execution_state_root: [u8; 32] = execution_state_proof.execution_state_root.as_slice().try_into().unwrap(); + + let head = store.finalized_header.slot; + let sender: [u8; 32] = ensure_signed(origin)?.into(); + let updater = Updater::::get(); + + // ensure sender is preconfigured + ensure!(H256(sender) == updater, Error::::UpdaterMisMatch); + ensure!(is_valid, Error::::VerificationFailed); + + let mut function_called = false; + + // 4. Store step if needed + if prev_head != head { + let verified_output = VerifiedStepOutput { + finalized_header_root: H256::from(finalized_header_root), + execution_state_root: H256::from(execution_state_root), + finalized_slot: store.finalized_header.slot.as_u64(), + participation: store.current_max_active_participants.try_into().unwrap(), + }; + + let head = Head::::get(); + ensure!(verified_output.finalized_slot > head, Error::::SlotBehindHead); + + if Self::set_slot_roots(verified_output)? { + Self::deposit_event(Event::HeadUpdated { + slot: verified_output.finalized_slot, + finalization_root: verified_output.finalized_header_root, + execution_state_root: verified_output.execution_state_root, + }); + function_called = true; + } + } + + // 5. Store rotate if needed + // a) Store current sync committee if stored one is empty (i.e. first time or after a range of updates) + let period = head.as_u64() + .checked_div(config.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; + let stored_current_sync_committee = SyncCommitteeHashes::::get(period); + if stored_current_sync_committee.is_zero() { + let current_sync_committee_hash: U256 = store + .current_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + Self::deposit_event(Event::SyncCommitteeUpdated { + period, + root: current_sync_committee_hash, + }); + function_called = true; + + Self::set_sync_committee_hash(period, current_sync_committee_hash)?; + } + + // b) Store next sync committee if available + if let Some(mut next_sync_committee) = store.next_sync_committee { + let next_period = period + 1; + let stored_next_sync_committee_hash = SyncCommitteeHashes::::get(next_period); + let next_sync_committee_hash: [u8; 32] = next_sync_committee + .hash_tree_root() + .unwrap() + .as_ref() + .try_into() + .unwrap(); + let next_sync_committee_hash = U256::from(next_sync_committee_hash); + + // If the next sync committee is already correct, we don't need to update it. + if stored_next_sync_committee_hash != next_sync_committee_hash.into() { + Self::deposit_event(Event::SyncCommitteeUpdated { + period: next_period, + root: next_sync_committee_hash, + }); + function_called = true; + + Self::set_sync_committee_hash(next_period, next_sync_committee_hash)?; + } + } + + if !function_called { + return Err(Error::::FunctionIdNotKnown.into()); + } + + Ok(().into()) + } + + /// Executes message if a valid proofs are provided for the supported message type, assets and domains. + #[pallet::call_index(1)] + #[pallet::weight({ + match addr_message.message { + Message::ArbitraryMessage(ref data) => T::WeightInfo::execute_arbitrary_message(data.len() as u32), + Message::FungibleToken {..} => T::WeightInfo::execute_fungible_token(), + } + })] + pub fn execute( + origin: OriginFor, + #[pallet::compact] slot: u64, + addr_message: AddressedMessage, + account_proof: ValidProof, + storage_proof: ValidProof, + ) -> DispatchResultWithPostInfo { + ensure_signed(origin)?; + let encoded_data = addr_message.clone().abi_encode(); + let message_root = H256(keccak_256(encoded_data.as_slice())); + + Self::check_preconditions(&addr_message, message_root)?; + + ensure!( !SourceChainFrozen::::get(addr_message.origin_domain), Error::::SourceChainFrozen ); - let root = ExecutionStateRoots::::get(slot); - let broadcaster = Broadcasters::::get(addr_message.origin_domain); + let root = ExecutionStateRoots::::get(slot); + let broadcaster = Broadcasters::::get(addr_message.origin_domain); - // extract contract address - let contract_broadcaster_address = H160::from_slice(broadcaster[..20].as_ref()); - let account_proof_vec = account_proof - .iter() - .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) - .collect(); + // extract contract address + let contract_broadcaster_address = H160::from_slice(broadcaster[..20].as_ref()); + let account_proof_vec = account_proof + .iter() + .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) + .collect(); - let storage_root = - get_storage_root(account_proof_vec, contract_broadcaster_address, root) - .map_err(|_| Error::::CannotGetStorageRoot)?; + let storage_root = + get_storage_root(account_proof_vec, contract_broadcaster_address, root) + .map_err(|_| Error::::CannotGetStorageRoot)?; - let message_id = Uint(U256::from(addr_message.id)); - let mm_idx = Uint(U256::from(T::MessageMappingStorageIndex::get())); - let slot_key = H256(keccak_256(ethabi::encode(&[message_id, mm_idx]).as_slice())); + let message_id = Uint(U256::from(addr_message.id)); + let mm_idx = Uint(U256::from(T::MessageMappingStorageIndex::get())); + let slot_key = H256(keccak_256(ethabi::encode(&[message_id, mm_idx]).as_slice())); - let storage_proof_vec = storage_proof - .iter() - .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) - .collect(); + let storage_proof_vec = storage_proof + .iter() + .map(|inner_bounded_vec| inner_bounded_vec.iter().copied().collect()) + .collect(); - let slot_value = get_storage_value(slot_key, storage_root, storage_proof_vec) - .map_err(|_| Error::::CannotGetStorageValue)?; + let slot_value = get_storage_value(slot_key, storage_root, storage_proof_vec) + .map_err(|_| Error::::CannotGetStorageValue)?; - ensure!(slot_value == message_root, Error::::InvalidMessageHash); + ensure!(slot_value == message_root, Error::::InvalidMessageHash); - if let Message::FungibleToken { asset_id, amount } = &addr_message.message { - ensure!( + if let Message::FungibleToken { asset_id, amount } = &addr_message.message { + ensure!( SUPPORTED_ASSET_ID == *asset_id, Error::::AssetNotSupported ); - let destination_account_id = - T::AccountId::decode(&mut &addr_message.to.encode()[..]) - .map_err(|_| Error::::CannotDecodeDestinationAccountId)?; - - T::Currency::transfer( - &Self::account_id(), - &destination_account_id, - (*amount).saturated_into(), - ExistenceRequirement::AllowDeath, - )?; - } - - MessageStatus::::set(message_root, MessageStatusEnum::ExecutionSucceeded); - Self::deposit_event(Event::::MessageExecuted { - from: addr_message.from, - to: addr_message.to, - message_id: addr_message.id, - message_root, - }); - - Ok(().into()) - } - - /// source_chain_froze froze source chain and prevent messages to be executed. - // - // Test names: source_chain_froze_works_with_root(), source_chain_froze_does_not_work_with_non_root() - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::source_chain_froze())] - pub fn source_chain_froze( - origin: OriginFor, - #[pallet::compact] source_chain_id: u32, - frozen: bool, - ) -> DispatchResult { - ensure_root(origin)?; - - SourceChainFrozen::::set(source_chain_id, frozen); - Self::deposit_event(Event::::SourceChainFrozen { - source_chain_id, - frozen, - }); - - Ok(()) - } - - /// send_message sends a message from an origin chain to the destination chain. - // - // Test names: - // send_message_fungible_token_works(), send_message_fungible_token_doesnt_accept_data(), - // send_message_fungible_token_doesnt_accept_empty_asset_id(), send_message_fungible_token_doesnt_accept_empty_value(), - // send_message_arbitrary_message_works(), send_message_arbitrary_message_doesnt_accept_value(), - // send_message_arbitrary_message_doesnt_accept_asset_id(), send_message_arbitrary_message_doesnt_accept_empty_data() - #[pallet::call_index(3)] - #[pallet::weight({ - match message { - Message::ArbitraryMessage(ref data) => T::WeightInfo::send_message_arbitrary_message(data.len() as u32), - Message::FungibleToken{..} => T::WeightInfo::send_message_fungible_token(), - } - })] - pub fn send_message( - origin: OriginFor, - message: Message, - to: H256, - #[pallet::compact] domain: u32, - ) -> DispatchResultWithPostInfo { - let who = ensure_signed(origin)?; - - let dispatch = Self::do_send_message(who, message, to, domain); - if dispatch.is_err() { - let _ = MemoryTemporaryStorage::update::>, _>( - FAILED_SEND_MSG_ID.to_vec(), - |failed| { - let tx_idx_result = >::extrinsic_index(); - // this should never happen and we can just log warn - if tx_idx_result.is_none() { - log::warn!(target: LOG_TARGET, "Transaction index is none!"); - } - let tx_idx = tx_idx_result.unwrap_or_default(); - failed.push(tx_idx.into()); - log::trace!(target: LOG_TARGET, "Send Message failed txs: {failed:?}"); - }, - ); - } - - dispatch - } - - /// set_poseidon_hash sets poseidon hash of the sync committee for the particular period. - // - // Test names: set_poseidon_hash_works_with_root(), set_poseidon_hash_does_not_work_with_non_root() - #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::set_poseidon_hash())] - pub fn set_poseidon_hash( - origin: OriginFor, - #[pallet::compact] period: u64, - poseidon_hash: BoundedVec>, - ) -> DispatchResultWithPostInfo { - ensure_root(origin)?; - - // poseidon_hash.len() is always less than `u32::MAX` because it is bounded by BoundedVec - ensure!( + let destination_account_id = + T::AccountId::decode(&mut &addr_message.to.encode()[..]) + .map_err(|_| Error::::CannotDecodeDestinationAccountId)?; + + T::Currency::transfer( + &Self::account_id(), + &destination_account_id, + (*amount).saturated_into(), + ExistenceRequirement::AllowDeath, + )?; + } + + MessageStatus::::set(message_root, MessageStatusEnum::ExecutionSucceeded); + Self::deposit_event(Event::::MessageExecuted { + from: addr_message.from, + to: addr_message.to, + message_id: addr_message.id, + message_root, + }); + + Ok(().into()) + } + + /// source_chain_froze froze source chain and prevent messages to be executed. + // + // Test names: source_chain_froze_works_with_root(), source_chain_froze_does_not_work_with_non_root() + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::source_chain_froze())] + pub fn source_chain_froze( + origin: OriginFor, + #[pallet::compact] source_chain_id: u32, + frozen: bool, + ) -> DispatchResult { + ensure_root(origin)?; + + SourceChainFrozen::::set(source_chain_id, frozen); + Self::deposit_event(Event::::SourceChainFrozen { + source_chain_id, + frozen, + }); + + Ok(()) + } + + /// send_message sends a message from an origin chain to the destination chain. + // + // Test names: + // send_message_fungible_token_works(), send_message_fungible_token_doesnt_accept_data(), + // send_message_fungible_token_doesnt_accept_empty_asset_id(), send_message_fungible_token_doesnt_accept_empty_value(), + // send_message_arbitrary_message_works(), send_message_arbitrary_message_doesnt_accept_value(), + // send_message_arbitrary_message_doesnt_accept_asset_id(), send_message_arbitrary_message_doesnt_accept_empty_data() + #[pallet::call_index(3)] + #[pallet::weight({ + match message { + Message::ArbitraryMessage(ref data) => T::WeightInfo::send_message_arbitrary_message(data.len() as u32), + Message::FungibleToken{..} => T::WeightInfo::send_message_fungible_token(), + } + })] + pub fn send_message( + origin: OriginFor, + message: Message, + to: H256, + #[pallet::compact] domain: u32, + ) -> DispatchResultWithPostInfo { + let who = ensure_signed(origin)?; + + let dispatch = Self::do_send_message(who, message, to, domain); + if dispatch.is_err() { + let _ = MemoryTemporaryStorage::update::>, _>( + FAILED_SEND_MSG_ID.to_vec(), + |failed| { + let tx_idx_result = >::extrinsic_index(); + // this should never happen and we can just log warn + if tx_idx_result.is_none() { + log::warn!(target: LOG_TARGET, "Transaction index is none!"); + } + let tx_idx = tx_idx_result.unwrap_or_default(); + failed.push(tx_idx.into()); + log::trace!(target: LOG_TARGET, "Send Message failed txs: {failed:?}"); + }, + ); + } + + dispatch + } + + /// set_poseidon_hash sets poseidon hash of the sync committee for the particular period. + // + // Test names: set_poseidon_hash_works_with_root(), set_poseidon_hash_does_not_work_with_non_root() + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::set_poseidon_hash())] + pub fn set_poseidon_hash( + origin: OriginFor, + #[pallet::compact] period: u64, + poseidon_hash: BoundedVec>, + ) -> DispatchResultWithPostInfo { + ensure_root(origin)?; + + // poseidon_hash.len() is always less than `u32::MAX` because it is bounded by BoundedVec + ensure!( poseidon_hash.len() as u32 <= ROTATE_POSEIDON_OUTPUT_LENGTH, Error::::CannotParseOutputData ); - let hash = U256::from(poseidon_hash.to_vec().as_slice()); - - SyncCommitteePoseidons::::insert(period, hash); - Self::deposit_event(Event::SyncCommitteeUpdated { period, root: hash }); - Ok(().into()) - } - - /// set_broadcaster sets the broadcaster address of the message from the origin chain. - // - // Test names: set_broadcaster_works_with_root(), set_broadcaster_does_not_work_with_non_root() - #[pallet::call_index(5)] - #[pallet::weight(T::WeightInfo::set_broadcaster())] - pub fn set_broadcaster( - origin: OriginFor, - #[pallet::compact] broadcaster_domain: u32, - broadcaster: H256, - ) -> DispatchResult { - ensure_root(origin)?; - let old_bc = Broadcasters::::get(broadcaster_domain); - - Broadcasters::::set(broadcaster_domain, broadcaster); - - Self::deposit_event(Event::BroadcasterUpdated { - old: old_bc, - new: broadcaster, - domain: broadcaster_domain, - }); - - Ok(()) - } - - /// The set_whitelisted_domains function allows the root (administrator) to set the whitelisted domains. It is a - /// privileged function intended for administrative purposes, used to manage a list of permitted domains. - // - // Test names: set_whitelisted_domains_works_with_root(), set_whitelisted_domains_does_not_work_with_non_root() - #[pallet::call_index(6)] - #[pallet::weight(T::WeightInfo::set_whitelisted_domains())] - pub fn set_whitelisted_domains( - origin: OriginFor, - value: BoundedVec>, - ) -> DispatchResult { - ensure_root(origin)?; - WhitelistedDomains::::put(value); - - Self::deposit_event(Event::WhitelistedDomainsUpdated); - - Ok(()) - } - - /// The set_configuration function allows the root (administrator) to set the configuration. It is a - /// privileged function intended for administrative purposes, used to manage slots_per_period and finality_threshold values. - // - // Test names: set_configuration_works_with_root(), set_configuration_does_not_work_with_non_root() - #[pallet::call_index(7)] - #[pallet::weight(T::WeightInfo::set_configuration())] - pub fn set_configuration(origin: OriginFor, value: Configuration) -> DispatchResult { - ensure_root(origin)?; - ConfigurationStorage::::put(value); - - Self::deposit_event(Event::ConfigurationUpdated { - slots_per_period: value.slots_per_period, - finality_threshold: value.finality_threshold, - }); - - Ok(()) - } - - #[pallet::call_index(8)] - #[pallet::weight(T::WeightInfo::set_function_ids())] - pub fn set_function_ids( - origin: OriginFor, - value: Option<(H256, H256)>, - ) -> DispatchResult { - ensure_root(origin)?; - FunctionIds::::put(value); - - Self::deposit_event(Event::FunctionIdsUpdated { value }); - - Ok(()) - } - - #[pallet::call_index(9)] - #[pallet::weight(T::WeightInfo::set_step_verification_key())] - pub fn set_step_verification_key( - origin: OriginFor, - value: Option>>, - ) -> DispatchResult { - ensure_root(origin)?; - if let Some(vk) = value.clone() { - let _ = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - } - - StepVerificationKey::::put(value.clone()); - - Self::deposit_event(Event::StepVerificationKeyUpdated { value }); - - Ok(()) - } - - #[pallet::call_index(10)] - #[pallet::weight(T::WeightInfo::set_rotate_verification_key())] - pub fn set_rotate_verification_key( - origin: OriginFor, - value: Option>>, - ) -> DispatchResult { - ensure_root(origin)?; - if let Some(vk) = value.clone() { - let _ = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - } - - RotateVerificationKey::::put(value.clone()); - - Self::deposit_event(Event::RotateVerificationKeyUpdated { value }); - - Ok(()) - } - - #[pallet::call_index(11)] - #[pallet::weight(( - T::WeightInfo::failed_tx_index(0u32), - DispatchClass::Mandatory - ))] - pub fn failed_send_message_txs( - origin: OriginFor, - failed_txs: Vec>, - ) -> DispatchResult { - ensure_none(origin)?; - let local_failed_txs = - MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) - .unwrap_or_default(); - ensure!( + let hash = U256::from(poseidon_hash.to_vec().as_slice()); + + SyncCommitteePoseidons::::insert(period, hash); + Self::deposit_event(Event::SyncCommitteeUpdated { period, root: hash }); + Ok(().into()) + } + + /// set_broadcaster sets the broadcaster address of the message from the origin chain. + // + // Test names: set_broadcaster_works_with_root(), set_broadcaster_does_not_work_with_non_root() + #[pallet::call_index(5)] + #[pallet::weight(T::WeightInfo::set_broadcaster())] + pub fn set_broadcaster( + origin: OriginFor, + #[pallet::compact] broadcaster_domain: u32, + broadcaster: H256, + ) -> DispatchResult { + ensure_root(origin)?; + let old_bc = Broadcasters::::get(broadcaster_domain); + + Broadcasters::::set(broadcaster_domain, broadcaster); + + Self::deposit_event(Event::BroadcasterUpdated { + old: old_bc, + new: broadcaster, + domain: broadcaster_domain, + }); + + Ok(()) + } + + /// The set_whitelisted_domains function allows the root (administrator) to set the whitelisted domains. It is a + /// privileged function intended for administrative purposes, used to manage a list of permitted domains. + // + // Test names: set_whitelisted_domains_works_with_root(), set_whitelisted_domains_does_not_work_with_non_root() + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::set_whitelisted_domains())] + pub fn set_whitelisted_domains( + origin: OriginFor, + value: BoundedVec>, + ) -> DispatchResult { + ensure_root(origin)?; + WhitelistedDomains::::put(value); + + Self::deposit_event(Event::WhitelistedDomainsUpdated); + + Ok(()) + } + + /// The set_configuration function allows the root (administrator) to set the configuration. It is a + /// privileged function intended for administrative purposes, used to manage slots_per_period and finality_threshold values. + // + // Test names: set_configuration_works_with_root(), set_configuration_does_not_work_with_non_root() + #[pallet::call_index(7)] + #[pallet::weight(T::WeightInfo::set_configuration())] + pub fn set_configuration(origin: OriginFor, value: Configuration) -> DispatchResult { + ensure_root(origin)?; + ConfigurationStorage::::put(value); + + Self::deposit_event(Event::ConfigurationUpdated { + slots_per_period: value.slots_per_period, + finality_threshold: value.finality_threshold, + }); + + Ok(()) + } + + #[pallet::call_index(8)] + #[pallet::weight(T::WeightInfo::set_function_ids())] + pub fn set_function_ids( + origin: OriginFor, + value: Option<(H256, H256)>, + ) -> DispatchResult { + ensure_root(origin)?; + FunctionIds::::put(value); + + Self::deposit_event(Event::FunctionIdsUpdated { value }); + + Ok(()) + } + + #[pallet::call_index(9)] + #[pallet::weight(T::WeightInfo::set_step_verification_key())] + pub fn set_step_verification_key( + origin: OriginFor, + value: Option>>, + ) -> DispatchResult { + ensure_root(origin)?; + if let Some(vk) = value.clone() { + let _ = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + } + + StepVerificationKey::::put(value.clone()); + + Self::deposit_event(Event::StepVerificationKeyUpdated { value }); + + Ok(()) + } + + #[pallet::call_index(10)] + #[pallet::weight(T::WeightInfo::set_rotate_verification_key())] + pub fn set_rotate_verification_key( + origin: OriginFor, + value: Option>>, + ) -> DispatchResult { + ensure_root(origin)?; + if let Some(vk) = value.clone() { + let _ = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + } + + RotateVerificationKey::::put(value.clone()); + + Self::deposit_event(Event::RotateVerificationKeyUpdated { value }); + + Ok(()) + } + + #[pallet::call_index(11)] + #[pallet::weight(( + T::WeightInfo::failed_tx_index(0u32), + DispatchClass::Mandatory + ))] + pub fn failed_send_message_txs( + origin: OriginFor, + failed_txs: Vec>, + ) -> DispatchResult { + ensure_none(origin)?; + let local_failed_txs = + MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) + .unwrap_or_default(); + ensure!( local_failed_txs == failed_txs, Error::::InvalidFailedIndices ); - Ok(()) - } - - #[pallet::call_index(12)] - #[pallet::weight(T::WeightInfo::set_updater())] - pub fn set_updater(origin: OriginFor, updater: H256) -> DispatchResult { - ensure_root(origin)?; - let old = Updater::::get(); - Updater::::set(updater); - - Self::deposit_event(Event::::NewUpdater { old, new: updater }); - Ok(()) - } - } - - impl Pallet { - fn do_send_message( - who: T::AccountId, - message: Message, - to: H256, - domain: u32, - ) -> DispatchResultWithPostInfo { - // Ensure the domain is currently supported - ensure!( + Ok(()) + } + + #[pallet::call_index(12)] + #[pallet::weight(T::WeightInfo::set_updater())] + pub fn set_updater(origin: OriginFor, updater: H256) -> DispatchResult { + ensure_root(origin)?; + let old = Updater::::get(); + Updater::::set(updater); + + Self::deposit_event(Event::::NewUpdater { old, new: updater }); + Ok(()) + } + } + + impl Pallet { + fn do_send_message( + who: T::AccountId, + message: Message, + to: H256, + domain: u32, + ) -> DispatchResultWithPostInfo { + // Ensure the domain is currently supported + ensure!( Self::is_domain_valid(domain), Error::::DomainNotSupported ); - // Check MessageType and enforce the rules - let message_type = message.r#type(); - match message { - Message::FungibleToken { asset_id, amount } => { - ensure!( + // Check MessageType and enforce the rules + let message_type = message.r#type(); + match message { + Message::FungibleToken { asset_id, amount } => { + ensure!( SUPPORTED_ASSET_ID == asset_id, Error::::AssetNotSupported ); - ensure!( + ensure!( amount.saturated_into::() > 0, Error::::InvalidBridgeInputs ); - T::Currency::transfer( - &who, - &Self::account_id(), - amount.saturated_into(), - ExistenceRequirement::KeepAlive, - )?; - } - Message::ArbitraryMessage(data) => { - ensure!(!data.is_empty(), Error::::InvalidBridgeInputs) - } - }; - - let message_id = Self::fetch_curr_message_id().map_err(|e| e)?; - - Self::deposit_event(Event::MessageSubmitted { - from: who, - to, - message_type, - destination_domain: domain, - message_id, - }); - - Ok(().into()) - } - - fn fetch_curr_message_id() -> Result { - let number = >::block_number().saturated_into::(); - let tx_index_option = >::extrinsic_index(); - - match tx_index_option { - Some(tx_index) => Ok(tx_uid(number, tx_index)), - None => Err(Error::::CurrentMessageIdNotFound.into()), - } - } - - fn check_preconditions( - message: &AddressedMessage, - message_root: H256, - ) -> Result<(), DispatchError> { - let message_status = MessageStatus::::get(message_root); - // Message must not be executed - ensure!( + T::Currency::transfer( + &who, + &Self::account_id(), + amount.saturated_into(), + ExistenceRequirement::KeepAlive, + )?; + } + Message::ArbitraryMessage(data) => { + ensure!(!data.is_empty(), Error::::InvalidBridgeInputs) + } + }; + + let message_id = Self::fetch_curr_message_id().map_err(|e| e)?; + + Self::deposit_event(Event::MessageSubmitted { + from: who, + to, + message_type, + destination_domain: domain, + message_id, + }); + + Ok(().into()) + } + + fn fetch_curr_message_id() -> Result { + let number = >::block_number().saturated_into::(); + let tx_index_option = >::extrinsic_index(); + + match tx_index_option { + Some(tx_index) => Ok(tx_uid(number, tx_index)), + None => Err(Error::::CurrentMessageIdNotFound.into()), + } + } + + fn check_preconditions( + message: &AddressedMessage, + message_root: H256, + ) -> Result<(), DispatchError> { + let message_status = MessageStatus::::get(message_root); + // Message must not be executed + ensure!( message_status == MessageStatusEnum::NotExecuted, Error::::MessageAlreadyExecuted ); - ensure!( + ensure!( message.destination_domain == T::AvailDomain::get(), Error::::WrongDestinationChain ); - ensure!( + ensure!( WhitelistedDomains::::get().contains(&message.origin_domain), Error::::UnsupportedOriginChain ); - let source_chain = Broadcasters::::get(message.origin_domain); - ensure!( + let source_chain = Broadcasters::::get(message.origin_domain); + ensure!( source_chain != H256::zero(), Error::::BroadcasterSourceChainNotSet ); - Ok(()) - } - - /// The account ID of the bridge's pot. - pub fn account_id() -> T::AccountId { - T::PalletId::get().into_account_truncating() - } - - fn rotate_into( - finalized_slot: u64, - cfg: &Configuration, - verified_rotate_call: &VerifiedRotate, - rotate_function_id: H256, - ) -> Result { - let finalized_header_root = Headers::::get(finalized_slot); - ensure!( + Ok(()) + } + + /// The account ID of the bridge's pot. + pub fn account_id() -> T::AccountId { + T::PalletId::get().into_account_truncating() + } + + fn rotate_into( + finalized_slot: u64, + cfg: &Configuration, + verified_rotate_call: &VerifiedRotate, + rotate_function_id: H256, + ) -> Result { + let finalized_header_root = Headers::::get(finalized_slot); + ensure!( finalized_header_root != H256::zero(), Error::::HeaderRootNotSet ); - let input = ethabi::encode(&[Token::FixedBytes(finalized_header_root.0.to_vec())]); - let sync_committee_hash: U256 = - Self::verified_rotate_call(rotate_function_id, input, verified_rotate_call)?; - - let period = finalized_slot - .checked_div(cfg.slots_per_period) - .ok_or(Error::::ConfigurationNotSet)?; - let next_period = period + 1; + let input = ethabi::encode(&[Token::FixedBytes(finalized_header_root.0.to_vec())]); + let sync_committee_hash: U256 = + Self::verified_rotate_call(rotate_function_id, input, verified_rotate_call)?; - Self::set_sync_committee_hash(next_period, sync_committee_hash)?; + let period = finalized_slot + .checked_div(cfg.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; + let next_period = period + 1; - Ok(next_period) - } + Self::set_sync_committee_hash(next_period, sync_committee_hash)?; - fn step_into( - attested_slot: u64, - cfg: &Configuration, - verified_step_call: &VerifiedStep, - step_function_id: H256, - ) -> Result { - let period = attested_slot - .checked_div(cfg.slots_per_period) - .ok_or(Error::::ConfigurationNotSet)?; - - let sc_hash = SyncCommitteeHashes::::get(period); - ensure!(sc_hash != U256::zero(), Error::::SyncCommitteeNotSet); + Ok(next_period) + } - let input = encode_packed(sc_hash, attested_slot); - let result = Self::verified_step_call(step_function_id, input, verified_step_call)?; - ensure!( + fn step_into( + attested_slot: u64, + cfg: &Configuration, + verified_step_call: &VerifiedStep, + step_function_id: H256, + ) -> Result { + let period = attested_slot + .checked_div(cfg.slots_per_period) + .ok_or(Error::::ConfigurationNotSet)?; + + let sc_hash = SyncCommitteeHashes::::get(period); + ensure!(sc_hash != U256::zero(), Error::::SyncCommitteeNotSet); + + let input = encode_packed(sc_hash, attested_slot); + let result = Self::verified_step_call(step_function_id, input, verified_step_call)?; + ensure!( result.participation >= cfg.finality_threshold, Error::::NotEnoughParticipants ); - let head = Head::::get(); - ensure!(result.finalized_slot > head, Error::::SlotBehindHead); + let head = Head::::get(); + ensure!(result.finalized_slot > head, Error::::SlotBehindHead); - let updated = Self::set_slot_roots(result)?; + let updated = Self::set_slot_roots(result)?; - Ok(updated) - } + Ok(updated) + } - /// Sets the current slot for the chain the light client is reflecting. - /// checks is the roots exists for the slot already. If there is - /// an existing header but no conflict, do nothing. Avoids timestamp renewal DoS attacks. - fn set_slot_roots(step_output: VerifiedStepOutput) -> Result { - let header = Headers::::get(step_output.finalized_slot); - ensure!(header == H256::zero(), Error::::HeaderRootAlreadySet); + /// Sets the current slot for the chain the light client is reflecting. + /// checks is the roots exists for the slot already. If there is + /// an existing header but no conflict, do nothing. Avoids timestamp renewal DoS attacks. + fn set_slot_roots(step_output: VerifiedStepOutput) -> Result { + let header = Headers::::get(step_output.finalized_slot); + ensure!(header == H256::zero(), Error::::HeaderRootAlreadySet); - let execution_state_root = ExecutionStateRoots::::get(step_output.finalized_slot); - ensure!( + let execution_state_root = ExecutionStateRoots::::get(step_output.finalized_slot); + ensure!( execution_state_root == H256::zero(), Error::::StateRootAlreadySet ); - Head::::set(step_output.finalized_slot); - Headers::::insert( - step_output.finalized_slot, - step_output.finalized_header_root, - ); - ExecutionStateRoots::::insert( - step_output.finalized_slot, - step_output.execution_state_root, - ); - - Timestamps::::insert(step_output.finalized_slot, T::TimeProvider::now().as_secs()); - - Ok(true) - } - - /// Sets the sync committee poseidon for a given period. - fn set_sync_committee_poseidon(period: u64, poseidon: U256) -> Result<(), DispatchError> { - let sync_committee_poseidons = SyncCommitteePoseidons::::get(period); - ensure!( + Head::::set(step_output.finalized_slot); + Headers::::insert( + step_output.finalized_slot, + step_output.finalized_header_root, + ); + ExecutionStateRoots::::insert( + step_output.finalized_slot, + step_output.execution_state_root, + ); + + Timestamps::::insert(step_output.finalized_slot, T::TimeProvider::now().as_secs()); + + Ok(true) + } + + /// Sets the sync committee poseidon for a given period. + fn set_sync_committee_poseidon(period: u64, poseidon: U256) -> Result<(), DispatchError> { + let sync_committee_poseidons = SyncCommitteePoseidons::::get(period); + ensure!( sync_committee_poseidons == U256::zero(), Error::::SyncCommitteeAlreadySet ); - SyncCommitteePoseidons::::set(period, poseidon); + SyncCommitteePoseidons::::set(period, poseidon); - Ok(()) - } + Ok(()) + } - /// Sets the sync committee hash for a given period. - fn set_sync_committee_hash(period: u64, hash: U256) -> Result<(), DispatchError> { - let sync_committee_hashes = SyncCommitteeHashes::::get(period); - ensure!( + /// Sets the sync committee hash for a given period. + fn set_sync_committee_hash(period: u64, hash: U256) -> Result<(), DispatchError> { + let sync_committee_hashes = SyncCommitteeHashes::::get(period); + ensure!( sync_committee_hashes == U256::zero(), Error::::SyncCommitteeAlreadySet ); - SyncCommitteeHashes::::set(period, hash); - - Ok(()) - } - - /// get_verifier returns verifier based on the provided function id. - fn get_verifier( - function_id: H256, - step_function_id: H256, - rotate_function_id: H256, - ) -> Result> { - if function_id == step_function_id { - Self::get_step_verifier() - } else if function_id == rotate_function_id { - Self::get_rotate_verifier() - } else { - Err(Error::::FunctionIdNotKnown) - } - } - - fn get_step_verifier() -> Result> { - if let Some(vk) = StepVerificationKey::::get() { - let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - Ok(deserialized_vk) - } else { - Err(Error::::VerificationKeyIsNotSet) - } - } - - fn get_rotate_verifier() -> Result> { - if let Some(vk) = RotateVerificationKey::::get() { - let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) - .map_err(|_| Error::::MalformedVerificationKey)?; - Ok(deserialized_vk) - } else { - Err(Error::::VerificationKeyIsNotSet) - } - } - - fn verified_step_call( - function_id: H256, - input: ethabi::Bytes, - verified_call: &VerifiedStep, - ) -> Result { - let input_hash = sha2_256(input.as_slice()); - - if verified_call.verified_function_id == function_id - && verified_call.verified_input_hash == H256(input_hash) - { - let verified_output: VerifiedStepOutput = verified_call.verified_output; - Ok(verified_output) - } else { - Err(Error::::StepVerificationError.into()) - } - } - - fn verified_rotate_call( - function_id: H256, - input: ethabi::Bytes, - verified_call: &VerifiedRotate, - ) -> Result { - let input_hash = sha2_256(input.as_slice()); - - if verified_call.verified_function_id == function_id - && verified_call.verified_input_hash == H256(input_hash) - { - Ok(verified_call.sync_committee_hash) - } else { - Err(Error::::RotateVerificationError.into()) - } - } - - /// Check if the given domain is supported or not - fn is_domain_valid(domain: u32) -> bool { - WhitelistedDomains::::get().contains(&domain) - } - - fn get_function_ids() -> Result<(H256, H256), DispatchError> { - if let Some(function_ids) = FunctionIds::::get() { - Ok(function_ids) - } else { - Err(Error::::FunctionIdsAreNotSet.into()) - } - } - } + SyncCommitteeHashes::::set(period, hash); + + Ok(()) + } + + /// get_verifier returns verifier based on the provided function id. + fn get_verifier( + function_id: H256, + step_function_id: H256, + rotate_function_id: H256, + ) -> Result> { + if function_id == step_function_id { + Self::get_step_verifier() + } else if function_id == rotate_function_id { + Self::get_rotate_verifier() + } else { + Err(Error::::FunctionIdNotKnown) + } + } + + fn get_step_verifier() -> Result> { + if let Some(vk) = StepVerificationKey::::get() { + let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + Ok(deserialized_vk) + } else { + Err(Error::::VerificationKeyIsNotSet) + } + } + + fn get_rotate_verifier() -> Result> { + if let Some(vk) = RotateVerificationKey::::get() { + let deserialized_vk = Verifier::from_json_u8_slice(vk.as_slice()) + .map_err(|_| Error::::MalformedVerificationKey)?; + Ok(deserialized_vk) + } else { + Err(Error::::VerificationKeyIsNotSet) + } + } + + fn verified_step_call( + function_id: H256, + input: ethabi::Bytes, + verified_call: &VerifiedStep, + ) -> Result { + let input_hash = sha2_256(input.as_slice()); + + if verified_call.verified_function_id == function_id + && verified_call.verified_input_hash == H256(input_hash) + { + let verified_output: VerifiedStepOutput = verified_call.verified_output; + Ok(verified_output) + } else { + Err(Error::::StepVerificationError.into()) + } + } + + fn verified_rotate_call( + function_id: H256, + input: ethabi::Bytes, + verified_call: &VerifiedRotate, + ) -> Result { + let input_hash = sha2_256(input.as_slice()); + + if verified_call.verified_function_id == function_id + && verified_call.verified_input_hash == H256(input_hash) + { + Ok(verified_call.sync_committee_hash) + } else { + Err(Error::::RotateVerificationError.into()) + } + } + + /// Check if the given domain is supported or not + fn is_domain_valid(domain: u32) -> bool { + WhitelistedDomains::::get().contains(&domain) + } + + fn get_function_ids() -> Result<(H256, H256), DispatchError> { + if let Some(function_ids) = FunctionIds::::get() { + Ok(function_ids) + } else { + Err(Error::::FunctionIdsAreNotSet.into()) + } + } + } } impl ProvidePostInherent for Pallet where - [u8; 32]: From, + [u8; 32]: From, { - type Call = Call; - type Error = (); - - fn create_inherent(_: &avail_base::StorageMap) -> Option { - let failed_txs = MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) - .unwrap_or_default(); - - log::trace!(target: LOG_TARGET, "Create post inherent failed vector txs: {failed_txs:?}"); - Some(Call::failed_send_message_txs { failed_txs }) - } - - fn is_inherent(call: &Self::Call) -> bool { - matches!(call, Call::failed_send_message_txs { .. }) - } - - fn check_inherent(call: &Self::Call) -> Result<(), Self::Error> { - if let Call::failed_send_message_txs { failed_txs } = call { - let local_failed_txs = - MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) - .unwrap_or_default(); - ensure!(&local_failed_txs == failed_txs, ()); - } - Ok(()) - } + type Call = Call; + type Error = (); + + fn create_inherent(_: &avail_base::StorageMap) -> Option { + let failed_txs = MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) + .unwrap_or_default(); + + log::trace!(target: LOG_TARGET, "Create post inherent failed vector txs: {failed_txs:?}"); + Some(Call::failed_send_message_txs { failed_txs }) + } + + fn is_inherent(call: &Self::Call) -> bool { + matches!(call, Call::failed_send_message_txs { .. }) + } + + fn check_inherent(call: &Self::Call) -> Result<(), Self::Error> { + if let Call::failed_send_message_txs { failed_txs } = call { + let local_failed_txs = + MemoryTemporaryStorage::get::>>(FAILED_SEND_MSG_ID) + .unwrap_or_default(); + ensure!(&local_failed_txs == failed_txs, ()); + } + Ok(()) + } } pub mod weight_helper { - use super::*; - - /// Weight for `dataAvailability::submit_data`. - pub fn fulfill_call(function_id: H256) -> (Weight, DispatchClass) { - if let Some((step_function_id, _)) = FunctionIds::::get() { - if step_function_id == function_id { - return (T::WeightInfo::fulfill_call_step(), DispatchClass::Normal); - } - } - (T::WeightInfo::fulfill_call_rotate(), DispatchClass::Normal) - } + use super::*; + + /// Weight for `dataAvailability::submit_data`. + pub fn fulfill_call(function_id: H256) -> (Weight, DispatchClass) { + if let Some((step_function_id, _)) = FunctionIds::::get() { + if step_function_id == function_id { + return (T::WeightInfo::fulfill_call_step(), DispatchClass::Normal); + } + } + (T::WeightInfo::fulfill_call_rotate(), DispatchClass::Normal) + } } diff --git a/pallets/vector/src/state.rs b/pallets/vector/src/state.rs index f83e92271..6c981190b 100644 --- a/pallets/vector/src/state.rs +++ b/pallets/vector/src/state.rs @@ -16,68 +16,68 @@ use crate::verifier::{str_to_fq, VerificationError}; #[derive(Debug, PartialEq, Clone)] pub enum ParseError { - ParsingError, + ParsingError, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Encode, Decode, TypeInfo)] pub struct Groth16Proof { - pub a: Vec, - pub b: Vec>, - pub c: Vec, + pub a: Vec, + pub b: Vec>, + pub c: Vec, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct CircomProof { - #[serde(rename = "pi_a")] - pub pi_a: Vec, - #[serde(rename = "pi_b")] - pub pi_b: Vec>, - #[serde(rename = "pi_c")] - pub pi_c: Vec, - pub protocol: String, - pub curve: String, + #[serde(rename = "pi_a")] + pub pi_a: Vec, + #[serde(rename = "pi_b")] + pub pi_b: Vec>, + #[serde(rename = "pi_c")] + pub pi_c: Vec, + pub protocol: String, + pub curve: String, } impl CircomProof { - pub fn new(a: Vec, b: Vec>, c: Vec) -> Self { - CircomProof { - pi_a: a, - pi_b: b, - pi_c: c, - protocol: "groth16".to_string(), - curve: "bn128".to_string(), - } - } - - pub fn proof(self) -> Result, VerificationError> { - let a = G1Affine::new(str_to_fq(&self.pi_a[0])?, str_to_fq(&self.pi_a[1])?, false); - let b = G2Affine::new( - QuadExtField::new(str_to_fq(&self.pi_b[0][0])?, str_to_fq(&self.pi_b[0][1])?), - QuadExtField::new(str_to_fq(&self.pi_b[1][0])?, str_to_fq(&self.pi_b[1][1])?), - false, - ); - - let c = G1Affine::new(str_to_fq(&self.pi_c[0])?, str_to_fq(&self.pi_c[1])?, false); - Ok(Proof { a, b, c }) - } + pub fn new(a: Vec, b: Vec>, c: Vec) -> Self { + CircomProof { + pi_a: a, + pi_b: b, + pi_c: c, + protocol: "groth16".to_string(), + curve: "bn128".to_string(), + } + } + + pub fn proof(self) -> Result, VerificationError> { + let a = G1Affine::new(str_to_fq(&self.pi_a[0])?, str_to_fq(&self.pi_a[1])?, false); + let b = G2Affine::new( + QuadExtField::new(str_to_fq(&self.pi_b[0][0])?, str_to_fq(&self.pi_b[0][1])?), + QuadExtField::new(str_to_fq(&self.pi_b[1][0])?, str_to_fq(&self.pi_b[1][1])?), + false, + ); + + let c = G1Affine::new(str_to_fq(&self.pi_c[0])?, str_to_fq(&self.pi_c[1])?, false); + Ok(Proof { a, b, c }) + } } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct PublicSignals(pub Vec); impl PublicSignals { - pub fn from(public_signals: Vec) -> Self { - PublicSignals(public_signals) - } - - pub fn get(self) -> Result, VerificationError> { - let mut inputs: Vec = Vec::new(); - for input in self.0 { - let fr = Fr::from_str(&input).map_err(|_| VerificationError::InvalidVK)?; - inputs.push(fr); - } - Ok(inputs) - } + pub fn from(public_signals: Vec) -> Self { + PublicSignals(public_signals) + } + + pub fn get(self) -> Result, VerificationError> { + let mut inputs: Vec = Vec::new(); + for input in self.0 { + let fr = Fr::from_str(&input).map_err(|_| VerificationError::InvalidVK)?; + inputs.push(fr); + } + Ok(inputs) + } } /// Configuration struct that holds basic pallet configuration. @@ -85,54 +85,56 @@ impl PublicSignals { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Default)] pub struct Configuration { - #[codec(compact)] - pub slots_per_period: u64, - #[codec(compact)] - pub finality_threshold: u16, + #[codec(compact)] + pub slots_per_period: u64, + #[codec(compact)] + pub finality_threshold: u16, } + /// VerifiedStep struct that holds verified params from a step call. #[derive(Default, Debug)] pub struct VerifiedStep { - pub verified_function_id: H256, - pub verified_input_hash: H256, - pub verified_output: VerifiedStepOutput, + pub verified_function_id: H256, + pub verified_input_hash: H256, + pub verified_output: VerifiedStepOutput, } impl VerifiedStep { - pub(crate) const fn new( - verified_function_id: H256, - verified_input_hash: H256, - verified_output: VerifiedStepOutput, - ) -> VerifiedStep { - VerifiedStep { - verified_function_id, - verified_input_hash, - verified_output, - } - } + pub(crate) const fn new( + verified_function_id: H256, + verified_input_hash: H256, + verified_output: VerifiedStepOutput, + ) -> VerifiedStep { + VerifiedStep { + verified_function_id, + verified_input_hash, + verified_output, + } + } } /// VerifiedRotate struct that holds verified params from a rotate call. #[derive(Default)] pub struct VerifiedRotate { - pub verified_function_id: H256, - pub verified_input_hash: H256, - pub sync_committee_hash: U256, + pub verified_function_id: H256, + pub verified_input_hash: H256, + pub sync_committee_hash: U256, } + impl VerifiedRotate { - pub(crate) const fn new( - verified_function_id: H256, - verified_input_hash: H256, - sync_committee_hash: U256, - ) -> VerifiedRotate { - VerifiedRotate { - verified_function_id, - verified_input_hash, - sync_committee_hash, - } - } + pub(crate) const fn new( + verified_function_id: H256, + verified_input_hash: H256, + sync_committee_hash: U256, + ) -> VerifiedRotate { + VerifiedRotate { + verified_function_id, + verified_input_hash, + sync_committee_hash, + } + } } /// VerifiedStepOutput struct that holds a step output params. @@ -140,111 +142,111 @@ impl VerifiedRotate { #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] #[derive(Default)] pub struct VerifiedStepOutput { - pub finalized_header_root: H256, - pub execution_state_root: H256, - pub finalized_slot: u64, - pub participation: u16, + pub finalized_header_root: H256, + pub execution_state_root: H256, + pub finalized_slot: u64, + pub participation: u16, } /// parse_rotate_output converts the output of the successful rotate verification call pub fn parse_rotate_output(output: Vec) -> Result { - // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec - if output.len() as u32 > ROTATE_POSEIDON_OUTPUT_LENGTH { - return Err(ParsingError); - } - Ok(U256::from_big_endian(output.as_slice())) + // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec + if output.len() as u32 > ROTATE_POSEIDON_OUTPUT_LENGTH { + return Err(ParsingError); + } + Ok(U256::from_big_endian(output.as_slice())) } /// parse_step_output parses the output of the successful step verification call pub fn parse_step_output(output: Vec) -> Result { - // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec - if output.len() as u32 != STEP_OUTPUT_LENGTH { - return Err(ParsingError); - } - - let mut finalized_header_root: [u8; 32] = [0; 32]; - let mut execution_state_root: [u8; 32] = [0; 32]; - let mut finalized_slot: [u8; 8] = [0; 8]; - let mut participation: [u8; 2] = [0; 2]; - - finalized_header_root[..32].copy_from_slice(&output[..32]); - execution_state_root[..32].copy_from_slice(&output[32..64]); - - finalized_slot[..8].copy_from_slice(&output[64..72]); - participation[..2].copy_from_slice(&output[72..74]); - - Ok(VerifiedStepOutput { - finalized_header_root: H256(finalized_header_root), - execution_state_root: H256(execution_state_root), - finalized_slot: u64::from_be_bytes(finalized_slot), - participation: u16::from_be_bytes(participation), - }) + // output.len() is always less than `u32::MAX` because it is bounded by BoundedVec + if output.len() as u32 != STEP_OUTPUT_LENGTH { + return Err(ParsingError); + } + + let mut finalized_header_root: [u8; 32] = [0; 32]; + let mut execution_state_root: [u8; 32] = [0; 32]; + let mut finalized_slot: [u8; 8] = [0; 8]; + let mut participation: [u8; 2] = [0; 2]; + + finalized_header_root[..32].copy_from_slice(&output[..32]); + execution_state_root[..32].copy_from_slice(&output[32..64]); + + finalized_slot[..8].copy_from_slice(&output[64..72]); + participation[..2].copy_from_slice(&output[72..74]); + + Ok(VerifiedStepOutput { + finalized_header_root: H256(finalized_header_root), + execution_state_root: H256(execution_state_root), + finalized_slot: u64::from_be_bytes(finalized_slot), + participation: u16::from_be_bytes(participation), + }) } #[cfg(test)] mod tests { - use frame_support::{assert_err, assert_ok}; - use hex_literal::hex; - use sp_core::H256; + use frame_support::{assert_err, assert_ok}; + use hex_literal::hex; + use sp_core::H256; - use crate::state::ParseError::ParsingError; - use crate::state::{parse_rotate_output, parse_step_output}; + use crate::state::ParseError::ParsingError; + use crate::state::{parse_rotate_output, parse_step_output}; - #[test] - fn test_step_input() { - let input = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd"); - let pars = parse_step_output(input.to_vec()); + #[test] + fn test_step_input() { + let input = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd"); + let pars = parse_step_output(input.to_vec()); - assert_ok!(pars.clone()); - let parsed_data = pars.unwrap(); + assert_ok!(pars.clone()); + let parsed_data = pars.unwrap(); - assert_eq!(509, parsed_data.participation); - assert_eq!(7634848, parsed_data.finalized_slot); - assert_eq!( - H256(hex!( + assert_eq!(509, parsed_data.participation); + assert_eq!(7634848, parsed_data.finalized_slot); + assert_eq!( + H256(hex!( "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" )), - parsed_data.finalized_header_root - ); - assert_eq!( - H256(hex!( + parsed_data.finalized_header_root + ); + assert_eq!( + H256(hex!( "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" )), - parsed_data.execution_state_root - ); - } - - #[test] - fn test_parse_step_output_wrong_length() { - let input_less_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa01f"); - let pars = parse_step_output(input_less_then_expected.to_vec()); - - assert_err!(pars, ParsingError); - - let input_more_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b900000000000747fa001fdd"); - let pars = parse_step_output(input_more_then_expected.to_vec()); - - assert_err!(pars, ParsingError); - } - - #[test] - fn test_rotate_input() { - let input = hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4ed"); - let result = parse_rotate_output(input.to_vec()); - assert_ok!(result.clone()); - let poseidon_hash = result.unwrap(); - - assert_eq!( - "54093540030416808909802883566252424299549864556922470137474442232175269827821", - poseidon_hash.to_string() - ); - } - - #[test] - fn test_rotate_parse_wrong_length() { - let input_more_then_expected = - hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4edca"); - let result = parse_rotate_output(input_more_then_expected.to_vec()); - assert_err!(result, ParsingError); - } + parsed_data.execution_state_root + ); + } + + #[test] + fn test_parse_step_output_wrong_length() { + let input_less_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa01f"); + let pars = parse_step_output(input_less_then_expected.to_vec()); + + assert_err!(pars, ParsingError); + + let input_more_then_expected = hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b900000000000747fa001fdd"); + let pars = parse_step_output(input_more_then_expected.to_vec()); + + assert_err!(pars, ParsingError); + } + + #[test] + fn test_rotate_input() { + let input = hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4ed"); + let result = parse_rotate_output(input.to_vec()); + assert_ok!(result.clone()); + let poseidon_hash = result.unwrap(); + + assert_eq!( + "54093540030416808909802883566252424299549864556922470137474442232175269827821", + poseidon_hash.to_string() + ); + } + + #[test] + fn test_rotate_parse_wrong_length() { + let input_more_then_expected = + hex!("7797dbd1eecad8fe38dd849c43b7ea9a6e9e656c968056415132be4e3bfcd4edca"); + let result = parse_rotate_output(input_more_then_expected.to_vec()); + assert_err!(result, ParsingError); + } } diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 723151ee2..862b46c15 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -1,6 +1,6 @@ use crate::{mock::{ - new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, - ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, + new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, + ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, }, state::Configuration, storage_utils::MessageStatusEnum, Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, ValidProof, WhitelistedDomains, FunctionInputs, SyncCommitteeHashes}; use std::fs::File; use std::fs; @@ -8,9 +8,9 @@ use avail_core::data_proof::Message::FungibleToken; use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; use frame_support::{ - assert_err, assert_ok, - traits::{fungible::Inspect, DefensiveTruncateFrom}, - BoundedVec, + assert_err, assert_ok, + traits::{fungible::Inspect, DefensiveTruncateFrom}, + BoundedVec, }; use frame_system::RawOrigin; use hex_literal::hex; @@ -19,158 +19,158 @@ use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; use sp_runtime::{testing::H256, traits::BadOrigin}; const TEST_SENDER_VEC: [u8; 32] = - hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); + hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); fn get_valid_step_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") - .to_vec(), - ) + BoundedVec::truncate_from( + hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") + .to_vec(), + ) } fn get_valid_step_output() -> FunctionOutput { - BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) + BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) } fn get_valid_step_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) + BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) } fn get_valid_rotate_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), - ) + BoundedVec::truncate_from( + hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), + ) } fn get_valid_rotate_output() -> FunctionOutput { - BoundedVec::truncate_from( - hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), - ) + BoundedVec::truncate_from( + hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), + ) } fn get_valid_rotate_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) + BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) } fn get_invalid_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) + BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) } fn get_valid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), - BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), - BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), - BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), + BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), + BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), + BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), + ]) } fn get_valid_trimmed_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), - BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), - BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), + BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), + BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), + ]) } fn get_valid_trimmed_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), - BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), - BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), + BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), + BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), + ]) } fn get_invalid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), - BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), - BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), + BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), + BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), + ]) } fn get_valid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), - BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), - BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), - ]) + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), + BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), + BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), + ]) } fn get_invalid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), - BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), - BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), - BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), - ]) + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), + BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), + BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), + BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), + ]) } fn get_valid_amb_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), - BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), - BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), - BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), + BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), + BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), + BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), + ]) } fn get_valid_amb_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), - BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), - BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), - ]) + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), + BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), + BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), + ]) } pub fn get_valid_message() -> AddressedMessage { - let asset_id = H256::zero(); - let amount = 1_000_000_000_000_000_000u128; - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); + let asset_id = H256::zero(); + let amount = 1_000_000_000_000_000_000u128; + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); - AddressedMessage { - message: Message::FungibleToken { asset_id, amount }, - from: from.into(), - to: to.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } + AddressedMessage { + message: Message::FungibleToken { asset_id, amount }, + from: from.into(), + to: to.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } } fn get_valid_amb_message() -> AddressedMessage { - let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); + let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); - AddressedMessage { - message: Message::ArbitraryMessage(data), - from: from.into(), - to: recipient.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } + AddressedMessage { + message: Message::ArbitraryMessage(data), + from: from.into(), + to: recipient.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } } // // #[test] @@ -597,56 +597,56 @@ fn get_valid_amb_message() -> AddressedMessage { // #[test] fn test_fulfill_step_call() { - new_test_ext().execute_with(|| { - Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - inputs.clone(), - ); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + inputs.clone(), + ); - assert_ok!(result); + assert_ok!(result); - let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); + let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); - let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); - // ensure that event is fired - let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { - slot: finalized_slot, - finalization_root: H256(hex!( + let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); + // ensure that event is fired + let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { + slot: finalized_slot, + finalization_root: H256(hex!( "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" )), - execution_state_root: H256(hex!( + execution_state_root: H256(hex!( "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" )), - }); + }); - let header = Headers::::get(finalized_slot); - let head = Head::::get(); - let ex_state_root = ExecutionStateRoots::::get(finalized_slot); + let header = Headers::::get(finalized_slot); + let head = Head::::get(); + let ex_state_root = ExecutionStateRoots::::get(finalized_slot); - assert_eq!( - header, - H256(hex!( + assert_eq!( + header, + H256(hex!( "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" )) - ); - assert_eq!( - ex_state_root, - H256(hex!( + ); + assert_eq!( + ex_state_root, + H256(hex!( "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" )) - ); - assert_eq!(head, finalized_slot); - assert_eq!(expected_event, System::events()[0].event); - }); + ); + assert_eq!(head, finalized_slot); + assert_eq!(expected_event, System::events()[0].event); + }); } // #[test] @@ -682,63 +682,63 @@ fn test_fulfill_step_call() { #[test] fn test_fulfill_step_call_slot_behind_head() { - new_test_ext().execute_with(|| { - Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); - // move head forward - Head::::set(9678877); + // move head forward + Head::::set(9678877); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - inputs, - ); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + inputs, + ); - assert_err!(result, Error::::SlotBehindHead); - }); + assert_err!(result, Error::::SlotBehindHead); + }); } #[test] fn test_fulfill_rotate_call() { - new_test_ext().execute_with(|| { - Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - inputs, - ); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + inputs, + ); - assert_ok!(result); - // ensure that event is fired - let expected_hash = U256::from_dec_str( - "78004113044439342907882478475913997887515213797155324584820998418219758944903", - ) - .unwrap(); + assert_ok!(result); + // ensure that event is fired + let expected_hash = U256::from_dec_str( + "78004113044439342907882478475913997887515213797155324584820998418219758944903", + ) + .unwrap(); - let current_period = 1178; - let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { - period: current_period + 1, - root: expected_hash, - }); + let current_period = 1178; + let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { + period: current_period + 1, + root: expected_hash, + }); - let poseidon = SyncCommitteeHashes::::get(current_period + 1); + let poseidon = SyncCommitteeHashes::::get(current_period + 1); - assert_eq!(expected_event, System::events()[1].event); - assert_eq!(poseidon, expected_hash); - }); + assert_eq!(expected_event, System::events()[1].event); + assert_eq!(poseidon, expected_hash); + }); } // #[test] From dc5f8b9f23398103f4b24d8c5bb2a8a241c8a5ec Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 15:57:55 -0700 Subject: [PATCH 28/53] wip --- pallets/vector/src/lib.rs | 2 +- pallets/vector/src/tests.rs | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 9a4bfd021..2eaeeb798 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -459,7 +459,7 @@ pub mod pallet { let mut is_valid = true; let prev_head = store.finalized_header.slot; - + // 1. Apply sync committee updates, if any for (index, update) in updates.iter().enumerate() { is_valid = is_valid diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 862b46c15..95582c032 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -599,6 +599,8 @@ fn get_valid_amb_message() -> AddressedMessage { fn test_fulfill_step_call() { new_test_ext().execute_with(|| { Updater::::set(H256(TEST_SENDER_VEC)); + + // These inputs, encoded in CBOR format, would be passed in via the operator let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); ConfigurationStorage::::set(Configuration { @@ -608,7 +610,7 @@ fn test_fulfill_step_call() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, + STEP_FUNCTION_ID, // TODO: replace with working h256::zero inputs.clone(), ); @@ -708,6 +710,8 @@ fn test_fulfill_step_call_slot_behind_head() { fn test_fulfill_rotate_call() { new_test_ext().execute_with(|| { Updater::::set(H256(TEST_SENDER_VEC)); + + // These inputs, encoded in CBOR format, would be passed in via the operator let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); ConfigurationStorage::::set(Configuration { @@ -717,7 +721,7 @@ fn test_fulfill_rotate_call() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, + ROTATE_FUNCTION_ID, // TODO: replace with working h256::zero inputs, ); From 9d3682e21f0776c162c22e990af499836803f62f Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 16:12:51 -0700 Subject: [PATCH 29/53] alias helios packages --- Cargo.toml | 30 ++++++++++++------------- pallets/vector/Cargo.toml | 46 +++++++++++++++++++-------------------- pallets/vector/src/lib.rs | 6 ++--- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 097e886c5..cb5d297a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,16 @@ [workspace] resolver = "2" members = [ - "base", - "pallets/dactr", - "pallets/mandate", - "pallets/system", - "pallets/vector", - "patricia-merkle-trie", - "client/basic-authorship", - "runtime", - "runtime/fuzz", - "node", + "base", + "pallets/dactr", + "pallets/mandate", + "pallets/system", + "pallets/vector", + "patricia-merkle-trie", + "client/basic-authorship", + "runtime", + "runtime/fuzz", + "node", ] [workspace.package] @@ -27,9 +27,9 @@ kate = { git = "https://github.com/availproject/avail-core", tag = "core-node-2" kate-recovery = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } ssz-rs = { package = "ssz_rs", version = "0.9.0" } -alloy-primitives = { version= "0.7.7", features=[ "serde"] } -common = {git = "https://github.com/a16z/helios.git"} -consensus-core = {git = "https://github.com/a16z/helios.git"} +alloy-primitives = { version = "0.7.7", features = ["serde"] } +helios-common = { git = "https://github.com/a16z/helios.git", package = "common" } +helios-consensus-core = { git = "https://github.com/a16z/helios.git", package = "consensus-core" } serde_cbor = "0.11.2" # avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } # kate = { path = "../avail-core/kate/", default-features = false } @@ -53,7 +53,7 @@ frame-system-benchmarking = { path = "pallets/system/benchmarking", default-feat # benchmarking criterion = { version = "0.4", default-features = false } iai = "0.1.1" -iai-callgrind = "0.7.3" +iai-callgrind = "0.7.3" divan = "0.1.11" # codspeed-criterion-compat = "2.2.0" @@ -79,7 +79,7 @@ static_assertions = "1.1.0" serde = { version = "1.0.197", default-features = false, features = ["derive"] } serde_json = { version = "1.0", default-features = false } derive_more = { version = "0.99.17", default-features = false, features = ["from", "into", "display"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive","serde"] } +scale-info = { version = "2.5.0", default-features = false, features = ["derive", "serde"] } cfg-if = "1.0" impl-trait-for-tuples = "0.2.1" docify = "0.2.6" diff --git a/pallets/vector/Cargo.toml b/pallets/vector/Cargo.toml index dc75e1a09..8170ef0db 100644 --- a/pallets/vector/Cargo.toml +++ b/pallets/vector/Cargo.toml @@ -8,7 +8,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] frame-system = { workspace = true, default-features = false } -avail-core = { workspace = true, default-features = false, features = ["runtime"]} +avail-core = { workspace = true, default-features = false, features = ["runtime"] } avail-base = { workspace = true, default-features = false } patricia-merkle-trie = { workspace = true, default-features = false } @@ -33,8 +33,8 @@ trie-db.workspace = true rlp.workspace = true primitive-types.workspace = true ethabi.workspace = true -common.workspace = true -consensus-core.workspace = true +helios-common.workspace = true +helios-consensus-core.workspace = true alloy-primitives.workspace = true ssz-rs.workspace = true serde_cbor.workspace = true @@ -43,29 +43,29 @@ pallet-balances = { workspace = true, default-features = false, features = ["std pallet-timestamp = { workspace = true, default-features = false } [features] -default = [ "std" ] +default = ["std"] std = [ - "avail-base/std", - "avail-core/std", - "codec/std", - "frame-benchmarking?/std", - "frame-support/std", - "frame-system/std", - "scale-info/std", - "sp-core/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", + "avail-base/std", + "avail-core/std", + "codec/std", + "frame-benchmarking?/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", ] runtime-benchmarks = [ - "frame-benchmarking", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", + "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", ] try-runtime = [ - "frame-support/try-runtime", - "frame-system/try-runtime", - "sp-runtime/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "sp-runtime/try-runtime", ] diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 2eaeeb798..dd292ce68 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -4,8 +4,8 @@ use crate::{storage_utils::MessageStatusEnum, verifier::Verifier}; use avail_base::{MemoryTemporaryStorage, ProvidePostInherent}; use avail_core::data_proof::{tx_uid, AddressedMessage, Message, MessageType}; -use common::config::types::Forks; -use consensus_core::{apply_finality_update, apply_update, verify_finality_update, verify_update, types::{Bytes32, ByteVector, LightClientStore, Update, FinalityUpdate}}; +use helios_common::config::types::Forks; +use helios_consensus_core::{apply_finality_update, apply_update, verify_finality_update, verify_update, types::{Bytes32, ByteVector, LightClientStore, Update, FinalityUpdate}}; use alloy_primitives::B256; use ssz_rs::prelude::*; @@ -50,7 +50,7 @@ pub type BalanceOf = #[frame_support::pallet] pub mod pallet { - use consensus_core::get_bits; + use helios_consensus_core::get_bits; use ethabi::Token; use ethabi::Token::Uint; use frame_support::dispatch::GetDispatchInfo; From 610e0a2ff4de7b8a2af93c9eddef727225229dcc Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 16:20:54 -0700 Subject: [PATCH 30/53] revert state.rs diff --- pallets/vector/src/lib.rs | 2 +- pallets/vector/src/state.rs | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index dd292ce68..b697680c1 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -1174,7 +1174,7 @@ pub mod pallet { if verified_call.verified_function_id == function_id && verified_call.verified_input_hash == H256(input_hash) { - Ok(verified_call.sync_committee_hash) + Ok(verified_call.sync_committee_poseidon) } else { Err(Error::::RotateVerificationError.into()) } diff --git a/pallets/vector/src/state.rs b/pallets/vector/src/state.rs index 6c981190b..f9c158aad 100644 --- a/pallets/vector/src/state.rs +++ b/pallets/vector/src/state.rs @@ -91,7 +91,6 @@ pub struct Configuration { pub finality_threshold: u16, } - /// VerifiedStep struct that holds verified params from a step call. #[derive(Default, Debug)] pub struct VerifiedStep { @@ -119,7 +118,7 @@ impl VerifiedStep { pub struct VerifiedRotate { pub verified_function_id: H256, pub verified_input_hash: H256, - pub sync_committee_hash: U256, + pub sync_committee_poseidon: U256, } @@ -127,12 +126,12 @@ impl VerifiedRotate { pub(crate) const fn new( verified_function_id: H256, verified_input_hash: H256, - sync_committee_hash: U256, + sync_committee_poseidon: U256, ) -> VerifiedRotate { VerifiedRotate { verified_function_id, verified_input_hash, - sync_committee_hash, + sync_committee_poseidon, } } } From ccc464220e1cff8166ea201e180fe998cf7651f3 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 16:22:48 -0700 Subject: [PATCH 31/53] revert state.rs diff --- pallets/vector/src/state.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/pallets/vector/src/state.rs b/pallets/vector/src/state.rs index f9c158aad..e9a80bf1d 100644 --- a/pallets/vector/src/state.rs +++ b/pallets/vector/src/state.rs @@ -121,7 +121,6 @@ pub struct VerifiedRotate { pub sync_committee_poseidon: U256, } - impl VerifiedRotate { pub(crate) const fn new( verified_function_id: H256, From e11f774c58b33d05cca4c40ad34200bbe3a77fdd Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 16:39:51 -0700 Subject: [PATCH 32/53] revert spacing diff --- pallets/vector/src/lib.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index b697680c1..6878ed24e 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -46,7 +46,7 @@ pub const ROTATE_POSEIDON_OUTPUT_LENGTH: u32 = 32; pub const STEP_OUTPUT_LENGTH: u32 = 74; pub type BalanceOf = -<::Currency as Currency<::AccountId>>::Balance; + <::Currency as Currency<::AccountId>>::Balance; #[frame_support::pallet] pub mod pallet { @@ -233,13 +233,13 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn step_verification_key)] pub type StepVerificationKey = - StorageValue<_, Option>>, ValueQuery>; + StorageValue<_, Option>>, ValueQuery>; /// Rotate verification key storage. #[pallet::storage] #[pallet::getter(fn rotate_verification_key)] pub type RotateVerificationKey = - StorageValue<_, Option>>, ValueQuery>; + StorageValue<_, Option>>, ValueQuery>; /// Genesis validator root, used to check initialization. #[pallet::storage] @@ -282,9 +282,7 @@ pub mod pallet { /// based on this one. pub struct TestDefaultConfig; - #[derive_impl( - frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types - )] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] @@ -308,13 +306,13 @@ pub mod pallet { /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. #[pallet::no_default_bounds] type RuntimeCall: Parameter - + UnfilteredDispatchable - + GetDispatchInfo; + + UnfilteredDispatchable + + GetDispatchInfo; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; /// Currency type for this pallet. #[pallet::no_default] - type Currency: LockableCurrency>; + type Currency: LockableCurrency>; /// Dependency that can provide current time. #[pallet::no_default] type TimeProvider: UnixTime; @@ -440,7 +438,8 @@ pub mod pallet { /// function_id Function identifier. /// inputs Function input. #[pallet::call_index(0)] - #[pallet::weight(weight_helper::fulfill_call::< T > (* function_id))] // can't remove this + #[pallet::weight(weight_helper::fulfill_call::< T > (* function_id) + )] // can't remove this pub fn fulfill_call( origin: OriginFor, function_id: H256, From ce27633e09b7430bfcc0c813a0de7bbd56730eb9 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 16:50:50 -0700 Subject: [PATCH 33/53] revert more autoformatter changes --- pallets/vector/src/lib.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 6878ed24e..9797cde48 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -597,10 +597,10 @@ pub mod pallet { /// Executes message if a valid proofs are provided for the supported message type, assets and domains. #[pallet::call_index(1)] #[pallet::weight({ - match addr_message.message { - Message::ArbitraryMessage(ref data) => T::WeightInfo::execute_arbitrary_message(data.len() as u32), - Message::FungibleToken {..} => T::WeightInfo::execute_fungible_token(), - } + match addr_message.message { + Message::ArbitraryMessage(ref data) => T::WeightInfo::execute_arbitrary_message(data.len() as u32), + Message::FungibleToken {..} => T::WeightInfo::execute_fungible_token(), + } })] pub fn execute( origin: OriginFor, @@ -706,10 +706,10 @@ pub mod pallet { // send_message_arbitrary_message_doesnt_accept_asset_id(), send_message_arbitrary_message_doesnt_accept_empty_data() #[pallet::call_index(3)] #[pallet::weight({ - match message { - Message::ArbitraryMessage(ref data) => T::WeightInfo::send_message_arbitrary_message(data.len() as u32), - Message::FungibleToken{..} => T::WeightInfo::send_message_fungible_token(), - } + match message { + Message::ArbitraryMessage(ref data) => T::WeightInfo::send_message_arbitrary_message(data.len() as u32), + Message::FungibleToken{..} => T::WeightInfo::send_message_fungible_token(), + } })] pub fn send_message( origin: OriginFor, @@ -878,8 +878,8 @@ pub mod pallet { #[pallet::call_index(11)] #[pallet::weight(( - T::WeightInfo::failed_tx_index(0u32), - DispatchClass::Mandatory + T::WeightInfo::failed_tx_index(0u32), + DispatchClass::Mandatory ))] pub fn failed_send_message_txs( origin: OriginFor, @@ -939,10 +939,10 @@ pub mod pallet { amount.saturated_into(), ExistenceRequirement::KeepAlive, )?; - } + }, Message::ArbitraryMessage(data) => { ensure!(!data.is_empty(), Error::::InvalidBridgeInputs) - } + }, }; let message_id = Self::fetch_curr_message_id().map_err(|e| e)?; From 33a184e257f5dd8a5230bf28e645f55446974b48 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:02:33 -0700 Subject: [PATCH 34/53] revert cargo toml spaces to tabs --- Cargo.toml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cb5d297a3..5e1a842eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,16 @@ [workspace] resolver = "2" members = [ - "base", - "pallets/dactr", - "pallets/mandate", - "pallets/system", - "pallets/vector", - "patricia-merkle-trie", - "client/basic-authorship", - "runtime", - "runtime/fuzz", - "node", + "base", + "pallets/dactr", + "pallets/mandate", + "pallets/system", + "pallets/vector", + "patricia-merkle-trie", + "client/basic-authorship", + "runtime", + "runtime/fuzz", + "node", ] [workspace.package] From 3d773b4d3cbb3c153fa27b777e88696d7b4e9cba Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:07:04 -0700 Subject: [PATCH 35/53] revert cargo toml spaces to tabs --- pallets/vector/Cargo.toml | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/pallets/vector/Cargo.toml b/pallets/vector/Cargo.toml index 8170ef0db..9e1be8f75 100644 --- a/pallets/vector/Cargo.toml +++ b/pallets/vector/Cargo.toml @@ -45,27 +45,27 @@ pallet-timestamp = { workspace = true, default-features = false } [features] default = ["std"] std = [ - "avail-base/std", - "avail-core/std", - "codec/std", - "frame-benchmarking?/std", - "frame-support/std", - "frame-system/std", - "scale-info/std", - "sp-core/std", - "sp-io/std", - "sp-runtime/std", - "sp-std/std", + "avail-base/std", + "avail-core/std", + "codec/std", + "frame-benchmarking?/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", ] runtime-benchmarks = [ - "frame-benchmarking", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", + "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", ] try-runtime = [ - "frame-support/try-runtime", - "frame-system/try-runtime", - "sp-runtime/try-runtime", -] + "frame-support/try-runtime", + "frame-system/try-runtime", + "sp-runtime/try-runtime", +] \ No newline at end of file From 841057f599e3edac80878eb97f94edeef3bbed29 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:19:12 -0700 Subject: [PATCH 36/53] separate new tests into tests_new --- pallets/vector/src/lib.rs | 26 +- pallets/vector/src/tests.rs | 2191 ++++++++++++++++--------------- pallets/vector/src/tests_new.rs | 130 ++ 3 files changed, 1258 insertions(+), 1089 deletions(-) create mode 100644 pallets/vector/src/tests_new.rs diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 9797cde48..827b109e4 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -26,11 +26,16 @@ pub mod constants; mod mock; mod state; mod storage_utils; + +// Use new tests made with light client inputs +// #[cfg(test)] +// mod tests; #[cfg(test)] -mod tests; +mod tests_new; mod verifier; mod weights; + pub use pallet::*; pub type FunctionInput = BoundedVec>; @@ -46,7 +51,7 @@ pub const ROTATE_POSEIDON_OUTPUT_LENGTH: u32 = 32; pub const STEP_OUTPUT_LENGTH: u32 = 74; pub type BalanceOf = - <::Currency as Currency<::AccountId>>::Balance; +<::Currency as Currency<::AccountId>>::Balance; #[frame_support::pallet] pub mod pallet { @@ -233,13 +238,13 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn step_verification_key)] pub type StepVerificationKey = - StorageValue<_, Option>>, ValueQuery>; + StorageValue<_, Option>>, ValueQuery>; /// Rotate verification key storage. #[pallet::storage] #[pallet::getter(fn rotate_verification_key)] pub type RotateVerificationKey = - StorageValue<_, Option>>, ValueQuery>; + StorageValue<_, Option>>, ValueQuery>; /// Genesis validator root, used to check initialization. #[pallet::storage] @@ -282,7 +287,8 @@ pub mod pallet { /// based on this one. pub struct TestDefaultConfig; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types + )] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] @@ -306,13 +312,13 @@ pub mod pallet { /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. #[pallet::no_default_bounds] type RuntimeCall: Parameter - + UnfilteredDispatchable - + GetDispatchInfo; + + UnfilteredDispatchable + + GetDispatchInfo; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; /// Currency type for this pallet. #[pallet::no_default] - type Currency: LockableCurrency>; + type Currency: LockableCurrency>; /// Dependency that can provide current time. #[pallet::no_default] type TimeProvider: UnixTime; @@ -939,10 +945,10 @@ pub mod pallet { amount.saturated_into(), ExistenceRequirement::KeepAlive, )?; - }, + } Message::ArbitraryMessage(data) => { ensure!(!data.is_empty(), Error::::InvalidBridgeInputs) - }, + } }; let message_id = Self::fetch_curr_message_id().map_err(|e| e)?; diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs index 95582c032..d8263c8dc 100644 --- a/pallets/vector/src/tests.rs +++ b/pallets/vector/src/tests.rs @@ -1,9 +1,15 @@ -use crate::{mock::{ - new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, - ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, -}, state::Configuration, storage_utils::MessageStatusEnum, Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, ValidProof, WhitelistedDomains, FunctionInputs, SyncCommitteeHashes}; -use std::fs::File; -use std::fs; +use crate::{ + mock::{ + new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, + ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, + }, + state::Configuration, + storage_utils::MessageStatusEnum, + Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, + FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, + RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, + ValidProof, WhitelistedDomains, +}; use avail_core::data_proof::Message::FungibleToken; use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; @@ -172,464 +178,471 @@ fn get_valid_amb_message() -> AddressedMessage { id: 0, } } -// -// #[test] -// fn test_fulfill_step_call_proof_not_valid() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_invalid_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::VerificationFailed); -// }); -// } -// -// #[test] -// fn test_fulfill_step_call_not_valid_function_id() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// let invalid_function_id: H256 = H256(hex!( -// "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" -// )); -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// invalid_function_id, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::FunctionIdNotKnown); -// }); -// } -// -// #[test] -// fn test_fulfill_step_call_finality_not_met() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// SyncCommitteePoseidons::::insert( -// 931, -// U256::from(hex!( -// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" -// )), -// ); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 512, // max finality -// }); -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::NotEnoughParticipants); -// }); -// } -// -// #[test] -// fn test_fulfill_step_call_wrong_updater_address() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// let invalid_function_id: H256 = H256(hex!( -// "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" -// )); -// -// let wrong_updater: AccountId32 = AccountId32::new([1u8; 32]); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(wrong_updater), -// invalid_function_id, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::UpdaterMisMatch); -// }); -// } -// -// #[test] -// fn test_execute_fungible_token_via_storage() { -// new_test_ext().execute_with(|| { -// let balance_before = Balances::balance(&Bridge::account_id()); -// Broadcasters::::set( -// 2, -// H256(hex!( -// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" -// )), -// ); -// -// let slot = 8581263; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// -// let account_proof = get_valid_account_proof(); -// let storage_proof = get_valid_storage_proof(); -// let message = get_valid_message(); -// let message_encoded = message.clone().abi_encode(); -// let message_root = H256(keccak_256(message_encoded.as_slice())); -// -// // amount in message 1000000000000000000 -// let result = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message, -// account_proof, -// storage_proof, -// ); -// -// let expected_message_root: H256 = H256(hex!( -// "efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8" -// )); -// let balance_left = Balances::balance(&Bridge::account_id()); -// assert_ok!(result); -// assert_eq!( -// balance_before.saturating_sub(1000000000000000000u128), -// balance_left -// ); -// assert_eq!(expected_message_root, message_root); -// assert_eq!( -// MessageStatus::::get(message_root), -// MessageStatusEnum::ExecutionSucceeded -// ); -// }); -// } -// -// #[test] -// fn test_execute_fungible_token_via_storage_with_trimmed_storage_value() { -// new_test_ext().execute_with(|| { -// let balance_before = Balances::balance(&Bridge::account_id()); -// Broadcasters::::set( -// 2, -// H256(hex!( -// "1369a4c9391cf90d393b40faead521b0f7019dc5000000000000000000000000" -// )), -// ); -// -// let slot = 4965568; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "5e3fe0dd03c7ce3f89524cfa65545232bbf52645b52ac0a3939f766540a6ed69" -// )), -// ); -// -// let account_proof = get_valid_trimmed_account_proof(); -// let storage_proof = get_valid_trimmed_storage_proof(); -// -// let message = AddressedMessage { -// message: FungibleToken { -// asset_id: H256::zero(), -// amount: 10_000_000_000_000_000, -// }, -// from: H256(hex!( -// "8d31529525f23b14767d4dde78567ca083d3d56f000000000000000000000000" -// )), -// to: H256(hex!( -// "1a985fdff5f6eee4afce1dc0f367ab925cdca57e7e8585329830fc3ce6ef4e7a" -// )), -// origin_domain: 2, -// destination_domain: 1, -// id: 5469, -// }; -// -// let message_encoded = message.clone().abi_encode(); -// let message_root = H256(keccak_256(message_encoded.as_slice())); -// -// // amount in message 1000000000000000000 -// let result = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message, -// account_proof, -// storage_proof, -// ); -// -// let expected_message_root: H256 = H256(hex!( -// "00eee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99" -// )); -// let balance_left = Balances::balance(&Bridge::account_id()); -// assert_ok!(result); -// assert_eq!( -// balance_before.saturating_sub(10_000_000_000_000_000u128), -// balance_left -// ); -// assert_eq!(expected_message_root, message_root); -// assert_eq!( -// MessageStatus::::get(message_root), -// MessageStatusEnum::ExecutionSucceeded -// ); -// }); -// } -// -// #[test] -// fn test_execute_message_with_frozen_chain() { -// new_test_ext().execute_with(|| { -// Broadcasters::::set( -// 2, -// H256(hex!( -// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" -// )), -// ); -// -// let slot = 8581263; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// -// let message = get_valid_message(); -// let account_proof = get_valid_account_proof(); -// let storage_proof = get_valid_storage_proof(); -// -// // Goal: Prevent from executing message -// SourceChainFrozen::::set(2, true); -// let error = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message, -// account_proof, -// storage_proof, -// ); -// -// assert_err!(error, Error::::SourceChainFrozen); -// }); -// } -// -// #[test] -// fn test_execute_message_with_faulty_account_proof() { -// new_test_ext().execute_with(|| { -// Broadcasters::::set( -// 2, -// H256(hex!( -// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" -// )), -// ); -// -// let slot = 8581263; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// -// let account_proof = get_invalid_account_proof(); -// let storage_proof = get_valid_storage_proof(); -// let message = get_valid_message(); -// -// let fail = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message, -// account_proof, -// storage_proof, -// ); -// -// // invalid proof should return error -// assert_err!(fail, Error::::CannotGetStorageRoot); -// }); -// } -// -// #[test] -// fn test_execute_message_with_faulty_storage_proof() { -// new_test_ext().execute_with(|| { -// Broadcasters::::set( -// 2, -// H256(hex!( -// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" -// )), -// ); -// -// let slot = 8581263; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// let account_proof = get_valid_account_proof(); -// let storage_proof = get_invalid_storage_proof(); -// let message = get_valid_message(); -// -// let fail = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message, -// account_proof, -// storage_proof, -// ); -// -// // invalid storage proof should return error -// assert_err!(fail, Error::::CannotGetStorageValue); -// }); -// } -// -// #[test] -// fn test_execute_message_with_already_executed_message() { -// new_test_ext().execute_with(|| { -// let balance_before_transfer = Balances::balance(&Bridge::account_id()); -// -// Broadcasters::::set( -// 2, -// H256(hex!( -// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" -// )), -// ); -// -// let slot = 8581263; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// -// let message = get_valid_message(); -// let account_proof = get_valid_account_proof(); -// let storage_proof = get_valid_storage_proof(); -// let account: AccountId32 = AccountId32::from_slice(message.to.as_bytes()).unwrap(); -// let account_balance_before = Balances::balance(&account); -// -// let ok = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message.clone(), -// account_proof.clone(), -// storage_proof.clone(), -// ); -// -// assert_ok!(ok); -// let balance_after_transfer = Balances::balance(&Bridge::account_id()); -// let expected_transfered_value = 1000000000000000000u128; -// assert_eq!( -// balance_before_transfer, -// balance_after_transfer.saturating_add(expected_transfered_value) -// ); -// let account_balance = Balances::balance(&account); -// assert_eq!(account_balance_before, 0); -// assert_eq!(account_balance, expected_transfered_value); -// -// let fail = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message, -// account_proof, -// storage_proof, -// ); -// -// assert_err!(fail, Error::::MessageAlreadyExecuted); -// }); -// } -// -// #[test] -// fn test_execute_message_with_unsupported_domain() { -// new_test_ext().execute_with(|| { -// Broadcasters::::set( -// 2, -// H256(hex!( -// "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" -// )), -// ); -// -// let slot = 8581263; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// -// let mut message = get_valid_message(); -// // alter message -// message.origin_domain = 4; -// -// let account_proof = get_valid_account_proof(); -// let storage_proof = get_valid_storage_proof(); -// -// let fail = Bridge::execute( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// slot, -// message, -// account_proof, -// storage_proof, -// ); -// -// assert_err!(fail, Error::::UnsupportedOriginChain); -// }); -// } -// + #[test] -fn test_fulfill_step_call() { +fn test_fulfill_step_call_proof_not_valid() { new_test_ext().execute_with(|| { + let slot = 7634942; Updater::::set(H256(TEST_SENDER_VEC)); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_invalid_proof(), + slot, + ); - // These inputs, encoded in CBOR format, would be passed in via the operator - let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); + assert_err!(result, Error::::VerificationFailed); + }); +} +#[test] +fn test_fulfill_step_call_not_valid_function_id() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); ConfigurationStorage::::set(Configuration { slots_per_period: 8192, finality_threshold: 461, }); + let invalid_function_id: H256 = H256(hex!( + "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" + )); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + invalid_function_id, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::FunctionIdNotKnown); + }); +} + +#[test] +fn test_fulfill_step_call_finality_not_met() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 512, // max finality + }); let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, // TODO: replace with working h256::zero - inputs.clone(), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::NotEnoughParticipants); + }); +} + +#[test] +fn test_fulfill_step_call_wrong_updater_address() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + let invalid_function_id: H256 = H256(hex!( + "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" + )); + + let wrong_updater: AccountId32 = AccountId32::new([1u8; 32]); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(wrong_updater), + invalid_function_id, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, ); + assert_err!(result, Error::::UpdaterMisMatch); + }); +} + +#[test] +fn test_execute_fungible_token_via_storage() { + new_test_ext().execute_with(|| { + let balance_before = Balances::balance(&Bridge::account_id()); + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + let message = get_valid_message(); + let message_encoded = message.clone().abi_encode(); + let message_root = H256(keccak_256(message_encoded.as_slice())); + + // amount in message 1000000000000000000 + let result = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + let expected_message_root: H256 = H256(hex!( + "efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8" + )); + let balance_left = Balances::balance(&Bridge::account_id()); assert_ok!(result); + assert_eq!( + balance_before.saturating_sub(1000000000000000000u128), + balance_left + ); + assert_eq!(expected_message_root, message_root); + assert_eq!( + MessageStatus::::get(message_root), + MessageStatusEnum::ExecutionSucceeded + ); + }); +} + +#[test] +fn test_execute_fungible_token_via_storage_with_trimmed_storage_value() { + new_test_ext().execute_with(|| { + let balance_before = Balances::balance(&Bridge::account_id()); + Broadcasters::::set( + 2, + H256(hex!( + "1369a4c9391cf90d393b40faead521b0f7019dc5000000000000000000000000" + )), + ); + + let slot = 4965568; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "5e3fe0dd03c7ce3f89524cfa65545232bbf52645b52ac0a3939f766540a6ed69" + )), + ); + + let account_proof = get_valid_trimmed_account_proof(); + let storage_proof = get_valid_trimmed_storage_proof(); + + let message = AddressedMessage { + message: FungibleToken { + asset_id: H256::zero(), + amount: 10_000_000_000_000_000, + }, + from: H256(hex!( + "8d31529525f23b14767d4dde78567ca083d3d56f000000000000000000000000" + )), + to: H256(hex!( + "1a985fdff5f6eee4afce1dc0f367ab925cdca57e7e8585329830fc3ce6ef4e7a" + )), + origin_domain: 2, + destination_domain: 1, + id: 5469, + }; + + let message_encoded = message.clone().abi_encode(); + let message_root = H256(keccak_256(message_encoded.as_slice())); + + // amount in message 1000000000000000000 + let result = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + let expected_message_root: H256 = H256(hex!( + "00eee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99" + )); + let balance_left = Balances::balance(&Bridge::account_id()); + assert_ok!(result); + assert_eq!( + balance_before.saturating_sub(10_000_000_000_000_000u128), + balance_left + ); + assert_eq!(expected_message_root, message_root); + assert_eq!( + MessageStatus::::get(message_root), + MessageStatusEnum::ExecutionSucceeded + ); + }); +} + +#[test] +fn test_execute_message_with_frozen_chain() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_message(); + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + + // Goal: Prevent from executing message + SourceChainFrozen::::set(2, true); + let error = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + assert_err!(error, Error::::SourceChainFrozen); + }); +} + +#[test] +fn test_execute_message_with_faulty_account_proof() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let account_proof = get_invalid_account_proof(); + let storage_proof = get_valid_storage_proof(); + let message = get_valid_message(); - let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + // invalid proof should return error + assert_err!(fail, Error::::CannotGetStorageRoot); + }); +} + +#[test] +fn test_execute_message_with_faulty_storage_proof() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + let account_proof = get_valid_account_proof(); + let storage_proof = get_invalid_storage_proof(); + let message = get_valid_message(); + + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + // invalid storage proof should return error + assert_err!(fail, Error::::CannotGetStorageValue); + }); +} + +#[test] +fn test_execute_message_with_already_executed_message() { + new_test_ext().execute_with(|| { + let balance_before_transfer = Balances::balance(&Bridge::account_id()); + + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_message(); + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + let account: AccountId32 = AccountId32::from_slice(message.to.as_bytes()).unwrap(); + let account_balance_before = Balances::balance(&account); + + let ok = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + + assert_ok!(ok); + let balance_after_transfer = Balances::balance(&Bridge::account_id()); + let expected_transfered_value = 1000000000000000000u128; + assert_eq!( + balance_before_transfer, + balance_after_transfer.saturating_add(expected_transfered_value) + ); + let account_balance = Balances::balance(&account); + assert_eq!(account_balance_before, 0); + assert_eq!(account_balance, expected_transfered_value); + + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + assert_err!(fail, Error::::MessageAlreadyExecuted); + }); +} + +#[test] +fn test_execute_message_with_unsupported_domain() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let mut message = get_valid_message(); + // alter message + message.origin_domain = 4; + + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + assert_err!(fail, Error::::UnsupportedOriginChain); + }); +} - let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); +#[test] +fn test_fulfill_step_call() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_ok!(result); + let finalized_slot = 7634848; // ensure that event is fired let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { slot: finalized_slot, finalization_root: H256(hex!( - "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" + "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" )), execution_state_root: H256(hex!( - "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" + "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" )), }); + let finalized_slot = 7634848; + let header = Headers::::get(finalized_slot); let head = Head::::get(); let ex_state_root = ExecutionStateRoots::::get(finalized_slot); @@ -637,13 +650,13 @@ fn test_fulfill_step_call() { assert_eq!( header, H256(hex!( - "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" + "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" )) ); assert_eq!( ex_state_root, H256(hex!( - "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" + "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" )) ); assert_eq!(head, finalized_slot); @@ -651,45 +664,52 @@ fn test_fulfill_step_call() { }); } -// #[test] -// fn test_fulfill_step_call_wrong_poseidon() { -// new_test_ext().execute_with(|| { -// Updater::::set(H256(TEST_SENDER_VEC)); -// -// // current poseidon is not the same as the one in the valid proof -// SyncCommitteePoseidons::::insert( -// 931, -// U256::from(hex!( -// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332da" -// )), -// ); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// -// assert_err!(result, Error::::StepVerificationError); -// }); -// } +#[test] +fn test_fulfill_step_call_wrong_poseidon() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + // current poseidon is not the same as the one in the valid proof + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332da" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::StepVerificationError); + }); +} #[test] fn test_fulfill_step_call_slot_behind_head() { new_test_ext().execute_with(|| { + let slot = 7634942; Updater::::set(H256(TEST_SENDER_VEC)); - let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); // move head forward - Head::::set(9678877); + Head::::set(8634942); ConfigurationStorage::::set(Configuration { slots_per_period: 8192, @@ -699,7 +719,10 @@ fn test_fulfill_step_call_slot_behind_head() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), STEP_FUNCTION_ID, - inputs, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, ); assert_err!(result, Error::::SlotBehindHead); @@ -709,633 +732,643 @@ fn test_fulfill_step_call_slot_behind_head() { #[test] fn test_fulfill_rotate_call() { new_test_ext().execute_with(|| { + let slot = 7634942; Updater::::set(H256(TEST_SENDER_VEC)); - // These inputs, encoded in CBOR format, would be passed in via the operator - let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); - ConfigurationStorage::::set(Configuration { slots_per_period: 8192, finality_threshold: 342, }); + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" + )), + ); + let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, // TODO: replace with working h256::zero - inputs, + ROTATE_FUNCTION_ID, + get_valid_rotate_input(), + get_valid_rotate_output(), + get_valid_rotate_proof(), + slot, ); assert_ok!(result); // ensure that event is fired - let expected_hash = U256::from_dec_str( - "78004113044439342907882478475913997887515213797155324584820998418219758944903", + let expected_poseidon = U256::from_dec_str( + "16399439943012933445970260519503780180385945954293268151243539801891563949197", ) .unwrap(); - let current_period = 1178; + let current_period = 931; let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { period: current_period + 1, - root: expected_hash, + root: expected_poseidon, + }); + + let poseidon = SyncCommitteePoseidons::::get(current_period + 1); + + assert_eq!(expected_event, System::events()[0].event); + assert_eq!(poseidon, expected_poseidon); + }); +} + +#[test] +fn test_fulfill_rotate_call_wrong_header() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + // set current wrong header for valid rotate call + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" + )), + ); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + get_valid_rotate_input(), + get_valid_rotate_output(), + get_valid_rotate_proof(), + slot, + ); + + assert_err!(result, Error::::RotateVerificationError); + }); +} + +#[test] +fn test_fulfill_call_function_ids_not_set() { + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + + Bridge::set_function_ids(RawOrigin::Root.into(), None).unwrap(); + let slot = 7634942; + let err = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + assert_err!(err, Error::::FunctionIdsAreNotSet); + }); +} + +#[test] +fn test_fulfill_step_call_verification_key_is_not_set() { + new_test_ext().execute_with(|| { + Bridge::set_step_verification_key(RawOrigin::Root.into(), None).unwrap(); + Updater::::set(H256(TEST_SENDER_VEC)); + + let slot = 7634942; + + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let err = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + assert_err!(err, Error::::VerificationKeyIsNotSet); + }); +} + +#[test] +fn test_fulfill_rotate_call_verification_key_is_not_set() { + new_test_ext().execute_with(|| { + Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None).unwrap(); + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" + )), + ); + + let err = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + get_valid_rotate_input(), + get_valid_rotate_output(), + get_valid_rotate_proof(), + slot, + ); + assert_err!(err, Error::::VerificationKeyIsNotSet); + }); +} + +#[test] +fn set_whitelisted_domains_works_with_root() { + new_test_ext().execute_with(|| { + let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); + assert_ne!(WhitelistedDomains::::get(), domains); + + let ok = Bridge::set_whitelisted_domains(RawOrigin::Root.into(), domains.clone()); + assert_ok!(ok); + assert_eq!(WhitelistedDomains::::get(), domains); + + System::assert_last_event(RuntimeEvent::Bridge(Event::WhitelistedDomainsUpdated)); + }); +} + +#[test] +fn set_whitelisted_domains_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_whitelisted_domains(origin, domains.clone()); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_configuration_works_with_root() { + new_test_ext().execute_with(|| { + let conf = Configuration { + slots_per_period: 1, + finality_threshold: 69, + }; + assert_ne!(ConfigurationStorage::::get(), conf); + + let ok = Bridge::set_configuration(RawOrigin::Root.into(), conf); + assert_ok!(ok); + assert_eq!(ConfigurationStorage::::get(), conf); + + let expected_event = RuntimeEvent::Bridge(Event::ConfigurationUpdated { + slots_per_period: conf.slots_per_period, + finality_threshold: conf.finality_threshold, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_configuration_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let conf = Configuration { + slots_per_period: 1, + finality_threshold: 69, + }; + + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_configuration(origin, conf); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_broadcaster_works_with_root() { + new_test_ext().execute_with(|| { + let domain = 2; + let old = Broadcasters::::get(domain); + assert_ne!(old, STEP_FUNCTION_ID); + + let ok = Bridge::set_broadcaster(RawOrigin::Root.into(), domain, STEP_FUNCTION_ID); + assert_ok!(ok); + assert_eq!(Broadcasters::::get(domain), STEP_FUNCTION_ID); + + let expected_event = RuntimeEvent::Bridge(Event::BroadcasterUpdated { + old, + new: STEP_FUNCTION_ID, + domain, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_broadcaster_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_broadcaster(origin, 2, STEP_FUNCTION_ID); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_poseidon_hash_works_with_root() { + new_test_ext().execute_with(|| { + let period = 2; + let poseidon_hash = BoundedVec::try_from( + [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, + ] + .to_vec(), + ) + .unwrap(); + let root = U256::from_dec_str( + "1780731860627700044960722568376592200742329637303199754547598369979440671", + ) + .unwrap(); + assert_ne!(SyncCommitteePoseidons::::get(period), root); + + let ok = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); + assert_ok!(ok); + assert_eq!(SyncCommitteePoseidons::::get(period), root); + + let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { period, root }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_poseidon_hash_wrong_hash_length() { + new_test_ext().execute_with(|| { + let period = 2; + let poseidon_hash = BoundedVec::try_from( + [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + ] + .to_vec(), + ) + .unwrap(); + + let error = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); + assert_err!(error, Error::::CannotParseOutputData); + assert_eq!(SyncCommitteePoseidons::::get(period), U256::zero()); + }); +} + +#[test] +fn set_poseidon_hash_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let root = BoundedVec::try_from([0, 1, 2, 3, 4].to_vec()).unwrap(); + + let ok = Bridge::set_poseidon_hash(origin, 2, root); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn source_chain_froze_works_with_root() { + new_test_ext().execute_with(|| { + let source_chain_id = 2; + let frozen = true; + assert_ne!(SourceChainFrozen::::get(source_chain_id), frozen); + + let ok = Bridge::source_chain_froze(RawOrigin::Root.into(), source_chain_id, frozen); + assert_ok!(ok); + assert_eq!(SourceChainFrozen::::get(source_chain_id), frozen); + + let expected_event = RuntimeEvent::Bridge(Event::SourceChainFrozen { + source_chain_id, + frozen, }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn source_chain_froze_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + + let ok = Bridge::source_chain_froze(origin, 2, true); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn send_message_arbitrary_message_works() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::ArbitraryMessage(BoundedVec::truncate_from([0, 1, 2, 3].to_vec())); + let to = ROTATE_FUNCTION_ID; + let domain = 2; + + let event = Event::MessageSubmitted { + from: TEST_SENDER_VEC.into(), + to, + message_type: message.r#type(), + destination_domain: domain, + message_id: tx_uid(1, 0), + }; + let ok = Bridge::send_message(origin, message, to, domain); + assert_ok!(ok); + System::assert_last_event(RuntimeEvent::Bridge(event)); + }); +} + +#[test] +fn send_message_arbitrary_message_doesnt_accept_empty_data() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::ArbitraryMessage(BoundedVec::truncate_from(vec![])); + + let ok = Bridge::send_message(origin, message, ROTATE_FUNCTION_ID, 2); + assert_err!(ok, Error::::InvalidBridgeInputs); + }); +} + +#[test] +fn send_message_fungible_token_works() { + new_test_ext().execute_with(|| { + use crate::BalanceOf; + use frame_support::traits::Currency; + + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::FungibleToken { + asset_id: H256::zero(), + amount: 100, + }; + let to = ROTATE_FUNCTION_ID; + let domain = 2; - let poseidon = SyncCommitteeHashes::::get(current_period + 1); + Balances::make_free_balance_be( + &TEST_SENDER_VEC.into(), + BalanceOf::::max_value() / 2u128, + ); + + let event = Event::MessageSubmitted { + from: TEST_SENDER_VEC.into(), + to, + message_type: message.r#type(), + destination_domain: domain, + message_id: tx_uid(1, 0), + }; + let ok = Bridge::send_message(origin, message, to, domain); + assert_ok!(ok); + System::assert_last_event(RuntimeEvent::Bridge(event)); + }); +} - assert_eq!(expected_event, System::events()[1].event); - assert_eq!(poseidon, expected_hash); +#[test] +fn send_message_fungible_token_does_not_accept_zero_amount() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::FungibleToken { + asset_id: H256::zero(), + amount: 0, + }; + let to = ROTATE_FUNCTION_ID; + let domain = 2; + + let err = Bridge::send_message(origin, message, to, domain); + assert_err!(err, Error::::InvalidBridgeInputs); }); } -// #[test] -// fn test_fulfill_rotate_call_wrong_header() { -// new_test_ext().execute_with(|| { -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 342, -// }); -// // set current wrong header for valid rotate call -// Headers::::set( -// slot, -// H256(hex!( -// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" -// )), -// ); -// -// let result = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// ROTATE_FUNCTION_ID, -// inputs, -// ); -// -// assert_err!(result, Error::::RotateVerificationError); -// }); -// } - -// #[test] -// fn test_fulfill_call_function_ids_not_set() { -// new_test_ext().execute_with(|| { -// Updater::::set(H256(TEST_SENDER_VEC)); -// -// Bridge::set_function_ids(RawOrigin::Root.into(), None).unwrap(); -// let slot = 7634942; -// let err = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// assert_err!(err, Error::::FunctionIdsAreNotSet); -// }); -// } -// -// #[test] -// fn test_fulfill_step_call_verification_key_is_not_set() { -// new_test_ext().execute_with(|| { -// Bridge::set_step_verification_key(RawOrigin::Root.into(), None).unwrap(); -// Updater::::set(H256(TEST_SENDER_VEC)); -// -// let slot = 7634942; -// -// SyncCommitteePoseidons::::insert( -// 931, -// U256::from(hex!( -// "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" -// )), -// ); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 461, -// }); -// -// let err = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// STEP_FUNCTION_ID, -// get_valid_step_input(), -// get_valid_step_output(), -// get_valid_step_proof(), -// slot, -// ); -// assert_err!(err, Error::::VerificationKeyIsNotSet); -// }); -// } -// -// #[test] -// fn test_fulfill_rotate_call_verification_key_is_not_set() { -// new_test_ext().execute_with(|| { -// Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None).unwrap(); -// let slot = 7634942; -// Updater::::set(H256(TEST_SENDER_VEC)); -// -// ConfigurationStorage::::set(Configuration { -// slots_per_period: 8192, -// finality_threshold: 342, -// }); -// -// Headers::::set( -// slot, -// H256(hex!( -// "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" -// )), -// ); -// -// let err = Bridge::fulfill_call( -// RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), -// ROTATE_FUNCTION_ID, -// get_valid_rotate_input(), -// get_valid_rotate_output(), -// get_valid_rotate_proof(), -// slot, -// ); -// assert_err!(err, Error::::VerificationKeyIsNotSet); -// }); -// } -// -// #[test] -// fn set_whitelisted_domains_works_with_root() { -// new_test_ext().execute_with(|| { -// let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); -// assert_ne!(WhitelistedDomains::::get(), domains); -// -// let ok = Bridge::set_whitelisted_domains(RawOrigin::Root.into(), domains.clone()); -// assert_ok!(ok); -// assert_eq!(WhitelistedDomains::::get(), domains); -// -// System::assert_last_event(RuntimeEvent::Bridge(Event::WhitelistedDomainsUpdated)); -// }); -// } -// -// #[test] -// fn set_whitelisted_domains_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let ok = Bridge::set_whitelisted_domains(origin, domains.clone()); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn set_configuration_works_with_root() { -// new_test_ext().execute_with(|| { -// let conf = Configuration { -// slots_per_period: 1, -// finality_threshold: 69, -// }; -// assert_ne!(ConfigurationStorage::::get(), conf); -// -// let ok = Bridge::set_configuration(RawOrigin::Root.into(), conf); -// assert_ok!(ok); -// assert_eq!(ConfigurationStorage::::get(), conf); -// -// let expected_event = RuntimeEvent::Bridge(Event::ConfigurationUpdated { -// slots_per_period: conf.slots_per_period, -// finality_threshold: conf.finality_threshold, -// }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn set_configuration_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let conf = Configuration { -// slots_per_period: 1, -// finality_threshold: 69, -// }; -// -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let ok = Bridge::set_configuration(origin, conf); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn set_broadcaster_works_with_root() { -// new_test_ext().execute_with(|| { -// let domain = 2; -// let old = Broadcasters::::get(domain); -// assert_ne!(old, STEP_FUNCTION_ID); -// -// let ok = Bridge::set_broadcaster(RawOrigin::Root.into(), domain, STEP_FUNCTION_ID); -// assert_ok!(ok); -// assert_eq!(Broadcasters::::get(domain), STEP_FUNCTION_ID); -// -// let expected_event = RuntimeEvent::Bridge(Event::BroadcasterUpdated { -// old, -// new: STEP_FUNCTION_ID, -// domain, -// }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn set_broadcaster_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let ok = Bridge::set_broadcaster(origin, 2, STEP_FUNCTION_ID); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn set_poseidon_hash_works_with_root() { -// new_test_ext().execute_with(|| { -// let period = 2; -// let poseidon_hash = BoundedVec::try_from( -// [ -// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -// 23, 24, 25, 26, 27, 28, 29, 30, 31, -// ] -// .to_vec(), -// ) -// .unwrap(); -// let root = U256::from_dec_str( -// "1780731860627700044960722568376592200742329637303199754547598369979440671", -// ) -// .unwrap(); -// assert_ne!(SyncCommitteePoseidons::::get(period), root); -// -// let ok = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); -// assert_ok!(ok); -// assert_eq!(SyncCommitteePoseidons::::get(period), root); -// -// let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { period, root }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn set_poseidon_hash_wrong_hash_length() { -// new_test_ext().execute_with(|| { -// let period = 2; -// let poseidon_hash = BoundedVec::try_from( -// [ -// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -// 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -// ] -// .to_vec(), -// ) -// .unwrap(); -// -// let error = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); -// assert_err!(error, Error::::CannotParseOutputData); -// assert_eq!(SyncCommitteePoseidons::::get(period), U256::zero()); -// }); -// } -// -// #[test] -// fn set_poseidon_hash_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let root = BoundedVec::try_from([0, 1, 2, 3, 4].to_vec()).unwrap(); -// -// let ok = Bridge::set_poseidon_hash(origin, 2, root); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn source_chain_froze_works_with_root() { -// new_test_ext().execute_with(|| { -// let source_chain_id = 2; -// let frozen = true; -// assert_ne!(SourceChainFrozen::::get(source_chain_id), frozen); -// -// let ok = Bridge::source_chain_froze(RawOrigin::Root.into(), source_chain_id, frozen); -// assert_ok!(ok); -// assert_eq!(SourceChainFrozen::::get(source_chain_id), frozen); -// -// let expected_event = RuntimeEvent::Bridge(Event::SourceChainFrozen { -// source_chain_id, -// frozen, -// }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn source_chain_froze_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// -// let ok = Bridge::source_chain_froze(origin, 2, true); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn send_message_arbitrary_message_works() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let message = Message::ArbitraryMessage(BoundedVec::truncate_from([0, 1, 2, 3].to_vec())); -// let to = ROTATE_FUNCTION_ID; -// let domain = 2; -// -// let event = Event::MessageSubmitted { -// from: TEST_SENDER_VEC.into(), -// to, -// message_type: message.r#type(), -// destination_domain: domain, -// message_id: tx_uid(1, 0), -// }; -// let ok = Bridge::send_message(origin, message, to, domain); -// assert_ok!(ok); -// System::assert_last_event(RuntimeEvent::Bridge(event)); -// }); -// } -// -// #[test] -// fn send_message_arbitrary_message_doesnt_accept_empty_data() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let message = Message::ArbitraryMessage(BoundedVec::truncate_from(vec![])); -// -// let ok = Bridge::send_message(origin, message, ROTATE_FUNCTION_ID, 2); -// assert_err!(ok, Error::::InvalidBridgeInputs); -// }); -// } -// -// #[test] -// fn send_message_fungible_token_works() { -// new_test_ext().execute_with(|| { -// use crate::BalanceOf; -// use frame_support::traits::Currency; -// -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let message = Message::FungibleToken { -// asset_id: H256::zero(), -// amount: 100, -// }; -// let to = ROTATE_FUNCTION_ID; -// let domain = 2; -// -// Balances::make_free_balance_be( -// &TEST_SENDER_VEC.into(), -// BalanceOf::::max_value() / 2u128, -// ); -// -// let event = Event::MessageSubmitted { -// from: TEST_SENDER_VEC.into(), -// to, -// message_type: message.r#type(), -// destination_domain: domain, -// message_id: tx_uid(1, 0), -// }; -// let ok = Bridge::send_message(origin, message, to, domain); -// assert_ok!(ok); -// System::assert_last_event(RuntimeEvent::Bridge(event)); -// }); -// } -// -// #[test] -// fn send_message_fungible_token_does_not_accept_zero_amount() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let message = Message::FungibleToken { -// asset_id: H256::zero(), -// amount: 0, -// }; -// let to = ROTATE_FUNCTION_ID; -// let domain = 2; -// -// let err = Bridge::send_message(origin, message, to, domain); -// assert_err!(err, Error::::InvalidBridgeInputs); -// }); -// } -// -// #[test] -// fn execute_arbitrary_message_works() { -// new_test_ext().execute_with(|| { -// use crate::BalanceOf; -// use frame_support::traits::Currency; -// -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// Balances::make_free_balance_be( -// &TEST_SENDER_VEC.into(), -// BalanceOf::::max_value() / 2u128, -// ); -// -// Broadcasters::::set( -// 2, -// H256(hex!( -// "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" -// )), -// ); -// -// let slot = 5085118; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// -// let message = get_valid_amb_message(); -// let account_proof = get_valid_amb_account_proof(); -// let storage_proof = get_valid_amb_storage_proof(); -// -// let ok = Bridge::execute( -// origin, -// slot, -// message.clone(), -// account_proof.clone(), -// storage_proof.clone(), -// ); -// assert_ok!(ok); -// let encoded_data = message.clone().abi_encode(); -// let message_root = H256(keccak_256(encoded_data.as_slice())); -// -// let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { -// from: message.from, -// to: message.to, -// message_id: message.id, -// message_root, -// }); -// System::assert_last_event(expected_event); -// assert_eq!( -// MessageStatus::::get(message_root), -// MessageStatusEnum::ExecutionSucceeded -// ) -// }); -// } -// -// #[test] -// fn test_double_execute_arbitrary_message() { -// new_test_ext().execute_with(|| { -// use crate::BalanceOf; -// use frame_support::traits::Currency; -// -// let origin1 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let origin2 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// Balances::make_free_balance_be( -// &TEST_SENDER_VEC.into(), -// BalanceOf::::max_value() / 2u128, -// ); -// -// Broadcasters::::set( -// 2, -// H256(hex!( -// "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" -// )), -// ); -// -// let slot = 5085118; -// ExecutionStateRoots::::set( -// slot, -// H256(hex!( -// "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" -// )), -// ); -// -// let message = get_valid_amb_message(); -// -// let account_proof = get_valid_amb_account_proof(); -// let storage_proof = get_valid_amb_storage_proof(); -// -// let ok = Bridge::execute( -// origin1, -// slot, -// message.clone(), -// account_proof.clone(), -// storage_proof.clone(), -// ); -// assert_ok!(ok); -// -// let err = Bridge::execute( -// origin2, -// slot, -// message.clone(), -// account_proof.clone(), -// storage_proof.clone(), -// ); -// assert_err!(err, Error::::MessageAlreadyExecuted); -// -// let encoded_data = message.clone().abi_encode(); -// let message_root = H256(keccak_256(encoded_data.as_slice())); -// -// let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { -// from: message.from, -// to: message.to, -// message_id: message.id, -// message_root, -// }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn set_function_ids_works_with_root() { -// new_test_ext().execute_with(|| { -// let ok = Bridge::set_function_ids(RawOrigin::Root.into(), None); -// assert_ok!(ok); -// assert_eq!(FunctionIds::::get(), None); -// -// let value = Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID)); -// let ok = Bridge::set_function_ids(RawOrigin::Root.into(), value); -// assert_ok!(ok); -// assert_eq!(FunctionIds::::get(), value); -// -// let expected_event = RuntimeEvent::Bridge(Event::FunctionIdsUpdated { value }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn set_function_ids_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let ok = Bridge::set_function_ids(origin, None); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn set_step_verification_key_works_with_root() { -// new_test_ext().execute_with(|| { -// let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), None); -// assert_ok!(ok); -// assert_eq!(StepVerificationKey::::get(), None); -// -// let value = Some(BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap()); -// let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), value.clone()); -// assert_ok!(ok); -// assert_eq!(StepVerificationKey::::get(), value.clone()); -// -// let expected_event = RuntimeEvent::Bridge(Event::StepVerificationKeyUpdated { value }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn set_step_verification_key_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let ok = Bridge::set_step_verification_key(origin, None); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn set_rotate_verification_key_works_with_root() { -// new_test_ext().execute_with(|| { -// let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None); -// assert_ok!(ok); -// assert_eq!(RotateVerificationKey::::get(), None); -// -// let value = Some(BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap()); -// let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), value.clone()); -// assert_ok!(ok); -// assert_eq!(RotateVerificationKey::::get(), value.clone()); -// -// let expected_event = RuntimeEvent::Bridge(Event::RotateVerificationKeyUpdated { value }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn set_rotate_verification_key_does_not_work_with_non_root() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let ok = Bridge::set_rotate_verification_key(origin, None); -// assert_err!(ok, BadOrigin); -// }); -// } -// -// #[test] -// fn update_updater() { -// new_test_ext().execute_with(|| { -// let old_updater = H256(TEST_SENDER_VEC); -// Updater::::set(old_updater); -// -// let new_updater = H256([2u8; 32]); -// let ok = Bridge::set_updater(RawOrigin::Root.into(), new_updater); -// assert_ok!(ok); -// -// let expected_event = RuntimeEvent::Bridge(Event::NewUpdater { -// old: old_updater, -// new: new_updater, -// }); -// System::assert_last_event(expected_event); -// }); -// } -// -// #[test] -// fn update_updater_non_root() { -// new_test_ext().execute_with(|| { -// let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); -// let old_updater = H256(TEST_SENDER_VEC); -// Updater::::set(old_updater); -// let new_updater = H256([2u8; 32]); -// -// let err = Bridge::set_updater(origin, new_updater); -// assert_err!(err, BadOrigin); -// assert_eq!(old_updater, Updater::::get()); -// }); -// } +#[test] +fn execute_arbitrary_message_works() { + new_test_ext().execute_with(|| { + use crate::BalanceOf; + use frame_support::traits::Currency; + + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + Balances::make_free_balance_be( + &TEST_SENDER_VEC.into(), + BalanceOf::::max_value() / 2u128, + ); + + Broadcasters::::set( + 2, + H256(hex!( + "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" + )), + ); + + let slot = 5085118; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_amb_message(); + let account_proof = get_valid_amb_account_proof(); + let storage_proof = get_valid_amb_storage_proof(); + + let ok = Bridge::execute( + origin, + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + assert_ok!(ok); + let encoded_data = message.clone().abi_encode(); + let message_root = H256(keccak_256(encoded_data.as_slice())); + + let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { + from: message.from, + to: message.to, + message_id: message.id, + message_root, + }); + System::assert_last_event(expected_event); + assert_eq!( + MessageStatus::::get(message_root), + MessageStatusEnum::ExecutionSucceeded + ) + }); +} + +#[test] +fn test_double_execute_arbitrary_message() { + new_test_ext().execute_with(|| { + use crate::BalanceOf; + use frame_support::traits::Currency; + + let origin1 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let origin2 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + Balances::make_free_balance_be( + &TEST_SENDER_VEC.into(), + BalanceOf::::max_value() / 2u128, + ); + + Broadcasters::::set( + 2, + H256(hex!( + "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" + )), + ); + + let slot = 5085118; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_amb_message(); + + let account_proof = get_valid_amb_account_proof(); + let storage_proof = get_valid_amb_storage_proof(); + + let ok = Bridge::execute( + origin1, + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + assert_ok!(ok); + + let err = Bridge::execute( + origin2, + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + assert_err!(err, Error::::MessageAlreadyExecuted); + + let encoded_data = message.clone().abi_encode(); + let message_root = H256(keccak_256(encoded_data.as_slice())); + + let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { + from: message.from, + to: message.to, + message_id: message.id, + message_root, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_function_ids_works_with_root() { + new_test_ext().execute_with(|| { + let ok = Bridge::set_function_ids(RawOrigin::Root.into(), None); + assert_ok!(ok); + assert_eq!(FunctionIds::::get(), None); + + let value = Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID)); + let ok = Bridge::set_function_ids(RawOrigin::Root.into(), value); + assert_ok!(ok); + assert_eq!(FunctionIds::::get(), value); + + let expected_event = RuntimeEvent::Bridge(Event::FunctionIdsUpdated { value }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_function_ids_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_function_ids(origin, None); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_step_verification_key_works_with_root() { + new_test_ext().execute_with(|| { + let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), None); + assert_ok!(ok); + assert_eq!(StepVerificationKey::::get(), None); + + let value = Some(BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap()); + let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), value.clone()); + assert_ok!(ok); + assert_eq!(StepVerificationKey::::get(), value.clone()); + + let expected_event = RuntimeEvent::Bridge(Event::StepVerificationKeyUpdated { value }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_step_verification_key_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_step_verification_key(origin, None); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_rotate_verification_key_works_with_root() { + new_test_ext().execute_with(|| { + let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None); + assert_ok!(ok); + assert_eq!(RotateVerificationKey::::get(), None); + + let value = Some(BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap()); + let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), value.clone()); + assert_ok!(ok); + assert_eq!(RotateVerificationKey::::get(), value.clone()); + + let expected_event = RuntimeEvent::Bridge(Event::RotateVerificationKeyUpdated { value }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_rotate_verification_key_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_rotate_verification_key(origin, None); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn update_updater() { + new_test_ext().execute_with(|| { + let old_updater = H256(TEST_SENDER_VEC); + Updater::::set(old_updater); + + let new_updater = H256([2u8; 32]); + let ok = Bridge::set_updater(RawOrigin::Root.into(), new_updater); + assert_ok!(ok); + + let expected_event = RuntimeEvent::Bridge(Event::NewUpdater { + old: old_updater, + new: new_updater, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn update_updater_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let old_updater = H256(TEST_SENDER_VEC); + Updater::::set(old_updater); + let new_updater = H256([2u8; 32]); + + let err = Bridge::set_updater(origin, new_updater); + assert_err!(err, BadOrigin); + assert_eq!(old_updater, Updater::::get()); + }); +} \ No newline at end of file diff --git a/pallets/vector/src/tests_new.rs b/pallets/vector/src/tests_new.rs new file mode 100644 index 000000000..22cd29f69 --- /dev/null +++ b/pallets/vector/src/tests_new.rs @@ -0,0 +1,130 @@ +use std::fs; +use frame_support::{assert_err, assert_ok}; +use hex_literal::hex; +use primitive_types::{H256, U256}; +use sp_core::crypto::AccountId32; +use crate::mock::{new_test_ext, Bridge,RuntimeEvent, RuntimeOrigin, System, Test, ROTATE_FUNCTION_ID, STEP_FUNCTION_ID}; +use crate::{ConfigurationStorage,Error, Event, ExecutionStateRoots, FunctionInputs, Head, Headers, SyncCommitteeHashes, Updater}; +use crate::state::Configuration; +const TEST_SENDER_VEC: [u8; 32] = + hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); +const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); + +#[test] +fn test_fulfill_step_call() { + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + + // These inputs, encoded in CBOR format, would be passed in via the operator + let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, // TODO: replace with working h256::zero + inputs.clone(), + ); + + assert_ok!(result); + + let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); + + let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); + // ensure that event is fired + let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { + slot: finalized_slot, + finalization_root: H256(hex!( + "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" + )), + execution_state_root: H256(hex!( + "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" + )), + }); + + let header = Headers::::get(finalized_slot); + let head = Head::::get(); + let ex_state_root = ExecutionStateRoots::::get(finalized_slot); + + assert_eq!( + header, + H256(hex!( + "a6e3468985f31ca58e34fe0a40a72f4bbc08d4d00a0933d28b07ddb95d1faf95" + )) + ); + assert_eq!( + ex_state_root, + H256(hex!( + "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" + )) + ); + assert_eq!(head, finalized_slot); + assert_eq!(expected_event, System::events()[0].event); + }); +} + +#[test] +fn test_fulfill_step_call_slot_behind_head() { + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + let inputs: Vec = fs::read("./examples/step_call.cbor").unwrap(); + + // move head forward + Head::::set(9678877); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + inputs, + ); + + assert_err!(result, Error::::SlotBehindHead); + }); +} + +#[test] +fn test_fulfill_rotate_call() { + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + + // These inputs, encoded in CBOR format, would be passed in via the operator + let inputs: Vec = fs::read("./examples/rotate_call.cbor").unwrap(); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, // TODO: replace with working h256::zero + inputs, + ); + + assert_ok!(result); + // ensure that event is fired + let expected_hash = U256::from_dec_str( + "78004113044439342907882478475913997887515213797155324584820998418219758944903", + ) + .unwrap(); + + let current_period = 1178; + let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { + period: current_period + 1, + root: expected_hash, + }); + + let poseidon = SyncCommitteeHashes::::get(current_period + 1); + + assert_eq!(expected_event, System::events()[1].event); + assert_eq!(poseidon, expected_hash); + }); +} \ No newline at end of file From c3c0e33692b10a62f9f77656fbefe4f256ca3c74 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:23:40 -0700 Subject: [PATCH 37/53] fix formatting again --- pallets/vector/src/lib.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 827b109e4..94bb47c7b 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -51,7 +51,7 @@ pub const ROTATE_POSEIDON_OUTPUT_LENGTH: u32 = 32; pub const STEP_OUTPUT_LENGTH: u32 = 74; pub type BalanceOf = -<::Currency as Currency<::AccountId>>::Balance; + <::Currency as Currency<::AccountId>>::Balance; #[frame_support::pallet] pub mod pallet { @@ -238,13 +238,13 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn step_verification_key)] pub type StepVerificationKey = - StorageValue<_, Option>>, ValueQuery>; + StorageValue<_, Option>>, ValueQuery>; /// Rotate verification key storage. #[pallet::storage] #[pallet::getter(fn rotate_verification_key)] pub type RotateVerificationKey = - StorageValue<_, Option>>, ValueQuery>; + StorageValue<_, Option>>, ValueQuery>; /// Genesis validator root, used to check initialization. #[pallet::storage] @@ -287,8 +287,7 @@ pub mod pallet { /// based on this one. pub struct TestDefaultConfig; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types - )] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] @@ -312,13 +311,13 @@ pub mod pallet { /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. #[pallet::no_default_bounds] type RuntimeCall: Parameter - + UnfilteredDispatchable - + GetDispatchInfo; + + UnfilteredDispatchable + + GetDispatchInfo; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; /// Currency type for this pallet. #[pallet::no_default] - type Currency: LockableCurrency>; + type Currency: LockableCurrency>; /// Dependency that can provide current time. #[pallet::no_default] type TimeProvider: UnixTime; @@ -945,10 +944,10 @@ pub mod pallet { amount.saturated_into(), ExistenceRequirement::KeepAlive, )?; - } + }, Message::ArbitraryMessage(data) => { ensure!(!data.is_empty(), Error::::InvalidBridgeInputs) - } + }, }; let message_id = Self::fetch_curr_message_id().map_err(|e| e)?; From 21d813f2f9eabeecaa11f750d2f5dd1e0eb0e205 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:25:07 -0700 Subject: [PATCH 38/53] fix formatting again --- pallets/vector/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 94bb47c7b..8903608f2 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -443,8 +443,7 @@ pub mod pallet { /// function_id Function identifier. /// inputs Function input. #[pallet::call_index(0)] - #[pallet::weight(weight_helper::fulfill_call::< T > (* function_id) - )] // can't remove this + #[pallet::weight(weight_helper::fulfill_call::(* function_id))] // can't remove this pub fn fulfill_call( origin: OriginFor, function_id: H256, From 50fef992aa7451d5492f9eaaef741dcddaad6a28 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:28:45 -0700 Subject: [PATCH 39/53] revert tests + fix formatting --- pallets/vector/src/lib.rs | 5 +- pallets/vector/src/tests.rs | 1374 ----------------------------------- 2 files changed, 3 insertions(+), 1376 deletions(-) delete mode 100644 pallets/vector/src/tests.rs diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 8903608f2..3dbecfd48 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -311,7 +311,7 @@ pub mod pallet { /// Because this pallet has dispatchables, it depends on the runtime's definition of a call. #[pallet::no_default_bounds] type RuntimeCall: Parameter - + UnfilteredDispatchable + + UnfilteredDispatchable + GetDispatchInfo; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; @@ -443,7 +443,8 @@ pub mod pallet { /// function_id Function identifier. /// inputs Function input. #[pallet::call_index(0)] - #[pallet::weight(weight_helper::fulfill_call::(* function_id))] // can't remove this + // Unused parameter that's hard to remove, would mess up traits + #[pallet::weight(weight_helper::fulfill_call::(* function_id))] pub fn fulfill_call( origin: OriginFor, function_id: H256, diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs deleted file mode 100644 index d8263c8dc..000000000 --- a/pallets/vector/src/tests.rs +++ /dev/null @@ -1,1374 +0,0 @@ -use crate::{ - mock::{ - new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, - ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, - }, - state::Configuration, - storage_utils::MessageStatusEnum, - Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, - FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, - RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, - ValidProof, WhitelistedDomains, -}; -use avail_core::data_proof::Message::FungibleToken; -use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; - -use frame_support::{ - assert_err, assert_ok, - traits::{fungible::Inspect, DefensiveTruncateFrom}, - BoundedVec, -}; -use frame_system::RawOrigin; -use hex_literal::hex; -use primitive_types::U256; -use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; -use sp_runtime::{testing::H256, traits::BadOrigin}; - -const TEST_SENDER_VEC: [u8; 32] = - hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); -const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); - -fn get_valid_step_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") - .to_vec(), - ) -} - -fn get_valid_step_output() -> FunctionOutput { - BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) -} - -fn get_valid_step_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) -} - -fn get_valid_rotate_input() -> FunctionInput { - BoundedVec::truncate_from( - hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), - ) -} - -fn get_valid_rotate_output() -> FunctionOutput { - BoundedVec::truncate_from( - hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), - ) -} - -fn get_valid_rotate_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) -} - -fn get_invalid_proof() -> FunctionProof { - BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) -} - -fn get_valid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), - BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), - BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), - BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), - ]) -} - -fn get_valid_trimmed_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), - BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), - BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), - ]) -} - -fn get_valid_trimmed_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), - BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), - BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), - ]) -} - -fn get_invalid_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), - BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), - BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), - BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), - ]) -} - -fn get_valid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), - BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), - BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), - ]) -} - -fn get_invalid_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), - BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), - BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), - BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), - ]) -} - -fn get_valid_amb_account_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), - BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), - BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), - BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), - BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), - ]) -} - -fn get_valid_amb_storage_proof() -> ValidProof { - BoundedVec::truncate_from(vec![ - BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), - BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), - BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), - ]) -} - -pub fn get_valid_message() -> AddressedMessage { - let asset_id = H256::zero(); - let amount = 1_000_000_000_000_000_000u128; - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); - - AddressedMessage { - message: Message::FungibleToken { asset_id, amount }, - from: from.into(), - to: to.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } -} - -fn get_valid_amb_message() -> AddressedMessage { - let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); - let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); - let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); - - AddressedMessage { - message: Message::ArbitraryMessage(data), - from: from.into(), - to: recipient.into(), - origin_domain: 2, - destination_domain: 1, - id: 0, - } -} - -#[test] -fn test_fulfill_step_call_proof_not_valid() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_invalid_proof(), - slot, - ); - - assert_err!(result, Error::::VerificationFailed); - }); -} - -#[test] -fn test_fulfill_step_call_not_valid_function_id() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - let invalid_function_id: H256 = H256(hex!( - "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" - )); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - invalid_function_id, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::FunctionIdNotKnown); - }); -} - -#[test] -fn test_fulfill_step_call_finality_not_met() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 512, // max finality - }); - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::NotEnoughParticipants); - }); -} - -#[test] -fn test_fulfill_step_call_wrong_updater_address() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - let invalid_function_id: H256 = H256(hex!( - "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" - )); - - let wrong_updater: AccountId32 = AccountId32::new([1u8; 32]); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(wrong_updater), - invalid_function_id, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::UpdaterMisMatch); - }); -} - -#[test] -fn test_execute_fungible_token_via_storage() { - new_test_ext().execute_with(|| { - let balance_before = Balances::balance(&Bridge::account_id()); - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - let message = get_valid_message(); - let message_encoded = message.clone().abi_encode(); - let message_root = H256(keccak_256(message_encoded.as_slice())); - - // amount in message 1000000000000000000 - let result = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - let expected_message_root: H256 = H256(hex!( - "efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8" - )); - let balance_left = Balances::balance(&Bridge::account_id()); - assert_ok!(result); - assert_eq!( - balance_before.saturating_sub(1000000000000000000u128), - balance_left - ); - assert_eq!(expected_message_root, message_root); - assert_eq!( - MessageStatus::::get(message_root), - MessageStatusEnum::ExecutionSucceeded - ); - }); -} - -#[test] -fn test_execute_fungible_token_via_storage_with_trimmed_storage_value() { - new_test_ext().execute_with(|| { - let balance_before = Balances::balance(&Bridge::account_id()); - Broadcasters::::set( - 2, - H256(hex!( - "1369a4c9391cf90d393b40faead521b0f7019dc5000000000000000000000000" - )), - ); - - let slot = 4965568; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "5e3fe0dd03c7ce3f89524cfa65545232bbf52645b52ac0a3939f766540a6ed69" - )), - ); - - let account_proof = get_valid_trimmed_account_proof(); - let storage_proof = get_valid_trimmed_storage_proof(); - - let message = AddressedMessage { - message: FungibleToken { - asset_id: H256::zero(), - amount: 10_000_000_000_000_000, - }, - from: H256(hex!( - "8d31529525f23b14767d4dde78567ca083d3d56f000000000000000000000000" - )), - to: H256(hex!( - "1a985fdff5f6eee4afce1dc0f367ab925cdca57e7e8585329830fc3ce6ef4e7a" - )), - origin_domain: 2, - destination_domain: 1, - id: 5469, - }; - - let message_encoded = message.clone().abi_encode(); - let message_root = H256(keccak_256(message_encoded.as_slice())); - - // amount in message 1000000000000000000 - let result = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - let expected_message_root: H256 = H256(hex!( - "00eee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99" - )); - let balance_left = Balances::balance(&Bridge::account_id()); - assert_ok!(result); - assert_eq!( - balance_before.saturating_sub(10_000_000_000_000_000u128), - balance_left - ); - assert_eq!(expected_message_root, message_root); - assert_eq!( - MessageStatus::::get(message_root), - MessageStatusEnum::ExecutionSucceeded - ); - }); -} - -#[test] -fn test_execute_message_with_frozen_chain() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_message(); - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - - // Goal: Prevent from executing message - SourceChainFrozen::::set(2, true); - let error = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - assert_err!(error, Error::::SourceChainFrozen); - }); -} - -#[test] -fn test_execute_message_with_faulty_account_proof() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let account_proof = get_invalid_account_proof(); - let storage_proof = get_valid_storage_proof(); - let message = get_valid_message(); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - // invalid proof should return error - assert_err!(fail, Error::::CannotGetStorageRoot); - }); -} - -#[test] -fn test_execute_message_with_faulty_storage_proof() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - let account_proof = get_valid_account_proof(); - let storage_proof = get_invalid_storage_proof(); - let message = get_valid_message(); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - // invalid storage proof should return error - assert_err!(fail, Error::::CannotGetStorageValue); - }); -} - -#[test] -fn test_execute_message_with_already_executed_message() { - new_test_ext().execute_with(|| { - let balance_before_transfer = Balances::balance(&Bridge::account_id()); - - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_message(); - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - let account: AccountId32 = AccountId32::from_slice(message.to.as_bytes()).unwrap(); - let account_balance_before = Balances::balance(&account); - - let ok = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - - assert_ok!(ok); - let balance_after_transfer = Balances::balance(&Bridge::account_id()); - let expected_transfered_value = 1000000000000000000u128; - assert_eq!( - balance_before_transfer, - balance_after_transfer.saturating_add(expected_transfered_value) - ); - let account_balance = Balances::balance(&account); - assert_eq!(account_balance_before, 0); - assert_eq!(account_balance, expected_transfered_value); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - assert_err!(fail, Error::::MessageAlreadyExecuted); - }); -} - -#[test] -fn test_execute_message_with_unsupported_domain() { - new_test_ext().execute_with(|| { - Broadcasters::::set( - 2, - H256(hex!( - "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" - )), - ); - - let slot = 8581263; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let mut message = get_valid_message(); - // alter message - message.origin_domain = 4; - - let account_proof = get_valid_account_proof(); - let storage_proof = get_valid_storage_proof(); - - let fail = Bridge::execute( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - slot, - message, - account_proof, - storage_proof, - ); - - assert_err!(fail, Error::::UnsupportedOriginChain); - }); -} - -#[test] -fn test_fulfill_step_call() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_ok!(result); - let finalized_slot = 7634848; - // ensure that event is fired - let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { - slot: finalized_slot, - finalization_root: H256(hex!( - "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" - )), - execution_state_root: H256(hex!( - "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" - )), - }); - - let finalized_slot = 7634848; - - let header = Headers::::get(finalized_slot); - let head = Head::::get(); - let ex_state_root = ExecutionStateRoots::::get(finalized_slot); - - assert_eq!( - header, - H256(hex!( - "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" - )) - ); - assert_eq!( - ex_state_root, - H256(hex!( - "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" - )) - ); - assert_eq!(head, finalized_slot); - assert_eq!(expected_event, System::events()[0].event); - }); -} - -#[test] -fn test_fulfill_step_call_wrong_poseidon() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - // current poseidon is not the same as the one in the valid proof - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332da" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::StepVerificationError); - }); -} - -#[test] -fn test_fulfill_step_call_slot_behind_head() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - // move head forward - Head::::set(8634942); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - - assert_err!(result, Error::::SlotBehindHead); - }); -} - -#[test] -fn test_fulfill_rotate_call() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" - )), - ); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), - slot, - ); - - assert_ok!(result); - // ensure that event is fired - let expected_poseidon = U256::from_dec_str( - "16399439943012933445970260519503780180385945954293268151243539801891563949197", - ) - .unwrap(); - - let current_period = 931; - let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { - period: current_period + 1, - root: expected_poseidon, - }); - - let poseidon = SyncCommitteePoseidons::::get(current_period + 1); - - assert_eq!(expected_event, System::events()[0].event); - assert_eq!(poseidon, expected_poseidon); - }); -} - -#[test] -fn test_fulfill_rotate_call_wrong_header() { - new_test_ext().execute_with(|| { - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - // set current wrong header for valid rotate call - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" - )), - ); - - let result = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), - slot, - ); - - assert_err!(result, Error::::RotateVerificationError); - }); -} - -#[test] -fn test_fulfill_call_function_ids_not_set() { - new_test_ext().execute_with(|| { - Updater::::set(H256(TEST_SENDER_VEC)); - - Bridge::set_function_ids(RawOrigin::Root.into(), None).unwrap(); - let slot = 7634942; - let err = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - assert_err!(err, Error::::FunctionIdsAreNotSet); - }); -} - -#[test] -fn test_fulfill_step_call_verification_key_is_not_set() { - new_test_ext().execute_with(|| { - Bridge::set_step_verification_key(RawOrigin::Root.into(), None).unwrap(); - Updater::::set(H256(TEST_SENDER_VEC)); - - let slot = 7634942; - - SyncCommitteePoseidons::::insert( - 931, - U256::from(hex!( - "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" - )), - ); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let err = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - slot, - ); - assert_err!(err, Error::::VerificationKeyIsNotSet); - }); -} - -#[test] -fn test_fulfill_rotate_call_verification_key_is_not_set() { - new_test_ext().execute_with(|| { - Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None).unwrap(); - let slot = 7634942; - Updater::::set(H256(TEST_SENDER_VEC)); - - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" - )), - ); - - let err = Bridge::fulfill_call( - RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), - slot, - ); - assert_err!(err, Error::::VerificationKeyIsNotSet); - }); -} - -#[test] -fn set_whitelisted_domains_works_with_root() { - new_test_ext().execute_with(|| { - let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); - assert_ne!(WhitelistedDomains::::get(), domains); - - let ok = Bridge::set_whitelisted_domains(RawOrigin::Root.into(), domains.clone()); - assert_ok!(ok); - assert_eq!(WhitelistedDomains::::get(), domains); - - System::assert_last_event(RuntimeEvent::Bridge(Event::WhitelistedDomainsUpdated)); - }); -} - -#[test] -fn set_whitelisted_domains_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_whitelisted_domains(origin, domains.clone()); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_configuration_works_with_root() { - new_test_ext().execute_with(|| { - let conf = Configuration { - slots_per_period: 1, - finality_threshold: 69, - }; - assert_ne!(ConfigurationStorage::::get(), conf); - - let ok = Bridge::set_configuration(RawOrigin::Root.into(), conf); - assert_ok!(ok); - assert_eq!(ConfigurationStorage::::get(), conf); - - let expected_event = RuntimeEvent::Bridge(Event::ConfigurationUpdated { - slots_per_period: conf.slots_per_period, - finality_threshold: conf.finality_threshold, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_configuration_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let conf = Configuration { - slots_per_period: 1, - finality_threshold: 69, - }; - - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_configuration(origin, conf); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_broadcaster_works_with_root() { - new_test_ext().execute_with(|| { - let domain = 2; - let old = Broadcasters::::get(domain); - assert_ne!(old, STEP_FUNCTION_ID); - - let ok = Bridge::set_broadcaster(RawOrigin::Root.into(), domain, STEP_FUNCTION_ID); - assert_ok!(ok); - assert_eq!(Broadcasters::::get(domain), STEP_FUNCTION_ID); - - let expected_event = RuntimeEvent::Bridge(Event::BroadcasterUpdated { - old, - new: STEP_FUNCTION_ID, - domain, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_broadcaster_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_broadcaster(origin, 2, STEP_FUNCTION_ID); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_poseidon_hash_works_with_root() { - new_test_ext().execute_with(|| { - let period = 2; - let poseidon_hash = BoundedVec::try_from( - [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, - ] - .to_vec(), - ) - .unwrap(); - let root = U256::from_dec_str( - "1780731860627700044960722568376592200742329637303199754547598369979440671", - ) - .unwrap(); - assert_ne!(SyncCommitteePoseidons::::get(period), root); - - let ok = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); - assert_ok!(ok); - assert_eq!(SyncCommitteePoseidons::::get(period), root); - - let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { period, root }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_poseidon_hash_wrong_hash_length() { - new_test_ext().execute_with(|| { - let period = 2; - let poseidon_hash = BoundedVec::try_from( - [ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - ] - .to_vec(), - ) - .unwrap(); - - let error = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); - assert_err!(error, Error::::CannotParseOutputData); - assert_eq!(SyncCommitteePoseidons::::get(period), U256::zero()); - }); -} - -#[test] -fn set_poseidon_hash_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let root = BoundedVec::try_from([0, 1, 2, 3, 4].to_vec()).unwrap(); - - let ok = Bridge::set_poseidon_hash(origin, 2, root); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn source_chain_froze_works_with_root() { - new_test_ext().execute_with(|| { - let source_chain_id = 2; - let frozen = true; - assert_ne!(SourceChainFrozen::::get(source_chain_id), frozen); - - let ok = Bridge::source_chain_froze(RawOrigin::Root.into(), source_chain_id, frozen); - assert_ok!(ok); - assert_eq!(SourceChainFrozen::::get(source_chain_id), frozen); - - let expected_event = RuntimeEvent::Bridge(Event::SourceChainFrozen { - source_chain_id, - frozen, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn source_chain_froze_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - - let ok = Bridge::source_chain_froze(origin, 2, true); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn send_message_arbitrary_message_works() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::ArbitraryMessage(BoundedVec::truncate_from([0, 1, 2, 3].to_vec())); - let to = ROTATE_FUNCTION_ID; - let domain = 2; - - let event = Event::MessageSubmitted { - from: TEST_SENDER_VEC.into(), - to, - message_type: message.r#type(), - destination_domain: domain, - message_id: tx_uid(1, 0), - }; - let ok = Bridge::send_message(origin, message, to, domain); - assert_ok!(ok); - System::assert_last_event(RuntimeEvent::Bridge(event)); - }); -} - -#[test] -fn send_message_arbitrary_message_doesnt_accept_empty_data() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::ArbitraryMessage(BoundedVec::truncate_from(vec![])); - - let ok = Bridge::send_message(origin, message, ROTATE_FUNCTION_ID, 2); - assert_err!(ok, Error::::InvalidBridgeInputs); - }); -} - -#[test] -fn send_message_fungible_token_works() { - new_test_ext().execute_with(|| { - use crate::BalanceOf; - use frame_support::traits::Currency; - - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::FungibleToken { - asset_id: H256::zero(), - amount: 100, - }; - let to = ROTATE_FUNCTION_ID; - let domain = 2; - - Balances::make_free_balance_be( - &TEST_SENDER_VEC.into(), - BalanceOf::::max_value() / 2u128, - ); - - let event = Event::MessageSubmitted { - from: TEST_SENDER_VEC.into(), - to, - message_type: message.r#type(), - destination_domain: domain, - message_id: tx_uid(1, 0), - }; - let ok = Bridge::send_message(origin, message, to, domain); - assert_ok!(ok); - System::assert_last_event(RuntimeEvent::Bridge(event)); - }); -} - -#[test] -fn send_message_fungible_token_does_not_accept_zero_amount() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let message = Message::FungibleToken { - asset_id: H256::zero(), - amount: 0, - }; - let to = ROTATE_FUNCTION_ID; - let domain = 2; - - let err = Bridge::send_message(origin, message, to, domain); - assert_err!(err, Error::::InvalidBridgeInputs); - }); -} - -#[test] -fn execute_arbitrary_message_works() { - new_test_ext().execute_with(|| { - use crate::BalanceOf; - use frame_support::traits::Currency; - - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - Balances::make_free_balance_be( - &TEST_SENDER_VEC.into(), - BalanceOf::::max_value() / 2u128, - ); - - Broadcasters::::set( - 2, - H256(hex!( - "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" - )), - ); - - let slot = 5085118; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_amb_message(); - let account_proof = get_valid_amb_account_proof(); - let storage_proof = get_valid_amb_storage_proof(); - - let ok = Bridge::execute( - origin, - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - assert_ok!(ok); - let encoded_data = message.clone().abi_encode(); - let message_root = H256(keccak_256(encoded_data.as_slice())); - - let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { - from: message.from, - to: message.to, - message_id: message.id, - message_root, - }); - System::assert_last_event(expected_event); - assert_eq!( - MessageStatus::::get(message_root), - MessageStatusEnum::ExecutionSucceeded - ) - }); -} - -#[test] -fn test_double_execute_arbitrary_message() { - new_test_ext().execute_with(|| { - use crate::BalanceOf; - use frame_support::traits::Currency; - - let origin1 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let origin2 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - Balances::make_free_balance_be( - &TEST_SENDER_VEC.into(), - BalanceOf::::max_value() / 2u128, - ); - - Broadcasters::::set( - 2, - H256(hex!( - "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" - )), - ); - - let slot = 5085118; - ExecutionStateRoots::::set( - slot, - H256(hex!( - "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" - )), - ); - - let message = get_valid_amb_message(); - - let account_proof = get_valid_amb_account_proof(); - let storage_proof = get_valid_amb_storage_proof(); - - let ok = Bridge::execute( - origin1, - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - assert_ok!(ok); - - let err = Bridge::execute( - origin2, - slot, - message.clone(), - account_proof.clone(), - storage_proof.clone(), - ); - assert_err!(err, Error::::MessageAlreadyExecuted); - - let encoded_data = message.clone().abi_encode(); - let message_root = H256(keccak_256(encoded_data.as_slice())); - - let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { - from: message.from, - to: message.to, - message_id: message.id, - message_root, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_function_ids_works_with_root() { - new_test_ext().execute_with(|| { - let ok = Bridge::set_function_ids(RawOrigin::Root.into(), None); - assert_ok!(ok); - assert_eq!(FunctionIds::::get(), None); - - let value = Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID)); - let ok = Bridge::set_function_ids(RawOrigin::Root.into(), value); - assert_ok!(ok); - assert_eq!(FunctionIds::::get(), value); - - let expected_event = RuntimeEvent::Bridge(Event::FunctionIdsUpdated { value }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_function_ids_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_function_ids(origin, None); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_step_verification_key_works_with_root() { - new_test_ext().execute_with(|| { - let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), None); - assert_ok!(ok); - assert_eq!(StepVerificationKey::::get(), None); - - let value = Some(BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap()); - let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), value.clone()); - assert_ok!(ok); - assert_eq!(StepVerificationKey::::get(), value.clone()); - - let expected_event = RuntimeEvent::Bridge(Event::StepVerificationKeyUpdated { value }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_step_verification_key_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_step_verification_key(origin, None); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn set_rotate_verification_key_works_with_root() { - new_test_ext().execute_with(|| { - let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None); - assert_ok!(ok); - assert_eq!(RotateVerificationKey::::get(), None); - - let value = Some(BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap()); - let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), value.clone()); - assert_ok!(ok); - assert_eq!(RotateVerificationKey::::get(), value.clone()); - - let expected_event = RuntimeEvent::Bridge(Event::RotateVerificationKeyUpdated { value }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn set_rotate_verification_key_does_not_work_with_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let ok = Bridge::set_rotate_verification_key(origin, None); - assert_err!(ok, BadOrigin); - }); -} - -#[test] -fn update_updater() { - new_test_ext().execute_with(|| { - let old_updater = H256(TEST_SENDER_VEC); - Updater::::set(old_updater); - - let new_updater = H256([2u8; 32]); - let ok = Bridge::set_updater(RawOrigin::Root.into(), new_updater); - assert_ok!(ok); - - let expected_event = RuntimeEvent::Bridge(Event::NewUpdater { - old: old_updater, - new: new_updater, - }); - System::assert_last_event(expected_event); - }); -} - -#[test] -fn update_updater_non_root() { - new_test_ext().execute_with(|| { - let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); - let old_updater = H256(TEST_SENDER_VEC); - Updater::::set(old_updater); - let new_updater = H256([2u8; 32]); - - let err = Bridge::set_updater(origin, new_updater); - assert_err!(err, BadOrigin); - assert_eq!(old_updater, Updater::::get()); - }); -} \ No newline at end of file From e4e5cfc88a180b9d22b10100a3130591460647b9 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:28:53 -0700 Subject: [PATCH 40/53] revert tests + fix formatting --- pallets/vector/src/tests.rs | 1374 +++++++++++++++++++++++++++++++++++ 1 file changed, 1374 insertions(+) create mode 100644 pallets/vector/src/tests.rs diff --git a/pallets/vector/src/tests.rs b/pallets/vector/src/tests.rs new file mode 100644 index 000000000..06585324d --- /dev/null +++ b/pallets/vector/src/tests.rs @@ -0,0 +1,1374 @@ +use crate::{ + mock::{ + new_test_ext, Balances, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, + ROTATE_FUNCTION_ID, ROTATE_VK, STEP_FUNCTION_ID, STEP_VK, + }, + state::Configuration, + storage_utils::MessageStatusEnum, + Broadcasters, ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionIds, + FunctionInput, FunctionOutput, FunctionProof, Head, Headers, MessageStatus, + RotateVerificationKey, SourceChainFrozen, StepVerificationKey, SyncCommitteePoseidons, Updater, + ValidProof, WhitelistedDomains, +}; +use avail_core::data_proof::Message::FungibleToken; +use avail_core::data_proof::{tx_uid, AddressedMessage, Message}; + +use frame_support::{ + assert_err, assert_ok, + traits::{fungible::Inspect, DefensiveTruncateFrom}, + BoundedVec, +}; +use frame_system::RawOrigin; +use hex_literal::hex; +use primitive_types::U256; +use sp_core::{crypto::AccountId32, keccak_256, ByteArray}; +use sp_runtime::{testing::H256, traits::BadOrigin}; + +const TEST_SENDER_VEC: [u8; 32] = + hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); +const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); + +fn get_valid_step_input() -> FunctionInput { + BoundedVec::truncate_from( + hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df0000000000747ffe") + .to_vec(), + ) +} + +fn get_valid_step_output() -> FunctionOutput { + BoundedVec::truncate_from(hex!("e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b90000000000747fa001fd").to_vec()) +} + +fn get_valid_step_proof() -> FunctionProof { + BoundedVec::truncate_from(hex!("0b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) +} + +fn get_valid_rotate_input() -> FunctionInput { + BoundedVec::truncate_from( + hex!("e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856").to_vec(), + ) +} + +fn get_valid_rotate_output() -> FunctionOutput { + BoundedVec::truncate_from( + hex!("2441c10b0b6605985c56ebf6dc1ca7e9a0ae20e617c931d72f2ec19aa40ccc8d").to_vec(), + ) +} + +fn get_valid_rotate_proof() -> FunctionProof { + BoundedVec::truncate_from(hex!("14305744fb26a377656a947cae0874c14b086de9d407bdfaf415ca9f47402c04144589183b473537750e7211f93671e324825db673edcf5c0839b08eecba08202966ba52dc07e1bf9832a54770048b84999172d47c57628758d8fe43dd9fe1412e6f8c0e75a79cde28e0e24eb09f9d23309defb07f4a1761deb6598de77278971d2d914930ad2e3ad8b6264e595a0516a912fc9394c93fa61146efc54d61e5c32378a5d4460aa2164422702f9401fcfb3e2b991a0e5b847ede3ea9ffe70a55100203abc0636c101adb6546c2f7aaf32d79e69093afb40c3c1a674e44a1ece76a1183fc03ef9553a7728672de2aada5d5582b5bcf0859e8c312ab59429553ed6d").to_vec()) +} + +fn get_invalid_proof() -> FunctionProof { + BoundedVec::truncate_from(hex!("1b496d04c0e12206bc846edd2077a20b8b55f65fc0e40bb8cf617d9b79ce39e508281ad49432300b3b7c8a95a0a63544f93f553fcfdeba38c82460888f4030ed1f67a1be666c12ee00658109c802042c58f645474fcee7d128277a4e35c1dd1504d33cb652ec23407cd3580eda0196dd97054eb5c2a817163d6997832d9abd422729b3e85a15941722baeb5ca8a42567a91c6a0b0cd64ac15431fde05071e90e0d30c12013d5803336cc2f433c16eaa5434e30b89ce7395c3c3cda29dde3be062281095f143d728486c71203b24fa6068e69aabf29d457ffadc6d682d51a4f08179d3240bc561ae7e2c005bb772a4d4c5ba6644986052fad554f042ab0074a8f").to_vec()) +} + +fn get_valid_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0c3c1510781a6c8ba9dae550cd691248cbfe8e3071987f0da92f13d03402e68b7a0267ee923bf851b5f9776eebb0c09be120dcb22c804c9478542bb665b2d694d87a0437a44f13d49bbdcd7106f95b62b105478a4709bea251824a1058d082977ecfda03d257aafd460d893e9713d085a389be271e3162420802e7b8133e8f1f71dc38fa01c07a616c35b484e4abd791a6aecd9ece7d107a90d110754afe973b3d6b1bbf5a0e51e122b66863d3132ff63c7cacbb4d4449c788076e9f10f3d28de3ece92f5dea0521e7a7eee71a2d2855e898ba4a610b0fd6ce57bb4adf8e5d2634e033612aa5aa0c1401fa14ded62f7e1a695d505f4148beccd2be22bc25730ef75a5c94ff680cea0bda976ea47bd694d0cd116dc1aae5e56b8333b3d6b053ea8ded30e656725bfdea0e581d8d0e4b3b5ab0d441e1bec84eb205ab2f55ff06354dc47c3f53e3e91c79ba066a53d18e20d26fb3c45305e29d2cbd1ae40fe17f63eeae8ae1d2190a1d91fcda00df4111cf09b03686b76e192425627c394d7e75ac0dc96c6612366b8d68d3340a0c96d1de5da569fd8b08757d8393dca4a3000e001e674deda10d3072b1f8fff25a06ae859e5f232fd752442a5927c5433aaccd122971f59aca10c2ace8a46e5d9c5a0ad8a4773ddacac3510ee6c397f448fa9fd8f70b51d720d424313d6537f64b5eea0bc11c88bcccaf2086de82fe31e9fc2d225563c9252cd8a1b1660399627e642a980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a01b824a90c181a4d552fec1cc2ece9e933e9c4f6d266097bec54ae98b368a61e0a01f4fba7f84c2e7ddab72e34805dc74c8bb02a003a92e0387b9775ed2a6302d53a06b3e05fa2cd4b374baeeedadc843119323986042d2822b7feb0af7db72926097a0a2495430fe5d48192b266760828d497f3a3c1fefb8b100483c33341a3b039697a0e1b97d100eab7cf1ee2ad00ebd941ec784ef75d2f37dc13e0a8eff47439f7223a04464b9e147b9ed333e9fc1f89f7b9c0d26d4aef49c4430f2d4f2852652d9bb94a056326b52b65780b847eed732801e43ab8f023a6bbdda9c07da3bda25b7afc88ba05f02ed93551f04ec5a1d98da11483897b27f4d252d8d27a616b483b98021c24da08a956e1065bdc19ad7c20878b2579dad7ea1f862e411007f3b464f77ce01c192a06f48ee881f5a1f687f8c6f2d15d36493d1bfa04e4a32cf22080dac94b3de9f1ea0f516759cd854e7847023c7d7924f2986fafbe20eb3f601beed3b406b1ba9e2c5a04366281a689a29f9ed771d45ea5f3ee66f8a09df21f1849055203030c7cb7036a023a3e5edc04df1eddf74604f6660df52b1bf48f29a4b97710d2f87b57ed4464ca045bd1a9b6617bc253fc689e98d5000de2d065f707ac7467607e654ba6042762ea020b05480454d83862510dd3c4696719ae3c8554f09980bf49b0e3a1576c9769ea05ffa88eb9f0947617248a029b087e89c72bd1f1cc645f0ce38356b9f5d0f9ac480").to_vec()), + BoundedVec::truncate_from(hex!("f90211a051b4b24ddc5e92b57fcb73192a8b66d9d0a682e1cc73d1a03272a9f4514b97d2a051b20ccb0db45c4f2a10588f5e8a27f5cd067394cdc16edfd4b808bae92a3534a0e1df6b6c81a8591be15c229e932f2edb46de5d80520308b952b757b55582a0dca0812a635747f148ed16fb42b8e4cf4d50db52270fe0e11cc7cb8cb92a0fc1b28ca03b098829ec412b08a1126da4495a8f755ebab82bc45ee43b92cdf4c36eac304ea06cd28b484d51aa518163bcc2d283d17833194168a3f11dcadf022410745c7e96a005b98558bfdd9059fdabd9f2ad3924ad005529a454438728b711ca76f858a3c9a0aec8e508057dd392fad463c3bfcca4b07206b151d53ca4a9876ae4a351663f89a0cbc58bc283fabbfa3018afac72b4b21d9a04a157efcfaea50b747f98e5836a53a00e26a1305e5039b385f353d4d89ede2f70b699ad262bc22eb88f7f22a43b87e4a0facb7e1f785a7056978aea57fa457856ba9771fb27f6950b6e36a6dac86335b6a0f257bb3e27acb6f1b0067832538536ec8cb6fa476184caf373169f64bcef398fa03b981c3a3b71e048c2217feed641e5501822d8ca73d07e12737ed4b178cd929ca0850c81bd936124ea2c3ccfd40be173599b2df58b0a5e5cddad9cbc40a6a6baa1a014b90165a798608acb60e89a66e3711d6beb3c65910e51bdcf6364803fd26747a0c2343b8c71ed71298edcc8bca4001250055bf1e3110d9f9e9bb2de2186ea666780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0cb0cdddaf997332e6bde2eed1e92624ebfd39d1954ebd82f6ac02ea91e9d1dd6a07d022abe2fb0047caa61729dff7a72d087019d18037b4e9a38d6c00dd7f853bba054b2ccdbfd7c9f548068ad017ca4f3a9477afc713af9190d55d3ff3c868da7bca062912825979c5160c38e7e1d658a72d45956af648aabcd7e325adfcc955cd608a04c4e18220e36d6f10d20d6ea82b3023a61bb512981a52c3135115d00572fd9a9a09ca3e2a669bf7d2b24a635d874ffa5990c372e8e5abc8bbeeee15020b9b424b1a072781fd5d2c736c7986fb59b69c7ca355d268cd5a73ddf9202a05632fe42435ea08777c905af547074715fd074e3748bb0d138944b0a94adee42b70b64330e1816a0d6745d1404c2246391bd72db719ac915518a4b26deeb0f4640e6fd8dced6f2b0a0685d6698523489b73b28ac2b30568a78bea6bfd5b483b22316da7c976ab9fdbba01d30a49c428f3c3212ae5dee0b95a79f873f1fa344aa83b438886c0c507cb091a0c69962a4ebce43581445d16f514db993046127ef98294326cb45fdc5a42cb82ca0030e05160ec3744ce8e6d13c4801edef8169be649f13045b6d40d4e9b743807aa06253d30ad1389e78120a12498b69a0267a41d025dae18281d3aacaedd41f33cea08cae98ed5dd53ce4452b340c85f32a7e0409f9d295ecfa877e71305962bced6ea084af1765acd884a8ca25266477e22054558a6cbca0d68420b3df3f63ac19a06980").to_vec()), + BoundedVec::truncate_from(hex!("f90191a0f9f2953d2c1c40f457ae2a6894201961f616a42ee0e942b338dfa7435800444ca0e67c195c9dcf9ce6c5bbe14f941178e1f88bf8c4b96c10fcdb94011ce241bf63a034c4c4a975771155c62835e2c8368b6d78388a45e597647cc8f7a704f9e1a5d580a009ed37b7f91327e4defae392a273c53541b8b5bd9ed76b8945b8ffff1a5fc0b2a005970b28afcc6892c47900bf9ae403ecd5364f79af62a0cdfa8ca4e04925dbdea0c6894ea8fb30775c1cca24dbaee5365e3d3f3df625736c0784378190d4507d8580a0f840f68a60355397bb24369387aaaa776432dceb3db4da14de72d82db76d00f7a0bdba75a92da491a76173558d6e07dc24699534af0be478b0bb803acc76251d5780a064dc4f711ccf12b28b6304ee111d7ae5edc34ffca6688c0f25846edcf1b3468ca0a285ed0e46b78847cf1d0fd0c8b81580e9417a534357d6bd8b9496f9ccc529b7a0abc253bb447ace56fd185b004d2764e61fffb6bd21ba278c1e0a0864c35080a3a0184573b58579fcde692191ba18c0b30dd06326129c3861bf55d29737f646162a8080").to_vec()), + BoundedVec::truncate_from(hex!("f8918080a0f2054bc8fc8c37e14cf4934ff82e49f5016007cf3c8a16d5699d04de84b692eb8080808080a0e53905b3f1ea5db82f82f442b71d07c6a97cfa5ee491e30f850be0ea3389466ca062f6d91b16d4d417f8643b7315ace6e05afb70aa59c0b19fc863c33f8c87100780808080a0cf5bc8e1a57bb56b9c38250e75864a1fd7a893ebecd6bb0ed2ed301c68d581a18080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d343c360e5679746f94d3583df82fee3a96e5a6b33dcf5e57421b01c9a8b846f8440280a0089abb6beda7a92401ee554da94e735920984a64e7403d5cd7c82098de059da9a054ccfa149cf4cf471e53bc5dfbfe8ae5c27fa96b0599f2747ffe6e1fb8bd4396").to_vec()), + ]) +} + +fn get_valid_trimmed_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a03f67cc4693a599249b84bfeff3a5d12e853bf772ae066a77221736d723559d1aa06d2b1cc23f415ff8ad546eee0b17411ad19b57701b85f96e27e6ba5724f9c69ca02e682d0fcb1bc2e30cb30db360871870f20766f38878970c52077474b4bb302ea0f1fd41727a86c80436ab4338b4a1f189f02591b7faf7487ee424c71e80bd77a7a0195c17c74a608f2848526a9ef4b81d1eab7f1d9906e74f706bb2d99cd557e9f9a0fc31be6f33b1f4655add8ca1f92fc6ac823db5b0e5d384545f639c199f9b1412a0bc16f1b8369608a15f4e425fb72d5d919b625016ea2765efd937b81b2fb95f7ca0300ab398a0037c592cf9a6d21c5d1bbe480b73f88c8b1c6f67796cf6af06d15ca0ce1ac3af168abe59b356c182c4823f869f26658f0e40d140ada95c804b066f70a0f6db7ed6b431338769f86f050543d6dfef570b52ab2ac677be95e789b9fa6cdfa036a2de51d9b52bcfe611a9b6e60e6fb66da89e7f199dcdb94ad3c8ff231d991aa042846d291fc4e1028d3c984ff8c0dc0602183b9ac72e8f1a7e47655acd4d5b8aa0b6875189e1e5fce8d06ecb5de139af5cddc9bf6cb945a165fc68b7311e2b692ea076ed2532d8a35f6a813e66585380f1368288e64512b2f970edd5905855493feaa06f26c65a9131dcd09e52ceceec1c91dfe04ec2e055ede6f6ceb24c1d297d46a4a0ce8e3c86b6d650cffb18b64325117513fb823c8872fbdcb3979435ba37cba25e80").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0bd2e3689d300a30100a2329f8402e73dd245a1c669bb160aab470a284abbe982a0b25da6bb9e7831fbd9e48fbf4874de13785c60e60f7fd2425da0a89d0f790578a06d8564eb4a5870a4b99321423ef15918e64293489c05fe87780a547f723c7d16a0d6ab8cfdeb467341f0d1f2576f8e574cf6535bbc29b589e7676f6be1561820d6a006f5e3dc5ccb84eb9c7ab28b62118a33218829543f69f0ed3f88984a8cd3de82a0caa12557af64ae8c5b84a63d0f7300a33a7536c85ad39b87bd12ff0c7b4c1530a06cfcee7f8123c7914f4920bcd21d1fdde4a5f912b4d2c03224bec6e0f32af487a0ee943defe13e21b3ffcd1d8e70c324dd796df825edc27d27f342add5cfe0bf21a00825681a49714a705942453e89ac474023716f7e94b72ea8212f991d4e3ea8e2a0a793299ac09099832c69cbf8abeb8fd270fc3bd156063c49a39134d44905c047a08eaa7057951e3b83488d09f5fcaabcf4f3bb20974049d1a4a3531d0540ea5ab2a02edfe21f3ab3a99cf37dbc28d22ca51c4e047294f45cf444277ffba450638e18a0330a8cb44a696e8d530641831f5be9e7cefbdee0720c6cb7ecf65d5062a67f14a0c7a27629e9d3d0fdbcdad8098b318eec1b124c0bfce2e72d5d793359c5985ea8a0e5f686ba4b1a9505ae8b9585fe7859f25a03c771b3de08b73395acb3fa0737a2a0c2f391630cbed30ed21eb8f19dc978836795fbeb659f3cb33ca984986c65859980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0829b73c40aeb9b1818e1d57df6712a27b9b4f5d816a8ba8d52e42cdaa2fcacf4a03c0715f962f5276d48a5c4c95fd0a54d1d5d871da0d20f2fb762b6e979b419b7a073632e830540ce138a96622e236bfc58b342bedf5e921d672161268f5c83a59fa0b2ec8caef8c00274470c3e6bac0c45706a469cdf1ca10e004a9d1be102c50c15a0046d3775da9dc52e63b78e83d6dcf9277ef70102ac606ef687d3a30e45346129a096589fc3f3f0abbc11086f898cd53fc72c959672f165f709e74f97ab5dc4139ea088223af20347c73f74356d580408cd64ccc287154366eebef139af7c9d62cc88a0fd2827ebaa6d88887250f9cbc5a1ae99fe48f51b91018d21566a6854b9d30ac1a05a3b49162aff1d7c980dbd11346252b25960d08be8c22735d0c8ef87c86b5c69a0b04137dd339bbb8ab46a460265b151e05df96712f6136520d444795526ac4b19a03cf079da86b918c6dec36865ef5ab76ae35d72eaaa08554c28a2ae49cd202795a004af2ee7dc2d6c6c88856c5fedc0faa350c8288a534e042e3f8fd36ac398157ba0df1eeb3bdf8aac42e0c4d49ea9b3b510346e46163905363095880fd73726aa2aa0d860a0fd0adb23e1cdeac0cc47d6294b5c7b7d6c1de655b5ea539c8754086f4ba015a8f23891525fa3306e310f5657c149f98eb8328842bdcd583a764376fcba42a00547529cef7d460c500e265f08746ed224c6726ddc8d70774eebd5b5f5d05a5880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0ff81c45f032f6270c46b2a2f392732bf4aa912d39e2780eeae4a7e7750e1efb5a08853f8503dd089ef324fa24d7177ecb430eb7db5ec27282eed0b264227e6265da09729f356f3fff7282a81928e6b09647b0e23f918f7cd01536d63dbc72aa11de2a0c26dca08e22987f703f384be3b896c269399479729dc49ccaa7bb2982951c3a4a060000c0147c14224541082b7ca67933e78c4778a291b248519f2f2f3e5b05b3ca03e2bd8e111d7396e9aef5dd91c12644fbebc5a99fe70e7b304d592875c2bf11da08fae631f08b84bb3fdcf8bdac2746f832bb0128fa790e73ca33aa64030bd4f24a01d839e77cba33e769bb66a535a48789267b50bd4f6bd0298941c26079c8d944ca0d89366cf55e4971e308a048cd2db663c8e13ba47c352c8b3e97015e0c232154ca06c58e7b529df2fb48df4dce3ef05758c3ba08bdf9f1f3c0e4dc46711c32a0bb8a0692107b01385afeaa5fd411a5f6e5d32ecffaef38bd8b2dd074a1877bd8fcab6a0d0dc3314dcb9670af94030a20de7e8e85882d2db439afe8d2cb1b144cabb353ba019a4d351e59fbd39222bed12d17384b0c3c9714b83533fe4d67a1a49f7540857a0c6c465750481dffa71d31b8511cdc58398267fd7113bf9e357e4a467971f3a1aa0ccbdfab5a0eeb421fa54b9a52afbad7acbd410eb64476e2d3336801dbedf759ba021b46858e99b0a1742f85b6a7c98d60079f60d6b416f77e3375fab51abf2bf5780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0072c336b149a863d4660864b22c148294be18b2d02ec70c3bb8cc5c796baf2eea01426486970928305b02b630c2dd2dda9aae5da8695d8687ee8d5e852dd8ca32ca07ad83ef3d645503b9afcf48de32fb677beef8b637aa120e6624acea518eb5b3fa0233f6fd48deb7f3ad124f6ecb24a07191085d0de94b0a86b78d4fc5557c87acca073c15c299a6e94c6295b71105d0ffe0f1f5a6df434cdafb9d408123ef4240fafa0a55aa4ce263fd8b1f321efcfd5d2cc39dec241b476ff92dbb7711282c2005d30a068ed51b36d5643ca995f36234bad2e623183e65c64d6c57677a6d94c4b3aabe9a029a319fc16340bb5889952869c0184a1fc1d0427aa488dd597909671c9b41b6ca02c96d570cb2c6069fe6326009edd6ef43384946bbf1e1db53bcb3a7ea13a2438a0f444d13d4b89d3e7107f37adf304b3a7bc9efb750c2f7fb881996b1f2b18912da0bc7654e778f69cc2eb09823b102f8176f2f093df6e8d533ef416b9c462faf196a066c8c7b398b35e45e6ac3b17055f064f6f39233bdf89a169ea349d2d3495bad9a03c0165cff666b0a9bf88e1faf4382096166d12fb90f641061288121c612ff442a024cddecf9aa07dfae93a6030b953f4a5e0406f3714d801762ee55c4b6132d35aa065dcf4be29a72d2fd844e5e9ed101b74f456e1782f9432fe1aa508f47de4f49ea0bcc85c28e9f209b9b419e66f87bce37fbb42ba8416880935275c377d2fcebcc180").to_vec()), + BoundedVec::truncate_from(hex!("f90191a0deb916373640a76bb6056aa37e9d548908c92fb5d3ea1fc69a1c99ddeb40eb24a029b4cdce0d4f7eed71cf6f6d21f4d27ef510b3e36c7c67587e84a08b8b288de380a0cd92c24f26cec2802437f2f8e56cdd35e47ed3edc4c806540740f5bf83f1c5ffa0aadf083c80930dee9f09d295708b24f31d2f41f50e1442e32ecbf03eb5b4a707a0f5335f3280d3be255686e95e46a353a1562a8008919a0051a46fb3fcce7c53caa0539a7d628c0e0295ffe5dc4bc8a737d797e03726f4fc4088a5c34f477e43c576a0d000e75b89a65aedb850451d369e3ac5bf4d7ff0d71ec5e837417c0eaf074135a0a994cad72a8a641c62979d6f94ea0087a14770876869de76ff0aba4c51b7cfc480a00a3095615f351a63f22e4b2e3c79f36ae423d091524b6603a3960d9a5e050f62a06e2c53738e77dd7b3c06aada2fcd6035a8435f8edbd40e0e9856439024502a2fa0dfd0cb17d8ab569541cb008b992e89031eb8bb903d1abeef7fec629ac2a7602780a0ca1bd867039f590f970b921ef487f051a6bb54e1d480dd9529899d02de4a46a08080").to_vec()), + BoundedVec::truncate_from(hex!("f87180808080a038a7a4270f22ff1603ceaeeb23b33d88250139e9bd96e0bc5cd44b575f3cd256a07564257a73fdfa4e290ad21fe914294174996ac87095b5730370371f5ea133e980808080a0d51dbe737bf6d8c5b89bcf7724074067d2a4986c4180a5016a8bebfbc92f56e1808080808080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d38b7b6c4749ee47ec3483ea3325831ccd2fbcbbbcf7cb559ed13d35a14b846f8440280a0aa7680864299b147a9a6d669c27e061f3e95c09fa2e26398d644ba66f9b976e9a0fc50d62823735da871a4b45630e8f4a5aef99c18855869762b05d4f7fac4a859").to_vec()), + ]) +} + +fn get_valid_trimmed_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b32abb8354c7486f39ed2ac1152624ef001bffb0ce0eb7c31ae063df789f994a080bb0ddb0ad0557859ba0c2ef1e2d67e4461b379043ec91ecebbefab53d569b3a06734318e802e53ba9f909ab03ede43bbf05c0aa1dee2affea86e533c49aaefdba072a71576a3efe0a39495f056c24ed4f0bcd11355d850e737887a456d7fb0bca9a0c379788ccd4ceb4a915d30c03258c61725cf57132f00c4653db0214a39cd04d0a01d5aa540d5728ae4900a82aca7f240ce98538d196cd2dc92a70c3f7dfee8c5aaa07e2e97a62072a02c650aec15bc75f36a8dde008e1f6bd2592129ba6c41493f43a091fbeea8e97fd76afdea2d1a92b7f3140b5165923403b9917f527e74359dcabea08dbd10c6ed681079481c92ac3687049653d391c8269c25d83538081fa8a8bc76a05e0f867c10c0fe18ed170d68546b82a1171326368e7b7405a20b252b15498e1ea056b131482acba838f00027ca6ea75079d1b1485894a19ec4512ba6b1887e8148a0fb123da682ae4a2214681e7793801c3e5167591d97b072e851f5f9112c79f6bfa0a15859022edd732924fc5192e0fd93c758f463e97d0f765a0b3ff3c0cd5d3a60a0cbf4df8376c85940b02f98c851db0182b25302f5658e43871e9c6511f3e88a25a020f58bc2c7cafb6460830aaaa5c41a9567ede0b636a20fa04593004fe43ecf7fa0059c2b1df5bcf7ae85f61f51182275c3b6bff4fe482c714e7c3f50516a933b3780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a09900b767b77271c9af3fc54de094d91dc7b08650aa756ada2800ab79148eefbfa008fb501eeef4ce577c036c664f9d9275309d155c8aa7e96572819f389405ce5da05a9206d832ec4df61192e2ff2c5eb9efebe77e29a54a3dd4bd7fe6212110c18fa0e318d4044bde6cb11dd358ad9dbee4d763ec5ca946192ba924049bf15b23329ea06b60d1fbd395bcccdcb6f22f0fd19e6233043710743a1bf030fcc5921d10ac12a04073234ea2baa8e1eda5ee3abefb70d575786de6565267d90c659e0917010e19a0ebfe792b17dcdcbc456259f76d9af665eb34ef5fa464f51959886136543ea8d6a055ca87cc8ffa31c826b991fc30419bcd1067194eab1b1fb2023688656006782fa07db930f6a48aa842be5608d2dd099b7fed997058763b33e6419062e65cf92353a07be0780df1edede41c7795e9747d20173e12c3c4c06521edf6b4354a871ac0f5a01fb962cc28068fa0cb59e4ee2912e7890e301efadd34d389c80404f80c87c486a0597f19d7d15226fa7410817e8be23adc3cadfa01550f28b62b094d7fda48a7fba06a4b5abfae8b92f163863f644cc3f0c1cc2f75cbbe31ac80c7f8ad71f277b8f5a05d1213906174d263996d60b4d136e3d24387226166abcca5798f46c8bd1a2214a08258fd3c37c7ef5649c3f1591540aca89dfd39345a17d98775da9208e8d8a19ca0000fb606926d0ece17aa61bea6e4c7e09c14d85564cc0de1c9ae98d41d6985e780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0a69b09b1d904eae2844423e60a7728a496cf60270d2ff529f0abc2cbe4075841a0ef9af64741ecf8128fd1c05b534fa0bb426166fc4e9d100984737e4ef57e9cd7a0c45c73ebdb8cbe7b7e77444ccce5c00cf929bc8df356e256827236a220ae29cca0c82d4ab55c79e2d8d2574a8908b524e792f34983e16af94890efe2150da5c53da0cebc2cd4801f683f47aac87df85315adf0d02ef6a19cdf5d745c22272e301f6fa06b1a741e95c3de95cdaf0222fe25363cdef6c598843baab805bcc4f9cc64b586a0974986a98df15aafb10a24cc3c6a5ba74670e654248b7b810b98e8133a9e4701a0b6f0487e9876f634ff7552fb5f8cce474e7c04d8891ff0c68ff5f24f91f1bfdba0d68ac2c2d956a69c6f1f9cf9fb6f495a0cff75350b3cca2dad9abf9d96687703a035a8bc714ff33c5e42d616cc21b52bb502ef9d60a13921b956222e05ccd94f5fa06cc749e55d9f9f2ec594f772a7d0edca8b0f57665f8cc2f46a555287c9f1eb83a02556521a54a5461d46304ef99e99f930d0b7f56dec88e92eb0a2adb55de521d1a0a0ed415c1982bc87cd8a5feab63ddb4b571d045df9ea34d0812e7251ed03e010a02d63e8a665b4b94817d9d4d5dd1c775b7efee4ddf844a2d566a433d1097debf9a095f5e1fc74683bf4fad753379429f79e254cf5b003b27291caa3636bd7426ccea0946e1f6fa2dbca1c556607be864e1de46ba306603c9db678efa8e62dab0e972a80").to_vec()), + BoundedVec::truncate_from(hex!("f8b180a0b0c8dee83045cb27e112f3c82c39ee3a068b5032538250bd1d073420324b582280a02d15211aaa6878b99a22d16da29fbf2809b4eba2201f82bc3761dbc9b4a21bd9808080a0f10a1a9b00eb477bf41ffd20f38fb221b79ffdfb8ec849317a2cbd95970ef194a06f9cb181aabf086945247d8766a1803188f78339dcb6a94130cdd198370a31448080808080a00c14e855667d3df310ab2c2b80a309bb10959b6fb7d9185afd1ed155e7bb0eae8080").to_vec()), + BoundedVec::truncate_from(hex!("f8419f20842d8360009d31c89c8f6f564e011d20cfd5d16d9caff797600c3ae19913a09feee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99").to_vec()), + ]) +} + +fn get_invalid_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a050da92c339db0b71cd6a8ac7893a6b8689ec5a3a46a0231b3ee2bd1baee75e1da045a3d973eb74a02b762d8b1ba683f39bca3965806276c8ceffe2d2ebc6cce233a0e88ad29ca98fa08f59f2a7f0110d63505d99a173628643290df869c4d1fa312ba00bb4cc9dc0b1de6ae0d80424b1fa992efb400a07a0e84615c91762fe734b2d0ca0a07e495d39bf2b779405790c6c7e7eb1cc3c803a88db36d1ec600fb0e555b5bba09a1c776e89c8be75d0a9ea022c05fd2ff095869d549e74a8fff7f2fb2deaf738a073b874e49e77dfd9312d7b1afd1ac10e02021a1ba2ab7c97ecaeaa0e26a34027a07e3424405c13aa33a2eb9ec6d8640aa1f67fdd8c8e9e4276334515b1cf1df65ca0246b93b2e3cc625a5e75b40165c6cb95ae8ffb9406563d34092d6359c7616aeea04d2fd8fdb1ab7d8f8fc6079400396fec828914230fade3794f13dc5ae7f6bbb8a04811b9efbfa8d495c5be91be78372b4a29140bd1e092e793db50ed9c495a6d54a02e1b3a417e8341dc8e1ade6ca527778192d33c7c827cfa63a366d007f2884e24a0845f4f33a4993d85766a14222cde1d124bd0f15523d239572883258a7bbcccd9a0ed2021cc2206fcfd9f80d592890b1b4eb615fae4f11d4e4a66d54a6767908901a07d46bf6e9dc9599eb7ca036aa976ef9cc63f02e9097252799f5d3a8792c49620a00b58d1d2cc72401c7cb978d34e15f74038ac63355e415d53b894179b8938dbb780").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f7c14d7714348be36359dd28afd64e2fb72679a7ae09a27027fc95e335bcde1ca0824329840722c728e0f19ae424caad4581ac42015a4ab8e9d3ea550c857da804a040d48c9df564c00b11d304e2a2597a35b17b25429c3850c4e3fe4e9a278bec88a0a497297590785cfaa8491579745c077b1095348912d4e3288d8f00857ed9db5da0b0ea3abfcdab8c6cf03152cc7a57f602f85d86f4bdb3d1ca2242a5e737561bbda06bbe0e0416b59f1c4cba36afdee766ea4689f1c1ac8e2245f45c2631e2478119a0222dec72b36685a0ca89e49ce87262957f7f891e695ea8ec52e25fbc3a328589a00b3cac878feb2bcd5fc3d49fe5f607eabf75f014df74a268d4aaa1d25654d030a000deffa5e2879748ef9a634a3573484b4dd259c0d4c10453a7e1e3504b56322ea05c356b24b3b36089583f650cb954f884b05275b09b7715a2eb3cf6fa9175738ea093abf2b2cb15649c192d0d79f62627ce634843f84ec98eee99267c1354b5135aa059e9c60388154b3b810ffd41f81ed9128c8091a12e0c53062d9e7430fedf5939a06855c9a5622a40b5bce572522e4774986c7061557d2f1b8f7070d8d397888b4ea04d220a5fb22e38d64cdf4b46a42898b9f1ce9f316f1d332eebebd32c0cc59000a09004930139d4ae94070b29245230d5b28b25ac59c11339928a2eb547f0828341a00f37af44fb487a5ed675e12f0566a54e59cc025466e91cf56dcf348ff4049ed980").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0e9fa1abfa1f1d84a27da9448b42e3c0f5c60c54a1e8cb90c9e28b60824157380a05e977e1d37e502ac74fd54a2debf7e9b7b6e64c261e45e9b0610bcc201ddbe93a02f8a351ea5204d62c85fe6b564eab729fd556b1941a4f83f6f4b6e40e4102869a0a4b62da8ab84fcd0cf425fba4fd03ad7f1350217679e105e57ee146f64b07e07a061049f894647148c39ec3d8c4563d22670ee697f2e4a003513595f5074fe0166a0de1551dd310c9206da56ff9288dc518cccf7cdfa259cc3ff0318a6f3f7539988a00e600d8cb072056fbf1f5bf7d18aec2eb2ba57e93b5e6bb3f0d36042ec8fbe9ba0fa02eb32060ca2e3fd46e39a8456f02156b8efb457c74ccab5789bce1d142613a0919bb37876273e3283660eb2c575ddcfa99239ab79cf7edaf64d5591689c7777a052a8ee269c13ef214ba56ff0ef6b3cb11da6b12ddadbf1883831e91c6768bf60a0028fdfd852916e9cfa13eee9bf6c540bdc7f6d9b18eee15e11da66a8cdfc933ba09d581d74aa42d7974e122d3a3ec6febaa74ca9f714ddf5c52a5bfa9ee41471e5a0c5608d4aef23664aaaa38aa2425cf959b62d30cf22a0d14147a3cab3d4178fc3a0beb1d967ae4415f30d7730c1bfd43446e24c5f0210cb3a0f5a9bc67e9f63228ea03117ae91a22815aac4b1c9210ba7a6682697a73cd68d7741d693c1cbd1925063a032cf653822d7a618300ef2113f0ff0be132dda944106f25350b5f37451c740a280").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f284a2e627542f07910ea0cb276b0b7813f3b9c056aafe496b3e7f93d1b3aa67a0d45d246efac9fb2e0c8052354aa0eebd68a28e9606efbbd4a5c2f9e990dc4d3ea0fd5d8349c16fda7a90a9c778cc74126188887aeacec8761349e1863d4008602fa022796160a8b1259fca46b22aa863131e970b077a449a5be4c486c9384335826da0b28076746e56b0bc37fb7586e2c4f23b624523d8e2f7abdffa73859cd531c12da08af556fb72bb802fde89a5562659959ef83a7846f0ced10ed6e139b44016bae9a0f948d4f88be556c183e053c131cd62aa278bcc83845437bfc03721828a3e2082a038c90f875a89a76b5b42d7c843ee790b759e482570a0bcb4d291496a40815093a031b88038ca3cd315ba56e783d4423c7c306cd9567f5a9eca972ac631c4c58e83a0858cbce5374ea0469281ee65c5a1aa5cfa19e7f7df02635821be244a5d39a38ea00cefc972ac8009f230bd9c8015753e98072b5f71d3a09093309ac6f09002f420a0e5fb8ae4800ad431a827003be4d719efcc29424f3ad2fbe483a42ab724a8610ea01a584c371a17ffc56a7713b2c6bb65bbcbf63c9d6382e0423dd577031c63842da0104f13e37d23eed61ebe6b78ee93ee9c30c3a92dab0ccbc57715051e9744eb58a0b211502efd34235ac7f948856c809f8aaf5e299df97ff24d4fb0d53caa3d1e83a043d845df46ad73ae3a9f2bfa319c19e7f760922f1268d8b96f0a54cb8ae88ab880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a071241195c881f3437ebd19a9eccd009595c10537df66917a8fab0eb664f834dda0122c775309b9cff05db80ba77a60604d0fcb8a836a5e79999943f0d150297e19a0c32190d1506259a9ffa2ec1fbff6b23bd35d4e6bcb063b19a22ec10b914981f4a022a77ca63522f76d016d04e680d4c27c3ceee14bc4548f9e08c2cc10f9e1b789a0c646ec46e8f8d5fb7de785fe967200994afec4c48b2bcb001b5aed20db936326a0e20c61d63a3ac612051c43ed1acce68e185a08154e5f44e8eceebac0f454202da05b17a5f4ba7ed711f694536b96a69549fe097ba32dee1f9c71eb19a0533d46baa04da0bc8c8f03ad8f1efdf0da738f24c9ec4549acc71d43ae6607f22601ac4f38a08ea8a34e48a70ccac672eaa2c3a4538d61d38cb5a143a4596d571904b6e3181ea0148252504cc36b4f6b1ef7183df2ce176963bacfc97ad3949fcb6da7d4095821a03d63131beaa2c1137d599528084b0aeb4bea87ee8da16f424dd93c3b90087a75a059f94b55179b81bb657f5021b161ab30fffc8620706a858de7103a0da99a262ea0bb62efd30271c9e2bfc8a4938ebcf4d90623d1d55ffb97399f6456c597599464a024a60032c223c88b91e1fc98db296e58468ebf38eed7bdab0e114cdd754bdc80a0271ec93cc3efaacce706f26a3aa42d6f7c9d8fd6944329149ad63b43c78aae34a07caa42499d46895c9b948f37479c6572573db5b644a0862168e25e4e3bfdb57e80").to_vec()), + BoundedVec::truncate_from(hex!("f9015180a09089f0d1272f06751d391dfbc7b6d49b39731b8a14b5e5e97d45e34d89df0f3fa0820bbc641b62cf0f6a4c3836017cdef0bf7f43c1ee8cbc76ce7b5dcd80f58b9480a0fbe1f0ac8158473558c7b9964cc295027449f6e960f5f6407d9ca1c9ef15f7bca0a2fb890c487021019f73371bf6798e8db8b612ca3c7b30fc3495441a1f9518c4a02cd1ca2531caa6e63ac5f16e5ea76018826683f10442ab5c2b1f9963f23b011ca0429bcf37f564e67dd5764f96fa79532113668cbb32059affdfdc82cfdfd5d1e18080a09be000de088393ee33eac568ba00e318f0ed370eded1cdf38aa75ad55e63945380a0a9138320438845382842e94a5b4ea6756af0c82a0f6b4f17eaf049d617aba98ea0229898dbbae35aa9ef23f2a46c26d419257c35ba11aff1b02ca2024a057f8acaa0cc4c22a6806f250facbdecc1d8874d430ccc277d68ca91b5fb10b4d9f7c681578080").to_vec()), + BoundedVec::truncate_from(hex!("f891808080a076082e119bb693f858172779676f80da4deb1fd75b39db89ec6c96e36125cf6a8080a02b87e60a23ebea051ea7f029c26c5fad0ba86fb8d6d5d4bb563f48ddbf7fa6aca0d9693138b984cccc06a7461c7f39cc28947c9dd95d94bdea1047ddd420b81360808080808080a0ae23c016152c96bfa600e365cd62d6ce721f0b0d310e3c7c18b8a293b722a4ab8080").to_vec()), + BoundedVec::truncate_from(hex!("f8669d3e80870bed23e92a482b9f577efea539b7865c0383284e1bf8cb8ae0e3b846f8440280a06801798586ca88b0ef3b4fb3f83162a9f13e5e242b4c8024c490006054e43933a0f99c7a628a59cf1d27d3a906618656d06e3cdcbcd5f91503c002ea2f2420bc01").to_vec()), + ]) +} + +fn get_valid_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90131a02aa432bd6022e7da6d0188f41427645658b74a08227a036f80fa44bff9fc57af80808080a0c01b2d5e61b71c73bc7b1b73db39a4d89bea07f4594557fec2242da9c90c91a580a073768754f5d28b5a762b44f6c37233fbedbeab05779b7dfb407ede56d2812891a01f3fcf34e7a10de63f5fe300d0522504aa29e6a4a7ad39df02bfa94e958e5e458080a08f056b51124e5c81f7d86b4364a97f66324957dc1042f751bce474abfa1480e5a098b414db83b4c1efa80ad36b641c9c517b2225cb212fc236116b2f9dc69ce64fa09a0e693399670076dd7708930bdc19b9101b3f181c4bf62d25edf6e1fd6e881da079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a03a1e44d3669992d3ac3f750a1159442ba1d83432cb03e5815d7eed7d97c7e90380").to_vec()), + BoundedVec::truncate_from(hex!("f851808080a08ddae10e810d2127e5d527cab77909cdc5b99e20544edfb6f0c7b46033fe17e080808080808080808080a0c43b94283974430fdacaadaea093cd1524e306af5fc8c15ae3b13528d8f332088080").to_vec()), + BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), + ]) +} + +fn get_invalid_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![BoundedVec::truncate_from(hex!("f90211a0f0a16ee9b11528f3da8796229dad134b9085ed9428d868e6988f9b2473b59d6fa0f8175015d0a3df8fc451d2bd3d64a34e0836f3203129ac567e869f1157b488dfa0f9d56e943c6962cf8e2ca51b94b54307eb45424ebb84ed079b417cf03a85e298a0408af9f1c5f64ed6c517b1dbf661b75a705ef7d78bcae67b9a54c1e8052b56b2a02157d476a9a077cfc9eb00ead5ab65dcbfe363a71e993c3602a66c0fccf13e4aa00772697ebf25f2e83830918bd52bbb9600c077ae289e740ae76c7bdfd34b7ebea0a1dd0da76aacf7c82629c55e4b956b2e9ef77d7fdcee1adeb23d022f0950d554a0695cb723c857d98ad1c96a372f7983bf771556f4608674266a0698531543217ba05c0fb347305720b81c7d39be6fd5b2083af607654098a0f1418ec111a846510aa0ecd30808bffcb164a258c332a29f3050e9e85d28e988305b7f643dcad4f32c8fa0ec5ee93a7ede0a9c641dcd7515c1408ab48f86b5295cd26b3d738e8d8ac7829fa01434a5f6054456bbce0a59ba1c182eeee8e64fd6762ff365e550ca7cd8cedad0a0b4fefcb325f044a6663c9441ec9f025718d0f2d7fc1c29ec819f4a366cafbb6fa0cc26bfb18151569b0f765335474fa3840f9093385816bd14a4a3c553fae62949a06a28c02f7b649bad24b39d9a4e9fc4c8e93b1ae2b043af4f5bbcb8238e193eaba011ef889094bf6ca740810423041169453b7daea3df98b3018523f86e96bf033580").to_vec()), + BoundedVec::truncate_from(hex!("e219a0053d037613f1c22bb588aaa70237b3798774d2b20413c686e2263daef21ec226").to_vec()), + BoundedVec::truncate_from(hex!("f851a0c45dca792d516550b57f7f31e33c67f0e6debfe0bdb3076fe0078c65c5afbf8280808080a022e43fa2c06d3d498253aadec7a7db94183eec2aabbdf2afc67a45107d19932b8080808080808080808080").to_vec()), + BoundedVec::truncate_from(hex!("f8429f3841a49a1089f4b560f91cfbb0133326654dcbb1041861fc5dde96c724a22fa1a0efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8").to_vec()), + ]) +} + +fn get_valid_amb_account_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90211a00b9369252d91d5240966845819a5e73a8e7b4b531b9f66bd652df2ef25999e8fa00fbedaed13519e0d8971ca3e8f54fa6250b8c60ae522924ea5b7bc54d7ab049ca0e9a41917172ecd79fbbc0db3c117a990464df2767be84bc5fd749cb50763834fa0420cf2bd2e7aac8cc33b0731d7546b738315ac482524aebc60e39a7d0359ce84a007e78eae37bbc3d25305685e8321582390d9631365f5c40612d111c7c1d2a35aa0f90094ebbf4d71dc00d9ff469a149d62529289b7a88d63f69ef73c45ffadd9b8a0bb5c4d709b179a0dec8c3e298249746c5f36f1ab4c7bb0985e4c565bfa96efd2a0b44d9462647f7f99afe5396fc6c049ca3d343748d9eb27f64e118a4d55d26d2ba08119035469c78ffe7336ba8c0117906ca64c9827f16ef71b5fcd99272d983779a067a02fa9917bda0acfb3646ba7e91c7e54e56e40342c552c0b069f949a64e122a0d2b39ca49bbaf2582e8c48243c86249ef034d14f8272952975c1f01773d508c4a0cd89136cd6f4203f52553a6856ba48ee08fe3d0165b5d020b4781ec0b0195bfda0bfdc0af814301e39e11e3c2186b3969b5c6ffdcb627d99f2e1e425d48300253ea0689a72bc1f0084b35849c938c2298e0d90384a071b6ef7bb145dab1b1205efffa0614a4f66f2451debf003b8584d9c2bbb87ee1d141cb240b494a840a91d32e126a01885c00eb4d6365b341f3c21bc44754f901ff56e957399069209b612c272a97880").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0f965da070dc0173a61d34b21bea4dfde26c834257629677157ae7248b50cd81fa03a76449b49477746172ed14e2f996a8131b3e23de3315a1923f38b7ea415b979a0d074384d170d5abab0c1d9ef28cc3c0ff8f36851a7bcbaef501c6032df0943aaa0149b7581ab9bc820217566d4304c13c418893863964f1b2290390f2f4f9c07baa067bc808de655c5710908cbb592420df656ddb294a0ca123c5d1c074e977175aaa02965ae45e7ec302c8d1d24d07954074343df8247da2f6122939181ca3f187dd0a0edbf4144f7d295047f49dd10e218aa3d590cb406312310b0ef56184c1d046822a0915dbafe8ba1d369a3e24375095596455fbc9aacc468958f6928ce428ac31967a0b9e44b513ed8ca8ee7409e399c4a467dc7d260c28d1fba4685852f5e3b65f4d8a09567dcd6366635567c2e61fe0d984516a77a4b0c204bd9b2f85ff343216780afa08390c69ab6052b335f241b5b187af412395910213899dbbf6084987846204c7ba0d38a47f0e0b2b6267a7e360308cbe0ab49e22a0a8615439d3423d6c363080ff9a083e7617b1a68407db284cd4035e04b0637b727c949205cd9ed176319cb9c0e52a061503e01e7f1d1fa6ef925e561be0a4a6fd580263da8f811121b90b87708e562a09c0414ab3be0fee449c042627dac5fd0f3d228b53499a0fc181045f873e3403ca092962b27d984b35f646fa84d3ef49830c5ee8fb0d6db97a912aaf21da043187580").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0b882b0bbc9b8e3d25a4829a3ce4d49ec7c784383a50f5ff5aa49afeb1ff11cbaa03a6a3554903a3fc21c4026084a3170c202a1c64230dc99b13fdf14985a28183aa057931ffba973f857ce9ff8fbb84958b8e4cf1477edd321e757002870535e308ca074c4acaec7053c4b57a5916049ee1c48b6177badf67cd10c76130a1b8c519329a09c64edf3c38e2de3724fcbae6235accfa9025f9cc0e15abd79d534094b4405aaa092a8e4d137cd6795a50516a76d7098981f1cbdf767fc7cf53f807d32b5101b3ba0c3db2eb22e70e19898ea197ff287371c8a98526f1fab57b446a9082abd5e77fea05cc5337564cd40ceb6f21e1529d46808a7f9dfd03702ed6ccaf31be9a20baeb1a0f453e0497c3ffddaae16012a300dece9147aed514e66316b603a8b438422011ba0fda6a467384c1277311ae9586e5baa65e3fb197cab01a9d839b81b5343f19290a00f02720543a48e733ca4f18777471b0840f1f25dc0c8e61de5715504903609e6a05c825f0b4465760d160e47f5f84e736c7b0d2196e52a01c3974b125fd7a3224ea04d04067ea381da30cadfd36aa2cb1804e8307254bc9a883ebfa39d159b61c119a07f829aa1f376ffe4373e40912576beaf801b035fade0eb9923aae9d2d4cdc4cea092664e0322a11173fa7da7d5149d9b042551e546f9cb9912e86db84b7a6f8ee2a0711815f7bc0dd6bbe61bebb5c93e8a0f5e07b193fe303acb318e4ef8ebd74a9380").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0fa16c381c9407da90879bf32e2084769a102f4dd505cee8093a3f5f5d5d11897a02e7daca78cdd4bf6f895f54c08da29ec71c621dc987178f71cf88837422b9dbba027bb1b0aaaaec895c5f719e485905eda3119f4df0f3ba4fb53e560974d17f567a08ef21213d4f2b18f4afbf5e1a3823161a31971d18d0b83c6df044cb6676b7ceda03d9ab8d58ef85e067b9da2bc899df09dcd41a886076521fa8ee3afb25f13d7c2a06d355255fa840d7aca803bb9486a969879ef3f403facb0b38ee3e7c89255e043a01a289c3af5517fd34799b37159c365964ed3511031574af034788c76d7597bb7a09de99bcbf90daa9fbc363cc42606f1d303d3589c36e1a037758fed92a0186d51a0c6ee166b4fb46bf4272f5fb3d2947649db5042e999a4b1a579d781151797121da0ce52b5820413a2bf7de720841e6a7224857f9adcf5dea56fa443c0675264931fa0975c99cfe1455d01ee6f3199e30a4d60f0770588454a235956f114fe9a4cac3ea03ad3c23b37f0004e835b8f2e0435c0248fd039c20c33ddfbbd7541b891b4afaca0f93e9f7841ced51de169d29613da8e39dda1c486bf03674fe25c74a294a57675a03a1aa0730d32cc21169724a4cdbd4f2b97245e520814a8983d2752e15455238ba0dc1eb94acdc6fa937ca3cfe76a5d7f40935beea7d6bcf0ae0b9f95f9b96abc4da0b4ad959ea31afa024dd49a00c6c8b83b7192bd05c9e30d3382d6d47fcbe7f10280").to_vec()), + BoundedVec::truncate_from(hex!("f90211a0480f6762979b1760658dfb6e799619c1782c056285565d909532cffdca48a7aca09722f0a6e84b4709d9d679709cf56c36030401959a68ca1200fca4fd45a7dd38a000835e044809c0a8e9ba3b91d2ff851051480178da4ec312c61aec9a246d3979a0669269114e17b007ea67b3fbf27aa2f84fd2c8003ce1f36b8d33d67a6eca7469a0171cdadb913b5d039f776caceaa312bbc8e8dc357e7d782dc3a0c6e6a2a0da5ba0eac5dec43c8a7a00e40aecbb0d0b13f31464ff1ad4a764c6ff4581cd6f2a7332a0df68af5b5502dd5ef713e5f670cb11950e713ae8c143a4f331b05bf5dfdadffca0215883bf3ae115539f7792c3187a21ba302928b2184e81b05b5594a917018774a0e4c394a136f0c0e1c9a5bf73f249f6f7df3b664323a302924bb5ba269f7ee61fa0035a6b61964189a1508e2ad03d910e90dfc995b8aaec8b7a43bc460c72a46606a08b4a9bc6de38ca5e2405d1dd2cf8709bdb4b92e969210bef2a89ab286799bcf3a053d23a5fddd8218e1c5d3664496e09dfa4e4ebe513014d05ab949558c18399fea03949393cafa9086ecc8f55516cd414034deb32b32e35bcf7c75c31116a544008a0d5c4b0586d91d02284d2343033f5b65572b4ec07b61e650bf0d15049bdd00ab0a01c4f252dd383c4d008e66839589716fece51f9748a761dbe2291c008896a2e28a0ec1f09945d1f38964901d79792ee69ae5300bb7cee5a5bdf6d9e6efdb8eec43080").to_vec()), + BoundedVec::truncate_from(hex!("f90151a023b80573a6326250c3ae2efbe4af8207d8c1a20acfbfbb8444c7b728bff4e054a0aace3888a6f1f350b8d8ebc1e11687281610dd304eb527cbf884e12363a5a7a3a07cc000006215a0e9d69011c9c53a2b1ba6412a2b98c0439c8efde0a55601b58ca045d4fb94af2b968111c95fc4e55d1da32159431cf5e8b7d99334b90a8cb0efbd8080a00b092b863d6b5435d71a0d65ece895d7b115b9d6d76cd633def212627fe50dfc8080a0270c83c653946af43045281ed905ad9307ba019729f6b8c4712a30ce3b2b12918080a0c0efdb94ce26fd150d90d049e10595cac38e8f151198536fd9d4f8965ca772ffa006a6f61b1e3d71530b9b630d2fa306a480b49bdf83e14ac397398cf5f81c7e8da02acbd28e4f5185b16c60ce005bcb30acaf8e3e70e46db714869bb0f60e1a3a05a0db46a0c8fb8a7ed852f1fcffd35af11aa2bf758ffa8079ac1739d7c33e23511180").to_vec()), + BoundedVec::truncate_from(hex!("f87180808080808080808080a0ab0da2d5bc9713d2a60975c6fdd916ba1729acc7e75110677583e7e37c2c6df68080a0c186d6514c8893dbbde6a0d9b5294857892ce0b49a44c0799edfba1567b0961080a0c37fb0f6ba6981de5e302ac5538f212162e0b885068c9f1d9ebe091c1d4e031d80").to_vec()), + BoundedVec::truncate_from(hex!("f8669d32f0e5aa610617dbfcec97bc206d49dc85c62fdfcd084b1fec6dd67dc5b846f8440201a0dad0d599c05e47b3960c18fcb0ad5089027159340e6a86e62a1f618945433650a0636d977dc571e5f18377d0f398751d5ca05b1c5041b6bc97fc3564217d52ee53").to_vec()), + ]) +} + +fn get_valid_amb_storage_proof() -> ValidProof { + BoundedVec::truncate_from(vec![ + BoundedVec::truncate_from(hex!("f90131a0358aed89bfaa22b0179d1015fa6034c7ad29702af20b05b02f3cf63f69c2811280808080a08c857f53d31e0c1b681ff481d435a48986faa0615d611b05db5d0b3f4691f6d1a0d40ba3e2c5ca0722bb231d4a661b452920758ab202dbcfbc8e505d9f436e5600a0c3d20e38630b6b8f49ea6ca919b9077081557a4ca337c374e42219e4738a8970a0d2059c3c7e4dacb02dec49822ce85568a4419849a093ec956598dc2c3269238d808080a08c675371a85fc8f524a707007b05d0b87d7ecbde37f10e953a03da38431d31f8a0079a6b40f411dbc043c20594864f4e7f3e5ef2ef8e27f230c3431ec771b2d001a079866ac4ff54c3062d8fbd4fa347961e9a905b4114a2ed9785e22a5c03f4ffb8a0fef4138a6a9993fb0418e252583a03d2586caf404c7a16f7083600f49aac8cf280").to_vec()), + BoundedVec::truncate_from(hex!("f851808080a0aec544652aa67b55271eec87a45f5ca89f6a6ea762450ca63b014ceb073e4e9d80808080808080808080a08c06dc4d3d3e8d7fe5a8a88222594ba9f4cdb19baaa8e60919b5617770423f828080").to_vec()), + BoundedVec::truncate_from(hex!("f843a020b5be412f275a18f6e4d622aee4ff40b21467c926224771b782d4c095d1444ba1a05774ba3f9618e2da3885b0e2853e4005c3e836625e8be0f69bf3d93f51fac58d").to_vec()), + ]) +} + +pub fn get_valid_message() -> AddressedMessage { + let asset_id = H256::zero(); + let amount = 1_000_000_000_000_000_000u128; + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let to = hex!("0000000000000000000000000000000000000000000000000000000000000001"); + + AddressedMessage { + message: Message::FungibleToken { asset_id, amount }, + from: from.into(), + to: to.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } +} + +fn get_valid_amb_message() -> AddressedMessage { + let recipient = hex!("3547517355657647456b6f7847444a5044576251694b4478714b6d675a357047"); + let from = hex!("681257BED628425a28B469114Dc21A7c30205cFD000000000000000000000000"); + let data = BoundedVec::defensive_truncate_from("Hello, World!".as_bytes().to_vec()); + + AddressedMessage { + message: Message::ArbitraryMessage(data), + from: from.into(), + to: recipient.into(), + origin_domain: 2, + destination_domain: 1, + id: 0, + } +} + +#[test] +fn test_fulfill_step_call_proof_not_valid() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_invalid_proof(), + slot, + ); + + assert_err!(result, Error::::VerificationFailed); + }); +} + +#[test] +fn test_fulfill_step_call_not_valid_function_id() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + let invalid_function_id: H256 = H256(hex!( + "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" + )); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + invalid_function_id, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::FunctionIdNotKnown); + }); +} + +#[test] +fn test_fulfill_step_call_finality_not_met() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 512, // max finality + }); + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::NotEnoughParticipants); + }); +} + +#[test] +fn test_fulfill_step_call_wrong_updater_address() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + let invalid_function_id: H256 = H256(hex!( + "bf44af6890508b3b7f6910d4a4570a0d524769a23ce340b2c7400e140ad168ab" + )); + + let wrong_updater: AccountId32 = AccountId32::new([1u8; 32]); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(wrong_updater), + invalid_function_id, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::UpdaterMisMatch); + }); +} + +#[test] +fn test_execute_fungible_token_via_storage() { + new_test_ext().execute_with(|| { + let balance_before = Balances::balance(&Bridge::account_id()); + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + let message = get_valid_message(); + let message_encoded = message.clone().abi_encode(); + let message_root = H256(keccak_256(message_encoded.as_slice())); + + // amount in message 1000000000000000000 + let result = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + let expected_message_root: H256 = H256(hex!( + "efac9989593dfa1e64bac26dd75fd613470d99766ad2c954af658253a09d1ad8" + )); + let balance_left = Balances::balance(&Bridge::account_id()); + assert_ok!(result); + assert_eq!( + balance_before.saturating_sub(1000000000000000000u128), + balance_left + ); + assert_eq!(expected_message_root, message_root); + assert_eq!( + MessageStatus::::get(message_root), + MessageStatusEnum::ExecutionSucceeded + ); + }); +} + +#[test] +fn test_execute_fungible_token_via_storage_with_trimmed_storage_value() { + new_test_ext().execute_with(|| { + let balance_before = Balances::balance(&Bridge::account_id()); + Broadcasters::::set( + 2, + H256(hex!( + "1369a4c9391cf90d393b40faead521b0f7019dc5000000000000000000000000" + )), + ); + + let slot = 4965568; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "5e3fe0dd03c7ce3f89524cfa65545232bbf52645b52ac0a3939f766540a6ed69" + )), + ); + + let account_proof = get_valid_trimmed_account_proof(); + let storage_proof = get_valid_trimmed_storage_proof(); + + let message = AddressedMessage { + message: FungibleToken { + asset_id: H256::zero(), + amount: 10_000_000_000_000_000, + }, + from: H256(hex!( + "8d31529525f23b14767d4dde78567ca083d3d56f000000000000000000000000" + )), + to: H256(hex!( + "1a985fdff5f6eee4afce1dc0f367ab925cdca57e7e8585329830fc3ce6ef4e7a" + )), + origin_domain: 2, + destination_domain: 1, + id: 5469, + }; + + let message_encoded = message.clone().abi_encode(); + let message_root = H256(keccak_256(message_encoded.as_slice())); + + // amount in message 1000000000000000000 + let result = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + let expected_message_root: H256 = H256(hex!( + "00eee07ead3b0877b420f4f13c67d4449fa051db6a6b877de1265def8f1f3f99" + )); + let balance_left = Balances::balance(&Bridge::account_id()); + assert_ok!(result); + assert_eq!( + balance_before.saturating_sub(10_000_000_000_000_000u128), + balance_left + ); + assert_eq!(expected_message_root, message_root); + assert_eq!( + MessageStatus::::get(message_root), + MessageStatusEnum::ExecutionSucceeded + ); + }); +} + +#[test] +fn test_execute_message_with_frozen_chain() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_message(); + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + + // Goal: Prevent from executing message + SourceChainFrozen::::set(2, true); + let error = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + assert_err!(error, Error::::SourceChainFrozen); + }); +} + +#[test] +fn test_execute_message_with_faulty_account_proof() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let account_proof = get_invalid_account_proof(); + let storage_proof = get_valid_storage_proof(); + let message = get_valid_message(); + + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + // invalid proof should return error + assert_err!(fail, Error::::CannotGetStorageRoot); + }); +} + +#[test] +fn test_execute_message_with_faulty_storage_proof() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + let account_proof = get_valid_account_proof(); + let storage_proof = get_invalid_storage_proof(); + let message = get_valid_message(); + + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + // invalid storage proof should return error + assert_err!(fail, Error::::CannotGetStorageValue); + }); +} + +#[test] +fn test_execute_message_with_already_executed_message() { + new_test_ext().execute_with(|| { + let balance_before_transfer = Balances::balance(&Bridge::account_id()); + + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_message(); + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + let account: AccountId32 = AccountId32::from_slice(message.to.as_bytes()).unwrap(); + let account_balance_before = Balances::balance(&account); + + let ok = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + + assert_ok!(ok); + let balance_after_transfer = Balances::balance(&Bridge::account_id()); + let expected_transfered_value = 1000000000000000000u128; + assert_eq!( + balance_before_transfer, + balance_after_transfer.saturating_add(expected_transfered_value) + ); + let account_balance = Balances::balance(&account); + assert_eq!(account_balance_before, 0); + assert_eq!(account_balance, expected_transfered_value); + + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + assert_err!(fail, Error::::MessageAlreadyExecuted); + }); +} + +#[test] +fn test_execute_message_with_unsupported_domain() { + new_test_ext().execute_with(|| { + Broadcasters::::set( + 2, + H256(hex!( + "DC3542b6fcC39dC0d51ecdCbc6Fbb130D5e48d95000000000000000000000000" + )), + ); + + let slot = 8581263; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let mut message = get_valid_message(); + // alter message + message.origin_domain = 4; + + let account_proof = get_valid_account_proof(); + let storage_proof = get_valid_storage_proof(); + + let fail = Bridge::execute( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + slot, + message, + account_proof, + storage_proof, + ); + + assert_err!(fail, Error::::UnsupportedOriginChain); + }); +} + +#[test] +fn test_fulfill_step_call() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_ok!(result); + let finalized_slot = 7634848; + // ensure that event is fired + let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { + slot: finalized_slot, + finalization_root: H256(hex!( + "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" + )), + execution_state_root: H256(hex!( + "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" + )), + }); + + let finalized_slot = 7634848; + + let header = Headers::::get(finalized_slot); + let head = Head::::get(); + let ex_state_root = ExecutionStateRoots::::get(finalized_slot); + + assert_eq!( + header, + H256(hex!( + "e4566e0cf4edb171a3eedd59f9943bbcd0b1f6b648f1a6e26d5264b668ab41ec" + )) + ); + assert_eq!( + ex_state_root, + H256(hex!( + "51e76629b32b943497207e7b7ccff8fbc12e9e6d758cc7eed972422c4cad02b9" + )) + ); + assert_eq!(head, finalized_slot); + assert_eq!(expected_event, System::events()[0].event); + }); +} + +#[test] +fn test_fulfill_step_call_wrong_poseidon() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + // current poseidon is not the same as the one in the valid proof + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332da" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::StepVerificationError); + }); +} + +#[test] +fn test_fulfill_step_call_slot_behind_head() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + + // move head forward + Head::::set(8634942); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + + assert_err!(result, Error::::SlotBehindHead); + }); +} + +#[test] +fn test_fulfill_rotate_call() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" + )), + ); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + get_valid_rotate_input(), + get_valid_rotate_output(), + get_valid_rotate_proof(), + slot, + ); + + assert_ok!(result); + // ensure that event is fired + let expected_poseidon = U256::from_dec_str( + "16399439943012933445970260519503780180385945954293268151243539801891563949197", + ) + .unwrap(); + + let current_period = 931; + let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { + period: current_period + 1, + root: expected_poseidon, + }); + + let poseidon = SyncCommitteePoseidons::::get(current_period + 1); + + assert_eq!(expected_event, System::events()[0].event); + assert_eq!(poseidon, expected_poseidon); + }); +} + +#[test] +fn test_fulfill_rotate_call_wrong_header() { + new_test_ext().execute_with(|| { + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + // set current wrong header for valid rotate call + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57855" + )), + ); + + let result = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + get_valid_rotate_input(), + get_valid_rotate_output(), + get_valid_rotate_proof(), + slot, + ); + + assert_err!(result, Error::::RotateVerificationError); + }); +} + +#[test] +fn test_fulfill_call_function_ids_not_set() { + new_test_ext().execute_with(|| { + Updater::::set(H256(TEST_SENDER_VEC)); + + Bridge::set_function_ids(RawOrigin::Root.into(), None).unwrap(); + let slot = 7634942; + let err = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + assert_err!(err, Error::::FunctionIdsAreNotSet); + }); +} + +#[test] +fn test_fulfill_step_call_verification_key_is_not_set() { + new_test_ext().execute_with(|| { + Bridge::set_step_verification_key(RawOrigin::Root.into(), None).unwrap(); + Updater::::set(H256(TEST_SENDER_VEC)); + + let slot = 7634942; + + SyncCommitteePoseidons::::insert( + 931, + U256::from(hex!( + "0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df" + )), + ); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 461, + }); + + let err = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + STEP_FUNCTION_ID, + get_valid_step_input(), + get_valid_step_output(), + get_valid_step_proof(), + slot, + ); + assert_err!(err, Error::::VerificationKeyIsNotSet); + }); +} + +#[test] +fn test_fulfill_rotate_call_verification_key_is_not_set() { + new_test_ext().execute_with(|| { + Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None).unwrap(); + let slot = 7634942; + Updater::::set(H256(TEST_SENDER_VEC)); + + ConfigurationStorage::::set(Configuration { + slots_per_period: 8192, + finality_threshold: 342, + }); + + Headers::::set( + slot, + H256(hex!( + "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" + )), + ); + + let err = Bridge::fulfill_call( + RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), + ROTATE_FUNCTION_ID, + get_valid_rotate_input(), + get_valid_rotate_output(), + get_valid_rotate_proof(), + slot, + ); + assert_err!(err, Error::::VerificationKeyIsNotSet); + }); +} + +#[test] +fn set_whitelisted_domains_works_with_root() { + new_test_ext().execute_with(|| { + let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); + assert_ne!(WhitelistedDomains::::get(), domains); + + let ok = Bridge::set_whitelisted_domains(RawOrigin::Root.into(), domains.clone()); + assert_ok!(ok); + assert_eq!(WhitelistedDomains::::get(), domains); + + System::assert_last_event(RuntimeEvent::Bridge(Event::WhitelistedDomainsUpdated)); + }); +} + +#[test] +fn set_whitelisted_domains_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let domains = BoundedVec::try_from([0, 1, 2, 3].to_vec()).unwrap(); + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_whitelisted_domains(origin, domains.clone()); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_configuration_works_with_root() { + new_test_ext().execute_with(|| { + let conf = Configuration { + slots_per_period: 1, + finality_threshold: 69, + }; + assert_ne!(ConfigurationStorage::::get(), conf); + + let ok = Bridge::set_configuration(RawOrigin::Root.into(), conf); + assert_ok!(ok); + assert_eq!(ConfigurationStorage::::get(), conf); + + let expected_event = RuntimeEvent::Bridge(Event::ConfigurationUpdated { + slots_per_period: conf.slots_per_period, + finality_threshold: conf.finality_threshold, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_configuration_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let conf = Configuration { + slots_per_period: 1, + finality_threshold: 69, + }; + + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_configuration(origin, conf); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_broadcaster_works_with_root() { + new_test_ext().execute_with(|| { + let domain = 2; + let old = Broadcasters::::get(domain); + assert_ne!(old, STEP_FUNCTION_ID); + + let ok = Bridge::set_broadcaster(RawOrigin::Root.into(), domain, STEP_FUNCTION_ID); + assert_ok!(ok); + assert_eq!(Broadcasters::::get(domain), STEP_FUNCTION_ID); + + let expected_event = RuntimeEvent::Bridge(Event::BroadcasterUpdated { + old, + new: STEP_FUNCTION_ID, + domain, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_broadcaster_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_broadcaster(origin, 2, STEP_FUNCTION_ID); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_poseidon_hash_works_with_root() { + new_test_ext().execute_with(|| { + let period = 2; + let poseidon_hash = BoundedVec::try_from( + [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, + ] + .to_vec(), + ) + .unwrap(); + let root = U256::from_dec_str( + "1780731860627700044960722568376592200742329637303199754547598369979440671", + ) + .unwrap(); + assert_ne!(SyncCommitteePoseidons::::get(period), root); + + let ok = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); + assert_ok!(ok); + assert_eq!(SyncCommitteePoseidons::::get(period), root); + + let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { period, root }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_poseidon_hash_wrong_hash_length() { + new_test_ext().execute_with(|| { + let period = 2; + let poseidon_hash = BoundedVec::try_from( + [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + ] + .to_vec(), + ) + .unwrap(); + + let error = Bridge::set_poseidon_hash(RawOrigin::Root.into(), period, poseidon_hash); + assert_err!(error, Error::::CannotParseOutputData); + assert_eq!(SyncCommitteePoseidons::::get(period), U256::zero()); + }); +} + +#[test] +fn set_poseidon_hash_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let root = BoundedVec::try_from([0, 1, 2, 3, 4].to_vec()).unwrap(); + + let ok = Bridge::set_poseidon_hash(origin, 2, root); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn source_chain_froze_works_with_root() { + new_test_ext().execute_with(|| { + let source_chain_id = 2; + let frozen = true; + assert_ne!(SourceChainFrozen::::get(source_chain_id), frozen); + + let ok = Bridge::source_chain_froze(RawOrigin::Root.into(), source_chain_id, frozen); + assert_ok!(ok); + assert_eq!(SourceChainFrozen::::get(source_chain_id), frozen); + + let expected_event = RuntimeEvent::Bridge(Event::SourceChainFrozen { + source_chain_id, + frozen, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn source_chain_froze_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + + let ok = Bridge::source_chain_froze(origin, 2, true); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn send_message_arbitrary_message_works() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::ArbitraryMessage(BoundedVec::truncate_from([0, 1, 2, 3].to_vec())); + let to = ROTATE_FUNCTION_ID; + let domain = 2; + + let event = Event::MessageSubmitted { + from: TEST_SENDER_VEC.into(), + to, + message_type: message.r#type(), + destination_domain: domain, + message_id: tx_uid(1, 0), + }; + let ok = Bridge::send_message(origin, message, to, domain); + assert_ok!(ok); + System::assert_last_event(RuntimeEvent::Bridge(event)); + }); +} + +#[test] +fn send_message_arbitrary_message_doesnt_accept_empty_data() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::ArbitraryMessage(BoundedVec::truncate_from(vec![])); + + let ok = Bridge::send_message(origin, message, ROTATE_FUNCTION_ID, 2); + assert_err!(ok, Error::::InvalidBridgeInputs); + }); +} + +#[test] +fn send_message_fungible_token_works() { + new_test_ext().execute_with(|| { + use crate::BalanceOf; + use frame_support::traits::Currency; + + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::FungibleToken { + asset_id: H256::zero(), + amount: 100, + }; + let to = ROTATE_FUNCTION_ID; + let domain = 2; + + Balances::make_free_balance_be( + &TEST_SENDER_VEC.into(), + BalanceOf::::max_value() / 2u128, + ); + + let event = Event::MessageSubmitted { + from: TEST_SENDER_VEC.into(), + to, + message_type: message.r#type(), + destination_domain: domain, + message_id: tx_uid(1, 0), + }; + let ok = Bridge::send_message(origin, message, to, domain); + assert_ok!(ok); + System::assert_last_event(RuntimeEvent::Bridge(event)); + }); +} + +#[test] +fn send_message_fungible_token_does_not_accept_zero_amount() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let message = Message::FungibleToken { + asset_id: H256::zero(), + amount: 0, + }; + let to = ROTATE_FUNCTION_ID; + let domain = 2; + + let err = Bridge::send_message(origin, message, to, domain); + assert_err!(err, Error::::InvalidBridgeInputs); + }); +} + +#[test] +fn execute_arbitrary_message_works() { + new_test_ext().execute_with(|| { + use crate::BalanceOf; + use frame_support::traits::Currency; + + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + Balances::make_free_balance_be( + &TEST_SENDER_VEC.into(), + BalanceOf::::max_value() / 2u128, + ); + + Broadcasters::::set( + 2, + H256(hex!( + "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" + )), + ); + + let slot = 5085118; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_amb_message(); + let account_proof = get_valid_amb_account_proof(); + let storage_proof = get_valid_amb_storage_proof(); + + let ok = Bridge::execute( + origin, + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + assert_ok!(ok); + let encoded_data = message.clone().abi_encode(); + let message_root = H256(keccak_256(encoded_data.as_slice())); + + let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { + from: message.from, + to: message.to, + message_id: message.id, + message_root, + }); + System::assert_last_event(expected_event); + assert_eq!( + MessageStatus::::get(message_root), + MessageStatusEnum::ExecutionSucceeded + ) + }); +} + +#[test] +fn test_double_execute_arbitrary_message() { + new_test_ext().execute_with(|| { + use crate::BalanceOf; + use frame_support::traits::Currency; + + let origin1 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let origin2 = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + Balances::make_free_balance_be( + &TEST_SENDER_VEC.into(), + BalanceOf::::max_value() / 2u128, + ); + + Broadcasters::::set( + 2, + H256(hex!( + "Aa8c1bFC413e00884A7ac991851686D27b387997000000000000000000000000" + )), + ); + + let slot = 5085118; + ExecutionStateRoots::::set( + slot, + H256(hex!( + "c42310d65b1e953e8864480367a03179d6bd78d4ca522a5a977d2801b9b2e1d9" + )), + ); + + let message = get_valid_amb_message(); + + let account_proof = get_valid_amb_account_proof(); + let storage_proof = get_valid_amb_storage_proof(); + + let ok = Bridge::execute( + origin1, + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + assert_ok!(ok); + + let err = Bridge::execute( + origin2, + slot, + message.clone(), + account_proof.clone(), + storage_proof.clone(), + ); + assert_err!(err, Error::::MessageAlreadyExecuted); + + let encoded_data = message.clone().abi_encode(); + let message_root = H256(keccak_256(encoded_data.as_slice())); + + let expected_event = RuntimeEvent::Bridge(Event::MessageExecuted { + from: message.from, + to: message.to, + message_id: message.id, + message_root, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_function_ids_works_with_root() { + new_test_ext().execute_with(|| { + let ok = Bridge::set_function_ids(RawOrigin::Root.into(), None); + assert_ok!(ok); + assert_eq!(FunctionIds::::get(), None); + + let value = Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID)); + let ok = Bridge::set_function_ids(RawOrigin::Root.into(), value); + assert_ok!(ok); + assert_eq!(FunctionIds::::get(), value); + + let expected_event = RuntimeEvent::Bridge(Event::FunctionIdsUpdated { value }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_function_ids_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_function_ids(origin, None); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_step_verification_key_works_with_root() { + new_test_ext().execute_with(|| { + let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), None); + assert_ok!(ok); + assert_eq!(StepVerificationKey::::get(), None); + + let value = Some(BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap()); + let ok = Bridge::set_step_verification_key(RawOrigin::Root.into(), value.clone()); + assert_ok!(ok); + assert_eq!(StepVerificationKey::::get(), value.clone()); + + let expected_event = RuntimeEvent::Bridge(Event::StepVerificationKeyUpdated { value }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_step_verification_key_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_step_verification_key(origin, None); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn set_rotate_verification_key_works_with_root() { + new_test_ext().execute_with(|| { + let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), None); + assert_ok!(ok); + assert_eq!(RotateVerificationKey::::get(), None); + + let value = Some(BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap()); + let ok = Bridge::set_rotate_verification_key(RawOrigin::Root.into(), value.clone()); + assert_ok!(ok); + assert_eq!(RotateVerificationKey::::get(), value.clone()); + + let expected_event = RuntimeEvent::Bridge(Event::RotateVerificationKeyUpdated { value }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn set_rotate_verification_key_does_not_work_with_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let ok = Bridge::set_rotate_verification_key(origin, None); + assert_err!(ok, BadOrigin); + }); +} + +#[test] +fn update_updater() { + new_test_ext().execute_with(|| { + let old_updater = H256(TEST_SENDER_VEC); + Updater::::set(old_updater); + + let new_updater = H256([2u8; 32]); + let ok = Bridge::set_updater(RawOrigin::Root.into(), new_updater); + assert_ok!(ok); + + let expected_event = RuntimeEvent::Bridge(Event::NewUpdater { + old: old_updater, + new: new_updater, + }); + System::assert_last_event(expected_event); + }); +} + +#[test] +fn update_updater_non_root() { + new_test_ext().execute_with(|| { + let origin = RuntimeOrigin::signed(TEST_SENDER_VEC.into()); + let old_updater = H256(TEST_SENDER_VEC); + Updater::::set(old_updater); + let new_updater = H256([2u8; 32]); + + let err = Bridge::set_updater(origin, new_updater); + assert_err!(err, BadOrigin); + assert_eq!(old_updater, Updater::::get()); + }); +} From 72b27697c23fde7faca9c0a2399b9f9bdd4bda01 Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Mon, 12 Aug 2024 17:37:31 -0700 Subject: [PATCH 41/53] add docs --- pallets/vector/src/lib.rs | 1 - pallets/vector/src/tests_new.rs | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 3dbecfd48..3bedacb36 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -35,7 +35,6 @@ mod tests_new; mod verifier; mod weights; - pub use pallet::*; pub type FunctionInput = BoundedVec>; diff --git a/pallets/vector/src/tests_new.rs b/pallets/vector/src/tests_new.rs index 22cd29f69..7d32ba7a3 100644 --- a/pallets/vector/src/tests_new.rs +++ b/pallets/vector/src/tests_new.rs @@ -1,3 +1,5 @@ +/// Tests for Vector that use CBOR encoded Ethereum light client inputs instead of ZKProofs. +/// Adapted from corresponding tests in src/tests.rs. use std::fs; use frame_support::{assert_err, assert_ok}; use hex_literal::hex; From c6eed4c016661b0aa693cbf319917d87e226457f Mon Sep 17 00:00:00 2001 From: Xavier DMello Date: Tue, 13 Aug 2024 16:31:14 -0700 Subject: [PATCH 42/53] deprecate function_id --- pallets/vector/src/tests_new.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/vector/src/tests_new.rs b/pallets/vector/src/tests_new.rs index 7d32ba7a3..d0b2a3f90 100644 --- a/pallets/vector/src/tests_new.rs +++ b/pallets/vector/src/tests_new.rs @@ -27,7 +27,7 @@ fn test_fulfill_step_call() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, // TODO: replace with working h256::zero + H256::zero(), // Unused value inputs.clone(), ); @@ -84,7 +84,7 @@ fn test_fulfill_step_call_slot_behind_head() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - STEP_FUNCTION_ID, + H256::zero(), // Unused value inputs, ); @@ -107,7 +107,7 @@ fn test_fulfill_rotate_call() { let result = Bridge::fulfill_call( RuntimeOrigin::signed(TEST_SENDER_ACCOUNT), - ROTATE_FUNCTION_ID, // TODO: replace with working h256::zero + H256::zero(), // Unused value inputs, ); From f49f8d83aa48809be140f3c4ff77ce7f2469e6f1 Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 23 Sep 2024 12:01:32 +0530 Subject: [PATCH 43/53] update lock --- Cargo.lock | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 50a8cf1e3..2109cbf99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2383,6 +2383,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core 0.9.9", +] + [[package]] name = "data-encoding" version = "2.5.0" @@ -7669,6 +7682,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "raw-cpuid" +version = "11.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" +dependencies = [ + "bitflags 2.5.0", +] + [[package]] name = "rawpointer" version = "0.2.1" From 28e52fc4ca43c58d99d352a7678ee06501b80841 Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 23 Sep 2024 12:48:43 +0530 Subject: [PATCH 44/53] make std & no_std build working --- Cargo.lock | 2858 +++++++++++++++++++++---------- Cargo.toml | 28 +- pallets/vector/Cargo.toml | 4 +- pallets/vector/src/lib.rs | 92 +- pallets/vector/src/tests_new.rs | 20 +- rust-toolchain.toml | 2 +- 6 files changed, 2012 insertions(+), 992 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2109cbf99..c99c5e05b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,18 +23,18 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ - "gimli 0.28.1", + "gimli 0.31.0", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aead" @@ -68,18 +68,18 @@ dependencies = [ "cipher 0.4.4", "ctr", "ghash", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] name = "afl" -version = "0.15.4" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5effc0335134b5dc5dbc4c18d114db4e08af8a7e7431a4be12025bbc88eb8673" +checksum = "c21e10b6947189c5ff61343b5354e9ad1c1722bd47b69cd0a6b49e5fa7f7ecf6" dependencies = [ "home", "libc", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "xdg", ] @@ -95,7 +95,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "once_cell", "version_check", ] @@ -107,7 +107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.12", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -124,9 +124,168 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "alloy" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4a4aaae80afd4be443a6aecd92a6b255dcdd000f97996928efb33d8a71e100" +dependencies = [ + "alloy-consensus", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-transport-http", +] + +[[package]] +name = "alloy-chains" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805f7a974de5804f5c053edc6ca43b20883bdd3a733b3691200ae3a4b454a2db" +dependencies = [ + "num_enum", + "strum 0.26.3", +] + +[[package]] +name = "alloy-consensus" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c309895995eaa4bfcc345f5515a39c7df9447798645cc8bf462b6c5bf1dc96" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "serde", +] + +[[package]] +name = "alloy-core" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529fc6310dc1126c8de51c376cbc59c79c7f662bd742be7dc67055d5421a81b4" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413902aa18a97569e60f679c23f46a18db1656d87ab4d4e49d0e1e52042f66df" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.6.18", +] + +[[package]] +name = "alloy-eips" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9431c99a3b3fe606ede4b3d4043bdfbcb780c45b8d8d226c3804e2b75cfbe68" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "ethereum_ssz 0.5.4", + "ethereum_ssz_derive 0.5.4", + "k256", + "once_cell", + "serde", + "sha2 0.10.8", +] + +[[package]] +name = "alloy-genesis" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79614dfe86144328da11098edcc7bc1a3f25ad8d3134a9eb9e857e06f0d9840d" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "bc05b04ac331a9f07e3a4036ef7926e49a8bf84a99a1ccfc7e2ab55a5fcbb372" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e2865c4c3bb4cdad3f0d9ec1ab5c0c657ba69a375651bd35e32fb6c180ccc2" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e701fc87ef9a3139154b0b4ccb935b565d27ffd9de020fe541bf2dec5ae4ede" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "thiserror", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9d5a0f9170b10988b6774498a022845e13eda94318440d17709d50687f67f9" +dependencies = [ + "alloy-primitives", + "alloy-serde", + "serde", +] [[package]] name = "alloy-primitives" @@ -139,6 +298,7 @@ dependencies = [ "cfg-if", "const-hex", "derive_more", + "ethereum_ssz 0.5.4", "hex-literal 0.4.1", "itoa", "k256", @@ -150,16 +310,278 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "alloy-provider" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9c0ab10b93de601a6396fc7ff2ea10d3b28c46f079338fa562107ebf9857c8" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru 0.12.4", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tracing", + "url", +] + [[package]] name = "alloy-rlp" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a43b18702501396fa9bcdeecd533bc85fac75150d308fc0f6800a01e6234a003" +checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" dependencies = [ + "alloy-rlp-derive", "arrayvec", "bytes", ] +[[package]] +name = "alloy-rlp-derive" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b38e3ffdb285df5d9f60cb988d336d9b8e3505acb78750c3bc60336a7af41d3" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c31a3750b8f5a350d17354e46a52b0f2f19ec5f2006d816935af599dedc521" +dependencies = [ + "alloy-rpc-types-beacon", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-beacon" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8a24bcff4f9691d7a4971b43e5da46aa7b4ce22ed7789796612dc1eed220983" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "ethereum_ssz 0.5.4", + "ethereum_ssz_derive 0.5.4", + "serde", + "serde_with", + "thiserror", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff63f51b2fb2f547df5218527fd0653afb1947bf7fead5b3ce58c75d170b30f7" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-serde", + "ethereum_ssz 0.5.4", + "ethereum_ssz_derive 0.5.4", + "jsonwebtoken", + "rand", + "serde", + "thiserror", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e18424d962d7700a882fe423714bd5b9dde74c7a7589d4255ea64068773aef" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.13.0", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "alloy-serde" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33feda6a53e6079895aed1d08dcb98a1377b000d80d16370fbbdb8155d547ef" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740a25b92e849ed7b0fa013951fe2f64be9af1ad5abe805037b44fb7770c5c47" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.5.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.77", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" +dependencies = [ + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.77", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcba3ca07cf7975f15d871b721fb18031eec8bce51103907f6dcce00b255d98" +dependencies = [ + "serde", + "winnow 0.6.18", +] + +[[package]] +name = "alloy-sol-types" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0590afbdacf2f8cca49d025a2466f3b6584a016a8b28f532f29f8da1007bae" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-http" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2437d145d80ea1aecde8574d2058cceb8b3c9cba05f6aea8e67907c660d46698" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower", + "tracing", + "url", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -192,47 +614,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -240,9 +663,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "approx" @@ -264,7 +687,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -494,7 +917,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -631,7 +1054,7 @@ dependencies = [ "ark-ff 0.4.2", "ark-serialize 0.4.2", "ark-std 0.4.0", - "ark-transcript", + "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf?rev=e9782f9)", "digest 0.10.7", "getrandom_or_panic", "zeroize", @@ -727,6 +1150,19 @@ dependencies = [ "sha3", ] +[[package]] +name = "ark-transcript" +version = "0.0.2" +source = "git+https://github.com/w3f/ring-vrf#0fef8266d851932ad25d6b41bc4b34d834d1e11d" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "rand_core 0.6.4", + "sha3", +] + [[package]] name = "array-bytes" version = "4.2.0" @@ -735,21 +1171,21 @@ checksum = "f52f63c5c1316a16a4b35eaac8b76a98248961a533f061684cb2a7cb0eafb6c6" [[package]] name = "array-bytes" -version = "6.2.2" +version = "6.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f840fb7195bcfc5e17ea40c26e5ce6d5b9ce5d584466e17703209657e459ae0" +checksum = "5d5dde061bd34119e902bbb2d9b90c5692635cf59fb91d582c2b68043f1b8293" [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "asn1-rs" @@ -776,7 +1212,7 @@ dependencies = [ "proc-macro2", "quote", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -803,9 +1239,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" dependencies = [ "async-lock", "cfg-if", @@ -814,32 +1250,54 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.32", + "rustix 0.38.37", "slab", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", + "event-listener 5.3.1", "event-listener-strategy", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite 0.2.14", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -852,7 +1310,7 @@ dependencies = [ "futures-sink", "futures-util", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", ] [[package]] @@ -874,14 +1332,14 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "avail-base" @@ -909,7 +1367,6 @@ dependencies = [ [[package]] name = "avail-core" version = "0.6.2" -source = "git+https://github.com/availproject/avail-core?tag=core-node-2#25ceee9ab6e15f88df873d03e6012a5982d3215c" dependencies = [ "binary-merkle-tree", "bounded-collections", @@ -941,7 +1398,7 @@ dependencies = [ "async-trait", "avail-base", "avail-core", - "clap 4.5.3", + "clap 4.5.18", "clap-num", "clap_complete", "da-control", @@ -1015,17 +1472,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ - "addr2line 0.21.0", - "cc", + "addr2line 0.24.1", "cfg-if", "libc", "miniz_oxide", - "object 0.32.2", + "object 0.36.4", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -1126,13 +1583,13 @@ dependencies = [ "lazy_static", "lazycell", "peeking_take_while", - "prettyplease 0.2.16", + "prettyplease 0.2.22", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -1177,9 +1634,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -1249,9 +1706,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.1" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" dependencies = [ "arrayref", "arrayvec", @@ -1278,10 +1735,24 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "digest 0.9.0", + "ff", + "group", + "pairing", + "rand_core 0.6.4", + "subtle 2.6.1", +] + [[package]] name = "blst" -version = "0.3.10" -source = "git+https://github.com/availproject/blst?tag=v0.3.10#556e037926d9c526c2eb6cb1522bea39690416ea" +version = "0.3.11" +source = "git+https://github.com/ToufeeqP/blst?rev=afdb0a4b7d98d4ff22c3a1d35faca223cde0ef3a#afdb0a4b7d98d4ff22c3a1d35faca223cde0ef3a" dependencies = [ "cc", "glob", @@ -1327,9 +1798,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.4" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byte-slice-cast" @@ -1345,9 +1816,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" [[package]] name = "byteorder" @@ -1357,9 +1828,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -1375,6 +1846,21 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + [[package]] name = "c2-chacha" version = "0.3.3" @@ -1387,18 +1873,18 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" dependencies = [ "serde", ] [[package]] name = "cargo-platform" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -1411,7 +1897,7 @@ checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" dependencies = [ "camino", "cargo-platform", - "semver 1.0.22", + "semver 1.0.23", "serde", "serde_json", "thiserror", @@ -1425,12 +1911,13 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.83" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -1444,9 +1931,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa50868b64a9a6fda9d593ce778849ea8715cd2a3d2cc17ffdb4a2f2f2f1961d" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", ] @@ -1499,16 +1986,17 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.35" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", - "windows-targets 0.52.4", + "windows-targets 0.52.6", ] [[package]] @@ -1535,7 +2023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 2.4.0", + "half 2.4.1", ] [[package]] @@ -1582,9 +2070,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", @@ -1605,9 +2093,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.3" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" dependencies = [ "clap_builder", "clap_derive", @@ -1624,36 +2112,36 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" dependencies = [ "anstream", "anstyle", - "clap_lex 0.7.0", + "clap_lex 0.7.2", "strsim 0.11.1", "terminal_size", ] [[package]] name = "clap_complete" -version = "4.5.1" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "885e4d7d5af40bfb99ae6f9433e292feac98d452dcb3ec3d25dfe7552b77da8c" +checksum = "8937760c3f4c60871870b8c3ee5f9b30771f792a7045c48bcbba999d7d6b3b8e" dependencies = [ - "clap 4.5.3", + "clap 4.5.18", ] [[package]] name = "clap_derive" -version = "4.5.3" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -1667,9 +2155,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "codespan-reporting" @@ -1683,25 +2171,25 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "comfy-table" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c64043d6c7b7a4c58e39e7efccfdea7b93d885a795d0c054a69dbbf4dd52686" +checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7" dependencies = [ - "strum 0.25.0", - "strum_macros 0.25.3", + "strum 0.26.3", + "strum_macros 0.26.4", "unicode-width", ] [[package]] name = "common" version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#665f5f51af5734c7b6d90b985dd6861d4c5b4752" +source = "git+https://github.com/w3f/ring-proof#1472ce9cd87cee49c56ce7869a0aba872d837c51" dependencies = [ "ark-ec 0.4.2", "ark-ff 0.4.2", @@ -1710,23 +2198,19 @@ dependencies = [ "ark-std 0.4.0", "fflonk", "getrandom_or_panic", - "merlin", - "rand_chacha 0.3.1", + "rand_core 0.6.4", ] [[package]] name = "common" -version = "0.5.5" -source = "git+https://github.com/a16z/helios.git#5d159575ceb0b46ca0c4ff6dab79799d3a5a7469" +version = "0.6.0" +source = "git+https://github.com/a16z/helios.git?rev=a8c61f0cbb85e61329610463f11a09e2b835e2c5#a8c61f0cbb85e61329610463f11a09e2b835e2c5" dependencies = [ - "bytes", - "ethers-core", + "alloy", "eyre", "hex", "serde", "serde_json", - "snowbridge-milagro-bls", - "ssz_rs", "superstruct", "thiserror", "tracing", @@ -1741,9 +2225,9 @@ checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -1756,21 +2240,24 @@ checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" [[package]] name = "consensus-core" -version = "0.1.0" -source = "git+https://github.com/a16z/helios.git#5d159575ceb0b46ca0c4ff6dab79799d3a5a7469" +version = "0.6.0" +source = "git+https://github.com/a16z/helios.git?rev=a8c61f0cbb85e61329610463f11a09e2b835e2c5#a8c61f0cbb85e61329610463f11a09e2b835e2c5" dependencies = [ - "bytes", - "common 0.5.5", - "ethers-core", + "alloy", + "bls12_381", + "ethereum_ssz 0.6.0", + "ethereum_ssz_derive 0.6.0", "eyre", - "hex", + "getrandom 0.2.15", "serde", - "serde_json", - "snowbridge-milagro-bls", - "ssz_rs", + "sha2 0.9.9", + "ssz_types", "superstruct", "thiserror", "tracing", + "tree_hash", + "tree_hash_derive", + "typenum", "zduny-wasm-timer", ] @@ -1821,16 +2308,16 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "once_cell", "tiny-keccak", ] [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "constcat" @@ -1856,9 +2343,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core2" @@ -1880,9 +2367,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1987,9 +2474,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -2049,9 +2536,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -2067,7 +2554,7 @@ checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", - "subtle 2.5.0", + "subtle 2.6.1", "zeroize", ] @@ -2099,7 +2586,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ "generic-array 0.14.7", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -2109,7 +2596,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" dependencies = [ "generic-array 0.14.7", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -2130,7 +2617,7 @@ dependencies = [ "byteorder", "digest 0.9.0", "rand_core 0.5.1", - "subtle 2.5.0", + "subtle 2.6.1", "zeroize", ] @@ -2145,8 +2632,8 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "rustc_version 0.4.0", - "subtle 2.5.0", + "rustc_version 0.4.1", + "subtle 2.6.1", "zeroize", ] @@ -2158,14 +2645,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "cxx" -version = "1.0.119" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "635179be18797d7e10edb9cd06c859580237750c7351f39ed9b298bfc17544ad" +checksum = "54ccead7d199d584d139148b04b4a368d1ec7556a1d9ea2548febb1b9d49f9a4" dependencies = [ "cc", "cxxbridge-flags", @@ -2175,9 +2662,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.119" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9324397d262f63ef77eb795d900c0d682a34a43ac0932bec049ed73055d52f63" +checksum = "c77953e99f01508f89f55c494bfa867171ef3a6c8cea03d26975368f2121a5c1" dependencies = [ "cc", "codespan-reporting", @@ -2185,24 +2672,24 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "cxxbridge-flags" -version = "1.0.119" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a87ff7342ffaa54b7c61618e0ce2bbcf827eba6d55b923b83d82551acbbecfe5" +checksum = "65777e06cc48f0cb0152024c77d6cf9e4bdb4408e7b48bea993d42fa0f5b02b6" [[package]] name = "cxxbridge-macro" -version = "1.0.119" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b5b86cf65fa0626d85720619d80b288013477a91a0389fa8bc716bf4903ad1" +checksum = "98532a60dedaebc4848cb2cba5023337cc9ea3af16a5b062633fabfd9f18fb60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -2354,8 +2841,18 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core 0.20.10", + "darling_macro 0.20.10", ] [[package]] @@ -2372,17 +2869,42 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.77", +] + [[package]] name = "darling_macro" version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core", + "darling_core 0.13.4", "quote", "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core 0.20.10", + "quote", + "syn 2.0.77", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -2393,20 +2915,20 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "data-encoding-macro" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" +checksum = "f1559b6cba622276d6d63706db152618eeb15b89b3e4041446b05876e352e639" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -2414,9 +2936,9 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" +checksum = "332d754c0af53bc87c108fed664d121ecf59207ec4196041f04d6ab9002ad33f" dependencies = [ "data-encoding", "syn 1.0.109", @@ -2424,9 +2946,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -2453,6 +2975,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -2488,6 +3011,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "derive_arbitrary" version = "1.3.2" @@ -2496,20 +3030,20 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 1.0.109", + "rustc_version 0.4.1", + "syn 2.0.77", ] [[package]] @@ -2545,7 +3079,7 @@ dependencies = [ "block-buffer 0.10.4", "const-oid", "crypto-common", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -2592,13 +3126,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -2608,7 +3142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d567df2c9c2870a43f3f2bd65aaeb18dbce1c18f217c3e564b4fbaeb3ee56c" dependencies = [ "cfg-if", - "clap 4.5.3", + "clap 4.5.18", "condtype", "divan-macros", "libc", @@ -2623,7 +3157,7 @@ checksum = "27540baf49be0d484d8f0130d7d8da3011c32a44d4fc873368154f1510e574a2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -2637,35 +3171,35 @@ dependencies = [ "ark-secret-scalar", "ark-serialize 0.4.2", "ark-std 0.4.0", - "ark-transcript", + "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf?rev=e9782f9)", "arrayvec", "zeroize", ] [[package]] name = "docify" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc4fd38aaa9fb98ac70794c82a00360d1e165a87fbf96a8a91f9dfc602aaee2" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" dependencies = [ "docify_macros", ] [[package]] name = "docify_macros" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63fa215f3a0d40fb2a221b3aa90d8e1fbb8379785a990cb60d62ac71ebdc6460" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" dependencies = [ "common-path", - "derive-syn-parse", + "derive-syn-parse 0.2.0", "once_cell", "proc-macro2", "quote", "regex", - "syn 2.0.53", + "syn 2.0.77", "termcolor", - "toml 0.8.12", + "toml 0.8.19", "walkdir", ] @@ -2681,6 +3215,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dusk-bls12_381" version = "0.11.3" @@ -2691,7 +3231,7 @@ dependencies = [ "dusk-bytes", "rand_core 0.6.4", "rayon", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -2712,7 +3252,7 @@ dependencies = [ "dusk-bls12_381", "dusk-bytes", "rand_core 0.6.4", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -2793,7 +3333,7 @@ dependencies = [ "rand_core 0.6.4", "serde", "sha2 0.10.8", - "subtle 2.5.0", + "subtle 2.6.1", "zeroize", ] @@ -2833,7 +3373,7 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sec1", - "subtle 2.5.0", + "subtle 2.6.1", "zeroize", ] @@ -2857,22 +3397,22 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -2915,9 +3455,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2929,23 +3469,17 @@ version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "ethereum-types", + "ethereum-types 0.14.1", "hex", - "once_cell", - "regex", - "serde", - "serde_json", "sha3", - "thiserror", - "uint", ] [[package]] name = "ethabi-decode" -version = "1.0.0" -source = "git+https://github.com/Snowfork/ethabi-decode.git?branch=master#5c01c8a0f2d0e4eccf600507cd573b27555b1d9d" +version = "1.1.0" +source = "git+https://github.com/Snowfork/ethabi-decode.git?branch=master#a23756949f84831c9bcaea95455468643b3212ca" dependencies = [ - "ethereum-types", + "ethereum-types 0.15.1", "tiny-keccak", ] @@ -2957,10 +3491,19 @@ checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", "fixed-hash", - "impl-codec", "impl-rlp", "impl-serde", - "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethbloom" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c321610643004cf908ec0f5f2aa0d8f1f8e14b540562a2887a1111ff1ecbf7b" +dependencies = [ + "crunchy", + "fixed-hash", "tiny-keccak", ] @@ -2970,40 +3513,92 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom", + "ethbloom 0.13.0", "fixed-hash", - "impl-codec", "impl-rlp", "impl-serde", - "primitive-types", - "scale-info", - "uint", + "primitive-types 0.12.2", + "uint 0.9.5", ] [[package]] -name = "ethers-core" -version = "2.0.13" -source = "git+https://github.com/gakonst/ethers-rs?rev=3bf1a9e0d698e9fdfc91d0353878901af5a5c5ef#3bf1a9e0d698e9fdfc91d0353878901af5a5c5ef" +name = "ethereum-types" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab15ed80916029f878e0267c3a9f92b67df55e79af370bf66199059ae2b4ee3" dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array 0.14.7", - "k256", - "num_enum", - "open-fastrlp", - "rand", - "rlp", + "ethbloom 0.14.1", + "fixed-hash", + "primitive-types 0.13.1", + "uint 0.10.0", +] + +[[package]] +name = "ethereum_hashing" +version = "0.7.0" +source = "git+https://github.com/ncitron/ethereum_hashing?rev=7ee70944ed4fabe301551da8c447e4f4ae5e6c35#7ee70944ed4fabe301551da8c447e4f4ae5e6c35" +dependencies = [ + "cpufeatures", + "sha2 0.10.8", +] + +[[package]] +name = "ethereum_serde_utils" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c228a90f44b159ccc0c16da6c56da42d0a521b0388cca87e89919d1af1889b2" +dependencies = [ + "alloy-primitives", + "hex", "serde", + "serde_derive", "serde_json", - "strum 0.26.3", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", +] + +[[package]] +name = "ethereum_ssz" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d3627f83d8b87b432a5fad9934b4565260722a141a2c40f371f8080adec9425" +dependencies = [ + "ethereum-types 0.14.1", + "itertools 0.10.5", + "smallvec", +] + +[[package]] +name = "ethereum_ssz" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "654bbebe60af1f6554e0e1216b8e336bc1a5ec483b7774d904e25e6e65a655c6" +dependencies = [ + "alloy-primitives", + "itertools 0.13.0", + "smallvec", +] + +[[package]] +name = "ethereum_ssz_derive" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eccd5378ec34a07edd3d9b48088cbc63309d0367d14ba10b0cdb1d1791080ea" +dependencies = [ + "darling 0.13.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ethereum_ssz_derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c21b5706b8763f5cbae4fbc407dacb8ce574ff619b98ff9d9c15adda2384681b" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -3014,23 +3609,23 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "4.0.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", ] [[package]] name = "event-listener-strategy" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 4.0.3", - "pin-project-lite 0.2.13", + "event-listener 5.3.1", + "pin-project-lite 0.2.14", ] [[package]] @@ -3044,16 +3639,17 @@ dependencies = [ [[package]] name = "expander" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e83c02035136f1592a47964ea60c05a50e4ed8b5892cfac197063850898d4d" +checksum = "e2c470c71d91ecbd179935b24170459e926382eaaa86b590b78814e180d8a8e2" dependencies = [ "blake2 0.10.6", + "file-guard", "fs-err", - "prettier-please", + "prettyplease 0.2.22", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -3074,9 +3670,9 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fastrlp" @@ -3105,8 +3701,9 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core 0.6.4", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -3124,9 +3721,19 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.7" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "file-guard" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" +checksum = "21ef72acf95ec3d7dbf61275be556299490a245f017cf084bd23b4f68cf9407c" +dependencies = [ + "libc", + "winapi", +] [[package]] name = "file-per-thread-logger" @@ -3140,14 +3747,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] @@ -3162,7 +3769,7 @@ dependencies = [ "log", "num-traits", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "scale-info", ] @@ -3186,9 +3793,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", "libz-sys", @@ -3210,6 +3817,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "fork-tree" version = "12.0.0" @@ -3264,9 +3886,9 @@ version = "32.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "Inflector", - "array-bytes 6.2.2", + "array-bytes 6.2.3", "chrono", - "clap 4.5.3", + "clap 4.5.18", "comfy-table", "frame-benchmarking", "frame-support", @@ -3311,10 +3933,10 @@ name = "frame-election-provider-solution-type" version = "13.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -3392,7 +4014,7 @@ version = "28.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "aquamarine", - "array-bytes 6.2.2", + "array-bytes 6.2.3", "bitflags 1.3.2", "docify", "environmental", @@ -3434,7 +4056,7 @@ source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7. dependencies = [ "Inflector", "cfg-expr", - "derive-syn-parse", + "derive-syn-parse 0.1.5", "expander", "frame-support-procedural-tools", "itertools 0.10.5", @@ -3443,7 +4065,7 @@ dependencies = [ "proc-macro2", "quote", "sp-crypto-hashing", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -3452,10 +4074,10 @@ version = "10.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -3465,7 +4087,7 @@ source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7. dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -3564,7 +4186,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29f9df8a11882c4e3335eb2d18a0137c505d9ca927470b0cac9c6f0ae07d28f7" dependencies = [ - "rustix 0.38.32", + "rustix 0.38.37", "windows-sys 0.48.0", ] @@ -3630,7 +4252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ "futures-core", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", ] [[package]] @@ -3641,7 +4263,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -3690,11 +4312,17 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", "pin-utils", "slab", ] +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + [[package]] name = "fxhash" version = "0.2.1" @@ -3747,13 +4375,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -3789,9 +4419,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "glob" @@ -3809,7 +4439,7 @@ dependencies = [ "futures-core", "futures-sink", "gloo-utils", - "http", + "http 0.2.12", "js-sys", "pin-project", "serde", @@ -3857,7 +4487,7 @@ dependencies = [ "futures-timer", "no-std-compat", "nonzero_ext", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "portable-atomic", "quanta", "rand", @@ -3873,7 +4503,7 @@ checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", "rand_core 0.6.4", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -3887,8 +4517,8 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.2.5", + "http 0.2.12", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", @@ -3903,9 +4533,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -4028,6 +4658,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -4129,6 +4765,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -4136,8 +4783,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", - "pin-project-lite 0.2.13", + "http 0.2.12", + "pin-project-lite 0.2.14", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "pin-project-lite 0.2.14", ] [[package]] @@ -4148,9 +4818,9 @@ checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -4166,42 +4836,97 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", - "pin-project-lite 0.2.13", - "socket2 0.5.6", + "pin-project-lite 0.2.14", + "socket2 0.5.7", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite 0.2.14", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.30", + "log", + "rustls 0.21.12", + "rustls-native-certs 0.6.3", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", "tokio", + "tokio-native-tls", "tower-service", - "tracing", - "want", ] [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "hyper-util" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" dependencies = [ + "bytes", + "futures-channel", "futures-util", - "http", - "hyper", - "log", - "rustls 0.21.10", - "rustls-native-certs 0.6.3", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite 0.2.14", + "socket2 0.5.7", "tokio", - "tokio-rustls 0.24.1", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -4230,7 +4955,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -4244,16 +4969,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -4330,6 +5055,15 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-codec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67aa010c1e3da95bf151bd8b4c059b2ed7e75387cdb969b4f8f2723a43f9941" +dependencies = [ + "parity-scale-codec", +] + [[package]] name = "impl-rlp" version = "0.3.0" @@ -4361,18 +5095,18 @@ dependencies = [ [[package]] name = "include_dir" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ "proc-macro2", "quote", @@ -4397,12 +5131,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown 0.14.5", + "serde", ] [[package]] @@ -4468,7 +5203,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.6", + "socket2 0.5.7", "widestring", "windows-sys 0.48.0", "winreg", @@ -4476,21 +5211,27 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.9.0" @@ -4511,33 +5252,42 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -4569,10 +5319,10 @@ dependencies = [ "futures-channel", "futures-util", "gloo-net", - "http", + "http 0.2.12", "jsonrpsee-core", "pin-project", - "rustls-native-certs 0.7.1", + "rustls-native-certs 0.7.3", "rustls-pki-types", "soketto", "thiserror", @@ -4581,7 +5331,7 @@ dependencies = [ "tokio-util", "tracing", "url", - "webpki-roots 0.26.3", + "webpki-roots 0.26.6", ] [[package]] @@ -4595,9 +5345,9 @@ dependencies = [ "beef", "futures-timer", "futures-util", - "hyper", + "hyper 0.14.30", "jsonrpsee-types", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", "rand", "rustc-hash", @@ -4617,7 +5367,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ccf93fc4a0bfe05d851d37d7c32b7f370fe94336b52a2f0efc5f1981895c2e5" dependencies = [ "async-trait", - "hyper", + "hyper 0.14.30", "hyper-rustls", "jsonrpsee-core", "jsonrpsee-types", @@ -4637,10 +5387,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d0bb047e79a143b32ea03974a6bf59b62c2a4c5f5d42a381c907a8bbb3f75c0" dependencies = [ "heck 0.4.1", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -4650,8 +5400,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12d8b6a9674422a8572e0b0abb12feeb3f2aeda86528c80d0350c2bd0923ab41" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.30", "jsonrpsee-core", "jsonrpsee-types", "pin-project", @@ -4697,18 +5447,33 @@ version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58b9db2dfd5bb1194b0ce921504df9ceae210a345bc2f6c5a61432089bbab070" dependencies = [ - "http", + "http 0.2.12", "jsonrpsee-client-transport", "jsonrpsee-core", "jsonrpsee-types", "url", ] +[[package]] +name = "jsonwebtoken" +version = "9.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" +dependencies = [ + "base64 0.21.7", + "js-sys", + "pem 3.0.4", + "ring 0.17.8", + "serde", + "serde_json", + "simple_asn1", +] + [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -4720,7 +5485,6 @@ dependencies = [ [[package]] name = "kate" version = "0.9.2" -source = "git+https://github.com/availproject/avail-core?tag=core-node-2#25ceee9ab6e15f88df873d03e6012a5982d3215c" dependencies = [ "avail-core", "derive_more", @@ -4748,7 +5512,6 @@ dependencies = [ [[package]] name = "kate-recovery" version = "0.10.0" -source = "git+https://github.com/availproject/avail-core?tag=core-node-2#25ceee9ab6e15f88df873d03e6012a5982d3215c" dependencies = [ "avail-core", "derive_more", @@ -4794,9 +5557,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3633291834c4fbebf8673acbc1b04ec9d151418ff9b8e26dcd79129928758" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -4824,7 +5587,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf7a85fe66f9ff9cd74e169fdd2c94c6e1e74c412c99a73b4df3200b5d3760b2" dependencies = [ "kvdb", - "parking_lot 0.12.1", + "parking_lot 0.12.3", ] [[package]] @@ -4835,7 +5598,7 @@ checksum = "b644c70b92285f66bfc2032922a79000ea30af7bc2ab31902992a5dcb9b434f6" dependencies = [ "kvdb", "num_cpus", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "regex", "rocksdb", "smallvec", @@ -4843,9 +5606,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lazycell" @@ -4855,9 +5618,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libfuzzer-sys" @@ -4872,12 +5635,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.4", + "windows-targets 0.52.6", ] [[package]] @@ -4895,7 +5658,7 @@ dependencies = [ "bytes", "futures", "futures-timer", - "getrandom 0.2.12", + "getrandom 0.2.15", "instant", "libp2p-allow-block-list", "libp2p-connection-limits", @@ -4960,7 +5723,7 @@ dependencies = [ "multihash 0.17.0", "multistream-select", "once_cell", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", "quick-protobuf", "rand", @@ -4980,7 +5743,7 @@ dependencies = [ "futures", "libp2p-core", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "smallvec", "trust-dns-resolver", ] @@ -4999,7 +5762,7 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "lru", + "lru 0.10.1", "quick-protobuf", "quick-protobuf-codec", "smallvec", @@ -5048,7 +5811,7 @@ dependencies = [ "sha2 0.10.8", "smallvec", "thiserror", - "uint", + "uint 0.9.5", "unsigned-varint", "void", ] @@ -5142,7 +5905,7 @@ dependencies = [ "libp2p-identity", "libp2p-tls", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "quinn-proto", "rand", "rustls 0.20.9", @@ -5258,7 +6021,7 @@ dependencies = [ "futures-rustls", "libp2p-core", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "quicksink", "rw-stream-sink", "soketto", @@ -5281,13 +6044,13 @@ dependencies = [ [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.4", ] [[package]] @@ -5332,7 +6095,7 @@ checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" dependencies = [ "crunchy", "digest 0.9.0", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -5355,9 +6118,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.15" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "pkg-config", @@ -5405,9 +6168,9 @@ checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lioness" @@ -5423,9 +6186,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -5433,9 +6196,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" dependencies = [ "serde", ] @@ -5449,6 +6212,15 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "lru" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "lru-cache" version = "0.1.2" @@ -5460,19 +6232,18 @@ dependencies = [ [[package]] name = "lz4" -version = "1.24.0" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +checksum = "a231296ca742e418c43660cb68e082486ff2538e8db432bc818580f3965025ed" dependencies = [ - "libc", "lz4-sys", ] [[package]] name = "lz4-sys" -version = "1.9.4" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +checksum = "fcb44a01837a858d47e5a630d2ccf304c8efcc4b83b8f9f75b7a9ee4fcc6e57d" dependencies = [ "cc", "libc", @@ -5489,50 +6260,50 @@ dependencies = [ [[package]] name = "macro_magic" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "macro_magic_core" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" dependencies = [ "const-random", - "derive-syn-parse", + "derive-syn-parse 0.2.0", "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "macro_magic_core_macros" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "macro_magic_macros" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -5564,9 +6335,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matrixmultiply" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" dependencies = [ "autocfg", "rawpointer", @@ -5574,9 +6345,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memfd" @@ -5584,7 +6355,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.32", + "rustix 0.38.37", ] [[package]] @@ -5598,9 +6369,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -5646,6 +6417,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -5654,22 +6431,23 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5688,11 +6466,11 @@ dependencies = [ "hashlink", "lioness", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", "rand_chacha 0.3.1", "rand_distr", - "subtle 2.5.0", + "subtle 2.6.1", "thiserror", "zeroize", ] @@ -5780,7 +6558,7 @@ dependencies = [ "blake3", "core2", "digest 0.10.7", - "multihash-derive 0.8.0", + "multihash-derive 0.8.1", "sha2 0.10.8", "sha3", "unsigned-varint", @@ -5794,7 +6572,7 @@ checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" dependencies = [ "core2", "digest 0.10.7", - "multihash-derive 0.8.0", + "multihash-derive 0.8.1", "sha2 0.10.8", "unsigned-varint", ] @@ -5831,16 +6609,16 @@ dependencies = [ [[package]] name = "multihash-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" +checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 1.1.3", "proc-macro-error", "proc-macro2", "quote", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -5856,16 +6634,16 @@ dependencies = [ [[package]] name = "multihash-derive-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38685e08adb338659871ecfc6ee47ba9b22dcc8abcf6975d379cc49145c3040" +checksum = "3958713ce794e12f7c6326fac9aa274c68d74c4881dd37b3e2662b8a2046bb19" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.0", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", - "synstructure", + "syn 2.0.77", + "synstructure 0.13.1", ] [[package]] @@ -5890,9 +6668,9 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.32.4" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4541eb06dce09c0241ebbaab7102f0a01a0c8994afed2e5d0d66775016e25ac2" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" dependencies = [ "approx", "matrixmultiply", @@ -5906,13 +6684,13 @@ dependencies = [ [[package]] name = "nalgebra-macros" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] @@ -5924,6 +6702,23 @@ dependencies = [ "rand", ] +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "netlink-packet-core" version = "0.4.2" @@ -5979,9 +6774,9 @@ dependencies = [ [[package]] name = "netlink-sys" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" +checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" dependencies = [ "bytes", "futures", @@ -6037,20 +6832,19 @@ checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] @@ -6082,11 +6876,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -6094,9 +6887,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -6127,10 +6920,9 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -6153,9 +6945,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -6177,9 +6969,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "opaque-debug" @@ -6194,28 +6986,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] -name = "open-fastrlp" -version = "0.1.4" +name = "openssl" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] -name = "open-fastrlp-derive" +name = "openssl-macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "bytes", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] @@ -6224,6 +7017,18 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -6236,6 +7041,15 @@ version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + [[package]] name = "pallet-authority-discovery" version = "28.0.0" @@ -6657,10 +7471,10 @@ name = "pallet-staking-reward-curve" version = "11.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -6826,7 +7640,7 @@ dependencies = [ "ark-std 0.4.0", "avail-base", "avail-core", - "common 0.5.5", + "common 0.6.0", "consensus-core", "ethabi", "frame-benchmarking", @@ -6838,7 +7652,7 @@ dependencies = [ "pallet-timestamp", "parity-scale-codec", "patricia-merkle-trie", - "primitive-types", + "primitive-types 0.12.2", "rlp", "scale-info", "serde", @@ -6849,6 +7663,7 @@ dependencies = [ "sp-runtime", "sp-std", "ssz_rs", + "tree_hash", "trie-db 0.24.0", ] @@ -6866,7 +7681,7 @@ dependencies = [ "log", "lz4", "memmap2 0.5.10", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", "siphasher", "snap", @@ -6875,9 +7690,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec", "bitvec", @@ -6890,11 +7705,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.9" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ - "proc-macro-crate 2.0.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 1.0.109", @@ -6927,7 +7742,7 @@ checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ "proc-macro2", "syn 1.0.109", - "synstructure", + "synstructure 0.12.6", ] [[package]] @@ -6938,9 +7753,9 @@ checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -6955,12 +7770,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.9", + "parking_lot_core 0.9.10", ] [[package]] @@ -6979,15 +7794,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.4", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -6998,9 +7813,9 @@ checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156" [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "patricia-merkle-trie" @@ -7012,9 +7827,9 @@ dependencies = [ "hex-literal 0.3.4", "memory-db 0.30.0", "parity-scale-codec", - "primitive-types", + "primitive-types 0.12.2", "rlp", - "rlp-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rlp-derive", "sp-io", "tiny-keccak", "trie-db 0.24.0", @@ -7044,6 +7859,16 @@ dependencies = [ "base64 0.13.1", ] +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -7052,9 +7877,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.8" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", "thiserror", @@ -7063,9 +7888,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.8" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026" +checksum = "4d3a6e3394ec80feb3b6393c725571754c6188490265c61aaf260810d6b95aa0" dependencies = [ "pest", "pest_generator", @@ -7073,22 +7898,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.8" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80" +checksum = "94429506bde1ca69d1b5601962c73f4172ab4726571a59ea95931218cb0e930e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "pest_meta" -version = "2.7.8" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293" +checksum = "ac8a071862e93690b6e34e9a5fb8e33ff3734473ac0245b27232222c4906a33f" dependencies = [ "once_cell", "pest", @@ -7097,12 +7922,12 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.2.5", + "indexmap 2.5.0", ] [[package]] @@ -7122,7 +7947,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -7133,9 +7958,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -7161,22 +7986,23 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "polling" -version = "3.5.0" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ "cfg-if", "concurrent-queue", - "pin-project-lite 0.2.13", - "rustix 0.38.32", + "hermit-abi 0.4.0", + "pin-project-lite 0.2.14", + "rustix 0.38.37", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "poly-multiproof" version = "0.0.1" -source = "git+https://github.com/availproject/poly-multiproof?tag=v0.0.1#cd8d31b7eb568dea2fddfc9237e2e31ea7ae7ed3" +source = "git+https://github.com/availproject/poly-multiproof?rev=e17285c264d7acd6faea0da5950677e8beebe14e#e17285c264d7acd6faea0da5950677e8beebe14e" dependencies = [ "ark-bls12-381", "ark-ec 0.4.2", @@ -7186,6 +8012,7 @@ dependencies = [ "ark-std 0.4.0", "blst", "merlin", + "thiserror", ] [[package]] @@ -7213,9 +8040,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "d30538d42559de6b034bc76fd6dd4c38961b1ee5c6c56e3808c50128fdbc22ce" [[package]] name = "powerfmt" @@ -7225,9 +8052,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "predicates" @@ -7245,35 +8075,25 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" +checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" [[package]] name = "predicates-tree" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" dependencies = [ "predicates-core", "termtree", ] -[[package]] -name = "prettier-please" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" -dependencies = [ - "proc-macro2", - "syn 2.0.53", -] - [[package]] name = "prettyplease" -version = "0.1.11" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28f53e8b192565862cf99343194579a022eb9c7dd3a8d03134734803c7b3125" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ "proc-macro2", "syn 1.0.109", @@ -7281,12 +8101,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -7296,21 +8116,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", - "impl-codec", + "impl-codec 0.6.0", "impl-rlp", "impl-serde", "scale-info", - "uint", + "uint 0.9.5", +] + +[[package]] +name = "primitive-types" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15600a7d856470b7d278b3fe0e311fe28c2526348549f8ef2ff7db3299c87f5" +dependencies = [ + "fixed-hash", + "impl-codec 0.7.0", + "uint 0.10.0", ] [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "thiserror", + "toml 0.5.11", ] [[package]] @@ -7324,11 +8155,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit 0.22.21", ] [[package]] @@ -7363,7 +8194,7 @@ checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -7377,15 +8208,15 @@ dependencies = [ [[package]] name = "prometheus" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +checksum = "3d33c28a30771f7f96db69893f78b857f7450d7e0237e9c8fc6427a81bae7ed1" dependencies = [ "cfg-if", "fnv", "lazy_static", "memchr", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "thiserror", ] @@ -7397,7 +8228,7 @@ checksum = "5d6fa99d535dd930d1249e6c79cb3c2915f9172a540fe2b02a4c8f9ca954721e" dependencies = [ "dtoa", "itoa", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "prometheus-client-derive-encode", ] @@ -7409,7 +8240,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -7420,13 +8251,13 @@ checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.5.0", + "bitflags 2.6.0", "lazy_static", "num-traits", "rand", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", "rusty-fork", "tempfile", "unarray", @@ -7444,12 +8275,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.12.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.12.3", + "prost-derive 0.12.6", ] [[package]] @@ -7465,7 +8296,7 @@ dependencies = [ "log", "multimap", "petgraph", - "prettyplease 0.1.11", + "prettyplease 0.1.25", "prost 0.11.9", "prost-types", "regex", @@ -7489,15 +8320,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.3" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -7511,9 +8342,9 @@ dependencies = [ [[package]] name = "psm" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +checksum = "aa37f80ca58604976033fae9515a8a2989fc13797d953f7c04fb8fa36a11f205" dependencies = [ "cc", ] @@ -7592,9 +8423,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -7651,7 +8482,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", ] [[package]] @@ -7688,7 +8519,7 @@ version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -7699,9 +8530,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -7723,7 +8554,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ - "pem", + "pem 1.1.1", "ring 0.16.20", "time", "yasna", @@ -7740,42 +8571,42 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "libredox", "thiserror", ] [[package]] name = "ref-cast" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -7792,14 +8623,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.6", - "regex-syntax 0.8.2", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -7813,20 +8644,20 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.4", ] [[package]] name = "regex-lite" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" @@ -7836,9 +8667,48 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite 0.2.14", + "rustls-pemfile 2.1.3", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] [[package]] name = "resolv-conf" @@ -7857,24 +8727,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ "hmac 0.12.1", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] name = "ring" version = "0.1.0" -source = "git+https://github.com/w3f/ring-proof#665f5f51af5734c7b6d90b985dd6861d4c5b4752" +source = "git+https://github.com/w3f/ring-proof#1472ce9cd87cee49c56ce7869a0aba872d837c51" dependencies = [ "ark-ec 0.4.2", "ark-ff 0.4.2", "ark-poly 0.4.2", "ark-serialize 0.4.2", "ark-std 0.4.0", + "ark-transcript 0.0.2 (git+https://github.com/w3f/ring-vrf)", "arrayvec", "blake2 0.10.6", "common 0.1.0", "fflonk", - "merlin", ] [[package]] @@ -7900,7 +8770,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.12", + "getrandom 0.2.15", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -7922,7 +8792,6 @@ version = "0.5.2" source = "git+https://github.com/paritytech/parity-common.git?tag=rlp-v0.5.2#86676b08e89cb99fdff0c882453ad0746dd070cf" dependencies = [ "bytes", - "rlp-derive 0.1.0 (git+https://github.com/paritytech/parity-common.git?tag=rlp-v0.5.2)", "rustc-hex", ] @@ -7937,16 +8806,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "git+https://github.com/paritytech/parity-common.git?tag=rlp-v0.5.2#86676b08e89cb99fdff0c882453ad0746dd070cf" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "rocksdb" version = "0.21.0" @@ -8009,11 +8868,12 @@ dependencies = [ "ark-ff 0.3.0", "ark-ff 0.4.2", "bytes", + "ethereum_ssz 0.5.4", "fastrlp", "num-bigint", "num-traits", "parity-scale-codec", - "primitive-types", + "primitive-types 0.12.2", "proptest", "rand", "rlp", @@ -8031,9 +8891,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -8058,11 +8918,11 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.22", + "semver 1.0.23", ] [[package]] @@ -8090,14 +8950,14 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] @@ -8115,9 +8975,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.8", @@ -8134,8 +8994,8 @@ dependencies = [ "log", "ring 0.17.8", "rustls-pki-types", - "rustls-webpki 0.102.6", - "subtle 2.5.0", + "rustls-webpki 0.102.8", + "subtle 2.6.1", "zeroize", ] @@ -8153,9 +9013,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", "rustls-pemfile 2.1.3", @@ -8201,9 +9061,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring 0.17.8", "rustls-pki-types", @@ -8212,9 +9072,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rusty-fork" @@ -8241,15 +9101,15 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "safe_arch" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" dependencies = [ "bytemuck", ] @@ -8288,7 +9148,7 @@ dependencies = [ "multihash 0.18.1", "multihash-codetable", "parity-scale-codec", - "prost 0.12.3", + "prost 0.12.6", "prost-build", "rand", "sc-client-api", @@ -8313,7 +9173,7 @@ dependencies = [ "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-client-api", "sc-proposer-metrics", @@ -8349,10 +9209,10 @@ name = "sc-chain-spec" version = "27.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "docify", "log", - "memmap2 0.9.4", + "memmap2 0.9.5", "parity-scale-codec", "sc-chain-spec-derive", "sc-client-api", @@ -8375,10 +9235,10 @@ name = "sc-chain-spec-derive" version = "11.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -8386,10 +9246,10 @@ name = "sc-cli" version = "0.36.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "bip39", "chrono", - "clap 4.5.3", + "clap 4.5.18", "fdlimit", "futures", "itertools 0.10.5", @@ -8431,7 +9291,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-executor", "sc-transaction-pool-api", "sc-utils", @@ -8462,7 +9322,7 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-state-db", "schnellru", @@ -8486,7 +9346,7 @@ dependencies = [ "libp2p-identity", "log", "mockall", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-telemetry", "sc-utils", @@ -8514,7 +9374,7 @@ dependencies = [ "num-rational", "num-traits", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-consensus", "sc-consensus-epochs", @@ -8578,7 +9438,7 @@ version = "0.19.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "ahash 0.8.11", - "array-bytes 6.2.2", + "array-bytes 6.2.3", "async-trait", "dyn-clone", "finality-grandpa", @@ -8587,7 +9447,7 @@ dependencies = [ "futures-timer", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", "sc-block-builder", "sc-chain-spec", @@ -8664,7 +9524,7 @@ version = "0.32.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-executor-common", "sc-executor-wasmtime", "schnellru", @@ -8701,7 +9561,7 @@ dependencies = [ "cfg-if", "libc", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rustix 0.36.17", "sc-allocator", "sc-executor-common", @@ -8732,8 +9592,8 @@ name = "sc-keystore" version = "25.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", - "parking_lot 0.12.1", + "array-bytes 6.2.3", + "parking_lot 0.12.3", "serde_json", "sp-application-crypto", "sp-core", @@ -8757,7 +9617,7 @@ dependencies = [ "mixnet", "multiaddr", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-network", "sc-transaction-pool-api", @@ -8775,7 +9635,7 @@ name = "sc-network" version = "0.34.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "async-channel", "async-trait", "asynchronous-codec", @@ -8790,7 +9650,7 @@ dependencies = [ "log", "mockall", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "partial_sort", "pin-project", "rand", @@ -8823,7 +9683,7 @@ dependencies = [ "futures", "libp2p-identity", "log", - "prost 0.12.3", + "prost 0.12.6", "prost-build", "sc-client-api", "sc-network", @@ -8874,13 +9734,13 @@ name = "sc-network-light" version = "0.33.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "async-channel", "futures", "libp2p-identity", "log", "parity-scale-codec", - "prost 0.12.3", + "prost 0.12.6", "prost-build", "sc-client-api", "sc-network", @@ -8895,7 +9755,7 @@ name = "sc-network-sync" version = "0.33.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "async-channel", "async-trait", "fork-tree", @@ -8905,7 +9765,7 @@ dependencies = [ "log", "mockall", "parity-scale-codec", - "prost 0.12.3", + "prost 0.12.6", "prost-build", "sc-client-api", "sc-consensus", @@ -8932,7 +9792,7 @@ name = "sc-network-transactions" version = "0.33.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "futures", "libp2p", "log", @@ -8951,19 +9811,19 @@ name = "sc-offchain" version = "29.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "bytes", "fnv", "futures", "futures-timer", - "hyper", + "hyper 0.14.30", "hyper-rustls", "libp2p", "log", "num_cpus", "once_cell", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", "sc-client-api", "sc-network", @@ -8998,7 +9858,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-block-builder", "sc-chain-spec", "sc-client-api", @@ -9048,8 +9908,8 @@ source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7. dependencies = [ "futures", "governor", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.30", "jsonrpsee", "log", "pin-project", @@ -9065,14 +9925,14 @@ name = "sc-rpc-spec-v2" version = "0.34.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "futures", "futures-util", "hex", "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-chain-spec", "sc-client-api", "sc-rpc", @@ -9103,7 +9963,7 @@ dependencies = [ "jsonrpsee", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", "rand", "sc-chain-spec", @@ -9160,7 +10020,7 @@ source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7. dependencies = [ "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sp-core", ] @@ -9169,7 +10029,7 @@ name = "sc-storage-monitor" version = "0.16.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "clap 4.5.3", + "clap 4.5.18", "fs4", "log", "sp-core", @@ -9226,7 +10086,7 @@ dependencies = [ "futures", "libp2p", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-project", "rand", "sc-utils", @@ -9249,7 +10109,7 @@ dependencies = [ "libc", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "regex", "rustc-hash", "sc-client-api", @@ -9272,10 +10132,10 @@ name = "sc-tracing-proc-macro" version = "11.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -9289,7 +10149,7 @@ dependencies = [ "linked-hash-map", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sc-client-api", "sc-transaction-pool-api", "sc-utils", @@ -9331,7 +10191,7 @@ dependencies = [ "futures-timer", "lazy_static", "log", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "prometheus", "sp-arithmetic", ] @@ -9356,7 +10216,7 @@ version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" dependencies = [ - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", "syn 1.0.109", @@ -9364,18 +10224,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "schnellru" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" dependencies = [ "ahash 0.8.11", "cfg-if", @@ -9397,7 +10257,7 @@ dependencies = [ "rand_core 0.6.4", "serde_bytes", "sha2 0.10.8", - "subtle 2.5.0", + "subtle 2.6.1", "zeroize", ] @@ -9433,7 +10293,7 @@ dependencies = [ "der", "generic-array 0.14.7", "pkcs8", - "subtle 2.5.0", + "subtle 2.6.1", "zeroize", ] @@ -9466,11 +10326,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -9479,9 +10339,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -9507,9 +10367,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] @@ -9537,18 +10397,18 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] @@ -9565,33 +10425,76 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.5.0", "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -9654,9 +10557,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.1" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b57fd861253bff08bb1919e995f90ba8f4889de2726091c8876f3a4e823b40" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ "cc", "cfg-if", @@ -9679,9 +10582,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -9714,6 +10617,18 @@ name = "simple-mermaid" version = "0.1.0" source = "git+https://github.com/kianenigma/simple-mermaid.git?rev=e48b187bcfd5cc75111acd9d241f1bd36604344b#e48b187bcfd5cc75111acd9d241f1bd36604344b" +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -9759,33 +10674,9 @@ dependencies = [ "curve25519-dalek 4.1.3", "rand_core 0.6.4", "ring 0.17.8", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "sha2 0.10.8", - "subtle 2.5.0", -] - -[[package]] -name = "snowbridge-amcl" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" -dependencies = [ - "parity-scale-codec", - "scale-info", -] - -[[package]] -name = "snowbridge-milagro-bls" -version = "1.5.2" -source = "git+https://github.com/Snowfork/milagro_bls?rev=6a95c9e33c6a41d9137761e593d53742ebb964de#6a95c9e33c6a41d9137761e593d53742ebb964de" -dependencies = [ - "hex", - "lazy_static", - "parity-scale-codec", - "rand", - "scale-info", - "snowbridge-amcl", - "zeroize", + "subtle 2.6.1", ] [[package]] @@ -9800,9 +10691,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -9818,7 +10709,7 @@ dependencies = [ "bytes", "flate2", "futures", - "http", + "http 0.2.12", "httparse", "log", "rand", @@ -9854,10 +10745,10 @@ dependencies = [ "Inflector", "blake2 0.10.6", "expander", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -9937,7 +10828,7 @@ dependencies = [ "futures", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "schnellru", "sp-api", "sp-consensus", @@ -10033,7 +10924,7 @@ name = "sp-core" version = "28.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "array-bytes 6.2.2", + "array-bytes 6.2.3", "bandersnatch_vrfs", "bip39", "bitflags 1.3.2", @@ -10051,9 +10942,9 @@ dependencies = [ "log", "merlin", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "paste", - "primitive-types", + "primitive-types 0.12.2", "rand", "scale-info", "schnorrkel", @@ -10115,7 +11006,7 @@ source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7. dependencies = [ "quote", "sp-crypto-hashing", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -10124,7 +11015,7 @@ version = "10.0.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "kvdb", - "parking_lot 0.12.1", + "parking_lot 0.12.3", ] [[package]] @@ -10134,7 +11025,7 @@ source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7. dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -10214,7 +11105,7 @@ version = "0.34.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "sp-core", "sp-externalities", "thiserror", @@ -10346,7 +11237,7 @@ dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", - "primitive-types", + "primitive-types 0.12.2", "sp-externalities", "sp-runtime-interface-proc-macro", "sp-std", @@ -10363,10 +11254,10 @@ source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7. dependencies = [ "Inflector", "expander", - "proc-macro-crate 3.1.0", + "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -10406,7 +11297,7 @@ dependencies = [ "hash-db 0.16.0", "log", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", "smallvec", "sp-core", @@ -10522,7 +11413,7 @@ dependencies = [ "memory-db 0.32.0", "nohash-hasher", "parity-scale-codec", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", "scale-info", "schnellru", @@ -10560,7 +11451,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -10635,9 +11526,9 @@ dependencies = [ [[package]] name = "ss58-registry" -version = "1.47.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4743ce898933fbff7bbf414f497c459a782d496269644b3d650a398ae6a487ba" +checksum = "43fce22ed1df64d04b262351c8f9d5c6da4f76f79f25ad15529792f893fad25d" dependencies = [ "Inflector", "num-format", @@ -10655,9 +11546,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "057291e5631f280978fa9c8009390663ca4613359fc1318e36a8c24c392f6d1f" dependencies = [ "bitvec", - "hex", "num-bigint", - "serde", "sha2 0.9.9", "ssz_rs_derive", ] @@ -10673,6 +11562,23 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ssz_types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e202ef3c07d9abc7b110a81206064e462758074242e8d176e3cb07415f01a3ad" +dependencies = [ + "derivative", + "ethereum_serde_utils", + "ethereum_ssz 0.6.0", + "itertools 0.13.0", + "serde", + "serde_derive", + "smallvec", + "tree_hash", + "typenum", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -10722,7 +11628,7 @@ dependencies = [ "bitflags 1.3.2", "byteorder", "keccak", - "subtle 2.5.0", + "subtle 2.6.1", "zeroize", ] @@ -10747,12 +11653,6 @@ dependencies = [ "strum_macros 0.24.3", ] -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" - [[package]] name = "strum" version = "0.26.3" @@ -10775,19 +11675,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.53", -] - [[package]] name = "strum_macros" version = "0.26.4" @@ -10798,7 +11685,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -10843,7 +11730,7 @@ name = "substrate-prometheus-endpoint" version = "0.17.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "hyper", + "hyper 0.14.30", "log", "prometheus", "thiserror", @@ -10893,7 +11780,7 @@ dependencies = [ "sp-maybe-compressed-blob", "strum 0.24.1", "tempfile", - "toml 0.8.12", + "toml 0.8.19", "walkdir", "wasm-opt", ] @@ -10906,9 +11793,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "superstruct" @@ -10916,7 +11803,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f4e1f478a7728f8855d7e620e9a152cf8932c6614f86564c886f9b8141f3201" dependencies = [ - "darling", + "darling 0.13.4", "itertools 0.10.5", "proc-macro2", "quote", @@ -10937,15 +11824,36 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.12.6" @@ -10958,6 +11866,17 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -10987,20 +11906,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.12.14" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", - "rustix 0.38.32", - "windows-sys 0.52.0", + "once_cell", + "rustix 0.38.37", + "windows-sys 0.59.0", ] [[package]] @@ -11018,7 +11938,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.32", + "rustix 0.38.37", "windows-sys 0.48.0", ] @@ -11060,22 +11980,22 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -11135,9 +12055,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -11156,9 +12076,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -11185,9 +12105,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -11200,32 +12120,41 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite 0.2.13", + "parking_lot 0.12.3", + "pin-project-lite 0.2.14", "signal-hook-registry", - "socket2 0.5.6", + "socket2 0.5.7", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", ] [[package]] @@ -11245,7 +12174,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.10", + "rustls 0.21.12", "tokio", ] @@ -11262,27 +12191,27 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", "tokio", "tokio-util", ] [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", "tokio", ] @@ -11297,69 +12226,47 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.12" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.9", + "toml_edit 0.22.21", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.2.5", - "toml_datetime", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.2.5", - "toml_datetime", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap 2.2.5", + "indexmap 2.5.0", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.9" +version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.5", + "winnow 0.6.18", ] [[package]] @@ -11371,7 +12278,8 @@ dependencies = [ "futures-core", "futures-util", "pin-project", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", + "tokio", "tower-layer", "tower-service", "tracing", @@ -11383,29 +12291,29 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "bytes", "futures-core", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "http-range-header", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", "tower-layer", "tower-service", ] [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -11414,7 +12322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.14", "tracing-attributes", "tracing-core", ] @@ -11427,7 +12335,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -11494,6 +12402,29 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tree_hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f113108f55d589941862727b5a74f75276a54c157060983611d99f7f7fa6368" +dependencies = [ + "alloy-primitives", + "ethereum_hashing", + "smallvec", +] + +[[package]] +name = "tree_hash_derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b623b16740c2ff75b04a705e726f436abab04eecb60a27b39eea55ec5e81e543" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "trie-db" version = "0.24.0" @@ -11566,7 +12497,7 @@ dependencies = [ "ipconfig", "lazy_static", "lru-cache", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "resolv-conf", "smallvec", "thiserror", @@ -11587,7 +12518,7 @@ version = "0.38.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "async-trait", - "clap 4.5.3", + "clap 4.5.18", "frame-remote-externalities", "frame-try-runtime", "hex", @@ -11658,6 +12589,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "uint" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + [[package]] name = "unarray" version = "0.1.4" @@ -11672,9 +12615,9 @@ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -11687,15 +12630,15 @@ dependencies = [ [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" @@ -11704,7 +12647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", - "subtle 2.5.0", + "subtle 2.6.1", ] [[package]] @@ -11733,9 +12676,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna 0.5.0", @@ -11744,9 +12687,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" @@ -11762,9 +12705,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "void" @@ -11774,9 +12717,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "w3f-bls" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7335e4c132c28cc43caef6adb339789e599e39adbe78da0c4d547fad48cbc331" +checksum = "9c5da5fa2c6afa2c9158eaa7cd9aee249765eb32b5fb0c63ad8b9e79336a47ec" dependencies = [ "ark-bls12-377", "ark-bls12-381", @@ -11838,34 +12781,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -11875,9 +12819,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -11885,22 +12829,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-instrument" @@ -11913,9 +12857,9 @@ dependencies = [ [[package]] name = "wasm-opt" -version = "0.116.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc942673e7684671f0c5708fc18993569d184265fd5223bb51fc8e5b9b6cfd52" +checksum = "2fd87a4c135535ffed86123b6fb0f0a5a0bc89e50416c942c5f0662c645f679c" dependencies = [ "anyhow", "libc", @@ -12173,9 +13117,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -12202,9 +13146,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.3" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] @@ -12218,14 +13162,14 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.32", + "rustix 0.38.37", ] [[package]] name = "wide" -version = "0.7.15" +version = "0.7.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89beec544f246e679fc25490e3f8e08003bc4bf612068f325120dad4cea02c1c" +checksum = "b828f995bf1e9622031f8009f8481a85406ce1f4d4588ff746d872043e855690" dependencies = [ "bytemuck", "safe_arch", @@ -12233,9 +13177,9 @@ dependencies = [ [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -12255,11 +13199,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -12274,7 +13218,7 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ - "windows-core", + "windows-core 0.51.1", "windows-targets 0.48.5", ] @@ -12287,6 +13231,45 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -12311,7 +13294,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -12346,17 +13338,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -12373,9 +13366,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -12391,9 +13384,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -12409,9 +13402,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -12427,9 +13426,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -12445,9 +13444,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -12463,9 +13462,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -12481,9 +13480,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -12496,9 +13495,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.5" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -12578,7 +13577,7 @@ dependencies = [ "futures", "log", "nohash-hasher", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "rand", "static_assertions", ] @@ -12600,7 +13599,7 @@ checksum = "0f22d6a02cbc84ea1993b0b341833a55a0866a3378c3a76e0ca664bc2574e370" dependencies = [ "futures", "js-sys", - "parking_lot 0.12.1", + "parking_lot 0.12.3", "pin-utils", "wasm-bindgen", "wasm-bindgen-futures", @@ -12609,29 +13608,30 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -12644,7 +13644,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.53", + "syn 2.0.77", ] [[package]] @@ -12687,9 +13687,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 5e1a842eb..cf8abb10a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,18 +22,12 @@ homepage = "https://www.availproject.org/" [workspace.dependencies] -avail-core = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false, features = [ "runtime"] } -kate = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } -kate-recovery = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } - -ssz-rs = { package = "ssz_rs", version = "0.9.0" } -alloy-primitives = { version = "0.7.7", features = ["serde"] } -helios-common = { git = "https://github.com/a16z/helios.git", package = "common" } -helios-consensus-core = { git = "https://github.com/a16z/helios.git", package = "consensus-core" } -serde_cbor = "0.11.2" -# avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } -# kate = { path = "../avail-core/kate/", default-features = false } -# kate-recovery = { path = "../avail-core/kate/recovery/", default-features = false} +# avail-core = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false, features = [ "runtime"] } +# kate = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } +# kate-recovery = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } +avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } +kate = { path = "../avail-core/kate/", default-features = false } +kate-recovery = { path = "../avail-core/kate/recovery/", default-features = false} avail-base = { path = "base", default-features = false } da-control = { path = "pallets/dactr", default-features = false } @@ -49,6 +43,13 @@ frame-system = { path = "pallets/system", default-features = false } frame-system-rpc-runtime-api = { path = "pallets/system/rpc/runtime-api", default-features = false } frame-system-benchmarking = { path = "pallets/system/benchmarking", default-features = false } +# helios deps +ssz-rs = { package = "ssz_rs", version = "0.9.0", default-features = false } +alloy-primitives = { version = "0.7.7", features = ["serde"], default-features = false } +helios-common = { git = "https://github.com/a16z/helios.git", package = "common", rev = "a8c61f0cbb85e61329610463f11a09e2b835e2c5", default-features = false } +helios-consensus-core = { git = "https://github.com/a16z/helios.git", package = "consensus-core", rev = "a8c61f0cbb85e61329610463f11a09e2b835e2c5", default-features = false } +serde_cbor = { version = "0.11.2", default-features = false } +tree_hash = { version = "0.7.0", default-features = false } # benchmarking criterion = { version = "0.4", default-features = false } @@ -252,6 +253,9 @@ sp-crypto-ec-utils = { git = "https://github.com/availproject/polkadot-sdk.git", [patch.crates-io] # Other stuff +# TODO: Move this to avail +blst = { git = "https://github.com/ToufeeqP/blst", rev = "afdb0a4b7d98d4ff22c3a1d35faca223cde0ef3a" } +ethereum_hashing = { git = "https://github.com/ncitron/ethereum_hashing", rev = "7ee70944ed4fabe301551da8c447e4f4ae5e6c35" } uint = { git = "https://github.com/paritytech/parity-common.git", tag = "uint-v0.9.5" } rlp = { git = "https://github.com/paritytech/parity-common.git", tag = "rlp-v0.5.2" } diff --git a/pallets/vector/Cargo.toml b/pallets/vector/Cargo.toml index 9e1be8f75..3e4318c73 100644 --- a/pallets/vector/Cargo.toml +++ b/pallets/vector/Cargo.toml @@ -37,7 +37,9 @@ helios-common.workspace = true helios-consensus-core.workspace = true alloy-primitives.workspace = true ssz-rs.workspace = true -serde_cbor.workspace = true +serde_cbor = { workspace = true, default-features = true } +tree_hash.workspace = true + [dev-dependencies] pallet-balances = { workspace = true, default-features = false, features = ["std"] } pallet-timestamp = { workspace = true, default-features = false } diff --git a/pallets/vector/src/lib.rs b/pallets/vector/src/lib.rs index 3bedacb36..283d7b4ce 100644 --- a/pallets/vector/src/lib.rs +++ b/pallets/vector/src/lib.rs @@ -2,12 +2,18 @@ #![recursion_limit = "512"] use crate::{storage_utils::MessageStatusEnum, verifier::Verifier}; +use alloy_primitives::B256; use avail_base::{MemoryTemporaryStorage, ProvidePostInherent}; use avail_core::data_proof::{tx_uid, AddressedMessage, Message, MessageType}; -use helios_common::config::types::Forks; -use helios_consensus_core::{apply_finality_update, apply_update, verify_finality_update, verify_update, types::{Bytes32, ByteVector, LightClientStore, Update, FinalityUpdate}}; -use alloy_primitives::B256; +use helios_consensus_core::types::Forks; +use helios_consensus_core::{ + apply_finality_update, apply_update, + types::{FinalityUpdate, LightClientStore, Update}, + verify_finality_update, verify_update, +}; +use scale_info::prelude::string::String; use ssz_rs::prelude::*; +use tree_hash::TreeHash; use codec::Compact; use frame_support::{ @@ -41,6 +47,7 @@ pub type FunctionInput = BoundedVec>; pub type FunctionOutput = BoundedVec>; pub type FunctionProof = BoundedVec>; pub type ValidProof = BoundedVec>, ConstU32<32>>; +pub type Bytes32 = [u8; 32]; // Avail asset is supported for now pub const SUPPORTED_ASSET_ID: H256 = H256::zero(); @@ -54,7 +61,6 @@ pub type BalanceOf = #[frame_support::pallet] pub mod pallet { - use helios_consensus_core::get_bits; use ethabi::Token; use ethabi::Token::Uint; use frame_support::dispatch::GetDispatchInfo; @@ -417,7 +423,7 @@ pub mod pallet { pub finality_update: FinalityUpdate, pub expected_current_slot: u64, pub store: LightClientStore, - pub genesis_root: Bytes32, + pub genesis_root: B256, pub forks: Forks, pub execution_state_proof: ExecutionStateProof, } @@ -467,12 +473,12 @@ pub mod pallet { for (index, update) in updates.iter().enumerate() { is_valid = is_valid && verify_update( - update, - expected_current_slot, - &store, - genesis_root.clone(), - &forks, - ) + update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) .is_ok(); apply_update(&mut store, update); @@ -481,12 +487,12 @@ pub mod pallet { // 2. Apply finality update is_valid = is_valid && verify_finality_update( - &finality_update, - expected_current_slot, - &store, - genesis_root.clone(), - &forks, - ) + &finality_update, + expected_current_slot, + &store, + genesis_root.clone(), + &forks, + ) .is_ok(); apply_finality_update(&mut store, &finality_update); @@ -499,18 +505,19 @@ pub mod pallet { is_valid = is_valid && is_valid_merkle_branch( - &Node::try_from(execution_state_proof.execution_state_root.as_ref()).unwrap(), - execution_state_branch_nodes.iter(), - MERKLE_BRANCH_DEPTH, - MERKLE_BRANCH_INDEX, - &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), - ); + &Node::try_from(execution_state_proof.execution_state_root.as_ref()).unwrap(), + execution_state_branch_nodes.iter(), + MERKLE_BRANCH_DEPTH, + MERKLE_BRANCH_INDEX, + &Node::try_from(store.finalized_header.body_root.as_ref()).unwrap(), + ); - let finalized_header_root: [u8; 32] = store - .finalized_header - .hash_tree_root() - .unwrap().as_ref().try_into().unwrap(); - let execution_state_root: [u8; 32] = execution_state_proof.execution_state_root.as_slice().try_into().unwrap(); + let finalized_header_root = store.finalized_header.tree_hash_root(); + let execution_state_root: [u8; 32] = execution_state_proof + .execution_state_root + .as_slice() + .try_into() + .unwrap(); let head = store.finalized_header.slot; let sender: [u8; 32] = ensure_signed(origin)?.into(); @@ -523,16 +530,23 @@ pub mod pallet { let mut function_called = false; // 4. Store step if needed + let byte_array: [u8; 32] = finalized_header_root + .as_slice() + .try_into() + .expect("Slice has incorrect length"); if prev_head != head { let verified_output = VerifiedStepOutput { - finalized_header_root: H256::from(finalized_header_root), + finalized_header_root: H256::from(byte_array), execution_state_root: H256::from(execution_state_root), - finalized_slot: store.finalized_header.slot.as_u64(), + finalized_slot: store.finalized_header.slot, participation: store.current_max_active_participants.try_into().unwrap(), }; let head = Head::::get(); - ensure!(verified_output.finalized_slot > head, Error::::SlotBehindHead); + ensure!( + verified_output.finalized_slot > head, + Error::::SlotBehindHead + ); if Self::set_slot_roots(verified_output)? { Self::deposit_event(Event::HeadUpdated { @@ -546,18 +560,13 @@ pub mod pallet { // 5. Store rotate if needed // a) Store current sync committee if stored one is empty (i.e. first time or after a range of updates) - let period = head.as_u64() + let period = head .checked_div(config.slots_per_period) .ok_or(Error::::ConfigurationNotSet)?; let stored_current_sync_committee = SyncCommitteeHashes::::get(period); if stored_current_sync_committee.is_zero() { - let current_sync_committee_hash: U256 = store - .current_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() - .try_into() - .unwrap(); + let current_sync_committee_hash: U256 = + U256::from(store.current_sync_committee.tree_hash_root().as_slice()); Self::deposit_event(Event::SyncCommitteeUpdated { period, root: current_sync_committee_hash, @@ -572,9 +581,8 @@ pub mod pallet { let next_period = period + 1; let stored_next_sync_committee_hash = SyncCommitteeHashes::::get(next_period); let next_sync_committee_hash: [u8; 32] = next_sync_committee - .hash_tree_root() - .unwrap() - .as_ref() + .tree_hash_root() + .as_slice() .try_into() .unwrap(); let next_sync_committee_hash = U256::from(next_sync_committee_hash); diff --git a/pallets/vector/src/tests_new.rs b/pallets/vector/src/tests_new.rs index d0b2a3f90..87a419b02 100644 --- a/pallets/vector/src/tests_new.rs +++ b/pallets/vector/src/tests_new.rs @@ -1,13 +1,19 @@ /// Tests for Vector that use CBOR encoded Ethereum light client inputs instead of ZKProofs. /// Adapted from corresponding tests in src/tests.rs. -use std::fs; +use crate::mock::{ + new_test_ext, Bridge, RuntimeEvent, RuntimeOrigin, System, Test, ROTATE_FUNCTION_ID, + STEP_FUNCTION_ID, +}; +use crate::state::Configuration; +use crate::{ + ConfigurationStorage, Error, Event, ExecutionStateRoots, FunctionInputs, Head, Headers, + SyncCommitteeHashes, Updater, +}; use frame_support::{assert_err, assert_ok}; use hex_literal::hex; use primitive_types::{H256, U256}; use sp_core::crypto::AccountId32; -use crate::mock::{new_test_ext, Bridge,RuntimeEvent, RuntimeOrigin, System, Test, ROTATE_FUNCTION_ID, STEP_FUNCTION_ID}; -use crate::{ConfigurationStorage,Error, Event, ExecutionStateRoots, FunctionInputs, Head, Headers, SyncCommitteeHashes, Updater}; -use crate::state::Configuration; +use std::fs; const TEST_SENDER_VEC: [u8; 32] = hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"); const TEST_SENDER_ACCOUNT: AccountId32 = AccountId32::new(TEST_SENDER_VEC); @@ -60,7 +66,7 @@ fn test_fulfill_step_call() { assert_eq!( ex_state_root, H256(hex!( - "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" + "6518be340ee1bad6c6c6bef6ea3e99ecebc142e196b7edd56b3a5e513d0c6392" )) ); assert_eq!(head, finalized_slot); @@ -116,7 +122,7 @@ fn test_fulfill_rotate_call() { let expected_hash = U256::from_dec_str( "78004113044439342907882478475913997887515213797155324584820998418219758944903", ) - .unwrap(); + .unwrap(); let current_period = 1178; let expected_event = RuntimeEvent::Bridge(Event::SyncCommitteeUpdated { @@ -129,4 +135,4 @@ fn test_fulfill_rotate_call() { assert_eq!(expected_event, System::events()[1].event); assert_eq!(poseidon, expected_hash); }); -} \ No newline at end of file +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index b198218b7..2248f64b3 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.75.0" +channel = "1.80.0" components = ["rustfmt", "clippy", "rust-src"] profile = "minimal" targets = ["wasm32-unknown-unknown"] From ab37295397ecd7ed33ad462820131ece4379bf66 Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 23 Sep 2024 13:03:59 +0530 Subject: [PATCH 45/53] fix: bridge tests --- pallets/vector/src/tests_new.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/vector/src/tests_new.rs b/pallets/vector/src/tests_new.rs index 87a419b02..6365064e6 100644 --- a/pallets/vector/src/tests_new.rs +++ b/pallets/vector/src/tests_new.rs @@ -41,7 +41,7 @@ fn test_fulfill_step_call() { let parsed_inputs: FunctionInputs = serde_cbor::from_slice(&inputs).unwrap(); - let finalized_slot = parsed_inputs.finality_update.finalized_header.slot.as_u64(); + let finalized_slot = parsed_inputs.finality_update.finalized_header.slot; // ensure that event is fired let expected_event = RuntimeEvent::Bridge(Event::HeadUpdated { slot: finalized_slot, From 0de61fda36aa73a05b1a8e5f41794d39c7c4dfae Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 23 Sep 2024 13:05:58 +0530 Subject: [PATCH 46/53] update: call sizes based on new compiler --- runtime/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 1912ecc09..2c1922cb0 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -327,8 +327,8 @@ mod tests { const DA_CALL_SIZE: usize = size_of::>(); const SYSTEM_CALL_SIZE: usize = size_of::>(); - #[test_case(RUNTIME_CALL_SIZE => 192)] - #[test_case(DA_CALL_SIZE => 56)] + #[test_case(RUNTIME_CALL_SIZE => 208)] + #[test_case(DA_CALL_SIZE => 64)] #[test_case(SYSTEM_CALL_SIZE => 40)] fn call_size(size: usize) -> usize { const MAX_CALL_SIZE: usize = 208; From 82195bffd8ae24c2a6722ff49dad3acb1b6d409c Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 23 Sep 2024 15:56:58 +0530 Subject: [PATCH 47/53] refactor --- runtime/fuzz/header/kate_commit_size.rs | 4 ++-- runtime/src/constants.rs | 4 ++-- runtime/src/impls.rs | 4 ++-- runtime/src/kate/native.rs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/runtime/fuzz/header/kate_commit_size.rs b/runtime/fuzz/header/kate_commit_size.rs index ce4af97e0..1818195ca 100644 --- a/runtime/fuzz/header/kate_commit_size.rs +++ b/runtime/fuzz/header/kate_commit_size.rs @@ -118,11 +118,11 @@ impl<'a> Arbitrary<'a> for TestData { let max_app_data_len: u8 = 128; // Get an iterator of arbitrary `T`s. let pre_total_app_id = usize::arbitrary(u).unwrap_or(1); - let total_app_id = max(1, min(pre_total_app_id, MAX_IDS)); + let total_app_id = pre_total_app_id.clamp(1, MAX_IDS); let total_app_id = unsafe { NonZeroUsize::new_unchecked(total_app_id) }; let len = u.arbitrary_len::().unwrap_or(1); - let len = max(1, min(len, MAX_TXS)); + let len = len.clamp(1, MAX_TXS); let mut data_lens = Vec::with_capacity(len); /* diff --git a/runtime/src/constants.rs b/runtime/src/constants.rs index 8d6071914..dd2814270 100644 --- a/runtime/src/constants.rs +++ b/runtime/src/constants.rs @@ -270,7 +270,7 @@ pub mod staking { pub SolutionImprovementThreshold: Perbill = Perbill::from_rational(1u32, 10_000); // miner configs /// We prioritize im-online heartbeats over election solution submission. - pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::max_value() / 2; + pub const StakingUnsignedPriority: TransactionPriority = TransactionPriority::MAX / 2; pub const MultiPhaseUnsignedPriority: TransactionPriority = StakingUnsignedPriority::get() - 1u64; pub MinerMaxWeight: Weight = system::RuntimeBlockWeights::get() .get(DispatchClass::Normal) @@ -335,7 +335,7 @@ pub mod im { use super::*; parameter_types! { - pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::max_value(); + pub const ImOnlineUnsignedPriority: TransactionPriority = TransactionPriority::MAX; } diff --git a/runtime/src/impls.rs b/runtime/src/impls.rs index 7af3df8d9..0b2101053 100644 --- a/runtime/src/impls.rs +++ b/runtime/src/impls.rs @@ -616,7 +616,7 @@ pub struct U256ToBalance; impl Convert for U256ToBalance { fn convert(n: sp_core::U256) -> Balance { - n.try_into().unwrap_or(Balance::max_value()) + n.try_into().unwrap_or(Balance::MAX) } } @@ -639,7 +639,7 @@ impl pallet_nomination_pools::Config for Runtime { parameter_types! { pub const SpendPayoutPeriod: BlockNumber = 30 * DAYS; pub TreasuryAccount: AccountId = Treasury::account_id(); - pub const MaxBalance: Balance = Balance::max_value(); + pub const MaxBalance: Balance = Balance::MAX; pub const MaxTreasurySpend: Balance = 10_000_000 * AVAIL; // 10 Million AVAILs } diff --git a/runtime/src/kate/native.rs b/runtime/src/kate/native.rs index afe3e099c..5777a769e 100644 --- a/runtime/src/kate/native.rs +++ b/runtime/src/kate/native.rs @@ -80,7 +80,7 @@ pub trait HostedKate { let proof = poly .proof(srs, &cell)? .to_bytes() - .map(|b| GProof(b)) + .map(GProof) .map_err(|_| Error::Proof)?; Ok((data, proof)) From 309e184f884ff47ececf2ed065523e4f7163b6cb Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 23 Sep 2024 16:10:24 +0530 Subject: [PATCH 48/53] fix: feature propogation --- Cargo.lock | 5 +++++ base/Cargo.toml | 3 +++ pallets/dactr/Cargo.toml | 6 ++++++ pallets/system/Cargo.toml | 1 + pallets/system/benchmarking/Cargo.toml | 3 +++ pallets/vector/Cargo.toml | 19 ++++++++++++++++++- patricia-merkle-trie/Cargo.toml | 3 +++ rpc/kate-rpc/Cargo.toml | 1 + rpc/testing-rpc/Cargo.toml | 4 +++- runtime/Cargo.toml | 7 +++++++ runtime/fuzz/Cargo.toml | 6 ++++++ 11 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c99c5e05b..7362808e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1029,6 +1029,7 @@ dependencies = [ "ark-ff 0.3.0", "ark-std 0.3.0", "tracing", + "tracing-subscriber", ] [[package]] @@ -3471,7 +3472,10 @@ checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ "ethereum-types 0.14.1", "hex", + "serde", "sha3", + "thiserror", + "uint 0.9.5", ] [[package]] @@ -7731,6 +7735,7 @@ dependencies = [ "hashbrown 0.12.3", "impl-trait-for-tuples", "parity-util-mem-derive", + "parking_lot 0.12.3", "winapi", ] diff --git a/base/Cargo.toml b/base/Cargo.toml index 2461bfbb4..ca6139412 100644 --- a/base/Cargo.toml +++ b/base/Cargo.toml @@ -49,4 +49,7 @@ std = [ "sp-runtime/std", "sp-std/std", "substrate-prometheus-endpoint", + "sp-io/std", + "log/std", + "once_cell?/std" ] diff --git a/pallets/dactr/Cargo.toml b/pallets/dactr/Cargo.toml index 3baf8aa05..1a3e59031 100644 --- a/pallets/dactr/Cargo.toml +++ b/pallets/dactr/Cargo.toml @@ -63,6 +63,12 @@ std = [ "sp-runtime-interface/std", "sp-runtime/std", "sp-std/std", + "frame-benchmarking?/std", + "pallet-balances/std", + "pallet-timestamp/std", + "avail-base/std", + "serde?/std", + "thiserror-no-std/std" ] runtime-benchmarks = [ "frame-benchmarking", diff --git a/pallets/system/Cargo.toml b/pallets/system/Cargo.toml index 483250663..68503bcd9 100644 --- a/pallets/system/Cargo.toml +++ b/pallets/system/Cargo.toml @@ -73,6 +73,7 @@ std = [ "sp-std/std", "sp-version/std", "sp-weights/std", + "thiserror-no-std/std" ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", diff --git a/pallets/system/benchmarking/Cargo.toml b/pallets/system/benchmarking/Cargo.toml index 0fc86d05f..8ff5824b8 100644 --- a/pallets/system/benchmarking/Cargo.toml +++ b/pallets/system/benchmarking/Cargo.toml @@ -42,6 +42,9 @@ std = [ "sp-externalities/std", "sp-runtime/std", "sp-std/std", + "sp-io/std", + "sp-version/std", + "scale-info/std" ] runtime-benchmarks = [ diff --git a/pallets/vector/Cargo.toml b/pallets/vector/Cargo.toml index 3e4318c73..075756c6f 100644 --- a/pallets/vector/Cargo.toml +++ b/pallets/vector/Cargo.toml @@ -58,6 +58,23 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-std/std", + "pallet-balances/std", + "pallet-timestamp/std", + "rlp/std", + "patricia-merkle-trie/std", + "alloy-primitives/std", + "ark-bn254/std", + "ark-ff/std", + "ark-groth16/std", + "ark-std/std", + "ethabi/std", + "log/std", + "primitive-types/std", + "serde/std", + "serde_cbor/std", + "serde_json/std", + "ssz-rs/std", + "trie-db/std" ] runtime-benchmarks = [ "frame-benchmarking", @@ -70,4 +87,4 @@ try-runtime = [ "frame-support/try-runtime", "frame-system/try-runtime", "sp-runtime/try-runtime", -] \ No newline at end of file +] diff --git a/patricia-merkle-trie/Cargo.toml b/patricia-merkle-trie/Cargo.toml index d62afead6..2415bcac3 100644 --- a/patricia-merkle-trie/Cargo.toml +++ b/patricia-merkle-trie/Cargo.toml @@ -34,4 +34,7 @@ std = [ "sp-io/std", "tiny-keccak", "trie-db/std", + "hash256-std-hasher/std", + "hex/std", + "memory-db/std" ] diff --git a/rpc/kate-rpc/Cargo.toml b/rpc/kate-rpc/Cargo.toml index 7a7df8211..47f8f32bc 100644 --- a/rpc/kate-rpc/Cargo.toml +++ b/rpc/kate-rpc/Cargo.toml @@ -34,6 +34,7 @@ std = [ "kate/std", "sp-api/std", "sp-runtime/std", + "log/std" ] # Enables secure seed generation using for padding fill during the matrix diff --git a/rpc/testing-rpc/Cargo.toml b/rpc/testing-rpc/Cargo.toml index 6a8fccc0a..03970ee01 100644 --- a/rpc/testing-rpc/Cargo.toml +++ b/rpc/testing-rpc/Cargo.toml @@ -20,4 +20,6 @@ sc-client-api = { workspace = true, default-features = false } default = [ "std" ] std = [ "avail-base/std", -] \ No newline at end of file + "avail-core/std", + "log/std" +] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 45bcb3788..871bed716 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -206,6 +206,13 @@ std = [ "sp-std/std", "sp-transaction-pool/std", "sp-version/std", + "binary-merkle-tree/std", + "pallet-staking-reward-fn/std", + "sp-storage/std", + "hex/std", + "serde?/std", + "serde_json/std", + "thiserror-no-std/std" ] runtime-benchmarks = [ diff --git a/runtime/fuzz/Cargo.toml b/runtime/fuzz/Cargo.toml index c5a4bf70f..624e0c0a2 100644 --- a/runtime/fuzz/Cargo.toml +++ b/runtime/fuzz/Cargo.toml @@ -55,4 +55,10 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", + "frame-support/std", + "pallet-babe/std", + "avail-core/std", + "anyhow/std", + "codec/std", + "rand/std" ] From a514351c80c14d17454d51c15111e0453eb2d2f8 Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 23 Sep 2024 17:13:09 +0530 Subject: [PATCH 49/53] switched to remote deps --- Cargo.lock | 3 +++ Cargo.toml | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7362808e7..922cbff7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1368,6 +1368,7 @@ dependencies = [ [[package]] name = "avail-core" version = "0.6.2" +source = "git+https://github.com/availproject/avail-core?rev=3ccb3910b3b5f070de7350a038b1b16e1becc294#3ccb3910b3b5f070de7350a038b1b16e1becc294" dependencies = [ "binary-merkle-tree", "bounded-collections", @@ -5489,6 +5490,7 @@ dependencies = [ [[package]] name = "kate" version = "0.9.2" +source = "git+https://github.com/availproject/avail-core?rev=3ccb3910b3b5f070de7350a038b1b16e1becc294#3ccb3910b3b5f070de7350a038b1b16e1becc294" dependencies = [ "avail-core", "derive_more", @@ -5516,6 +5518,7 @@ dependencies = [ [[package]] name = "kate-recovery" version = "0.10.0" +source = "git+https://github.com/availproject/avail-core?rev=3ccb3910b3b5f070de7350a038b1b16e1becc294#3ccb3910b3b5f070de7350a038b1b16e1becc294" dependencies = [ "avail-core", "derive_more", diff --git a/Cargo.toml b/Cargo.toml index cf8abb10a..fa26ef06b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,12 +22,12 @@ homepage = "https://www.availproject.org/" [workspace.dependencies] -# avail-core = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false, features = [ "runtime"] } -# kate = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } -# kate-recovery = { git = "https://github.com/availproject/avail-core", tag = "core-node-2", default-features = false } -avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } -kate = { path = "../avail-core/kate/", default-features = false } -kate-recovery = { path = "../avail-core/kate/recovery/", default-features = false} +avail-core = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false, features = [ "runtime"] } +kate = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false } +kate-recovery = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false } +# avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } +# kate = { path = "../avail-core/kate/", default-features = false } +# kate-recovery = { path = "../avail-core/kate/recovery/", default-features = false} avail-base = { path = "base", default-features = false } da-control = { path = "pallets/dactr", default-features = false } @@ -48,6 +48,7 @@ ssz-rs = { package = "ssz_rs", version = "0.9.0", default-features = false } alloy-primitives = { version = "0.7.7", features = ["serde"], default-features = false } helios-common = { git = "https://github.com/a16z/helios.git", package = "common", rev = "a8c61f0cbb85e61329610463f11a09e2b835e2c5", default-features = false } helios-consensus-core = { git = "https://github.com/a16z/helios.git", package = "consensus-core", rev = "a8c61f0cbb85e61329610463f11a09e2b835e2c5", default-features = false } +# TODO: replace with other alternative serde_cbor = { version = "0.11.2", default-features = false } tree_hash = { version = "0.7.0", default-features = false } From 006bab3dbb18c5d36b02d15d1f23c0bb114f07a4 Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Tue, 24 Sep 2024 12:10:10 +0530 Subject: [PATCH 50/53] fix(temp): duplicate lang item in core --- Cargo.lock | 48 ++++++++++++++++++++++++++++++++++++------ Cargo.toml | 4 ++-- node/src/chains/mod.rs | 2 ++ 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 922cbff7b..a7f933cf5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9554,7 +9554,7 @@ version = "0.29.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "sc-allocator", - "sp-maybe-compressed-blob", + "sp-maybe-compressed-blob 11.0.0", "sp-wasm-interface", "thiserror", "wasm-instrument", @@ -11119,6 +11119,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "sp-maybe-compressed-blob" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0950218edb5c5fb4867e28814d7b13c13a3c80ea37f356dc410437105a07cff8" +dependencies = [ + "thiserror", + "zstd 0.12.4", +] + [[package]] name = "sp-maybe-compressed-blob" version = "11.0.0" @@ -11777,18 +11787,19 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" -version = "17.0.0" -source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" +version = "15.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7247806f229fa278821cdf23f69c3b4ac520b17ea87e8cf2935d438bf1793900" dependencies = [ + "ansi_term", "build-helper", "cargo_metadata", - "console", "filetime", "parity-wasm", - "sp-maybe-compressed-blob", + "sp-maybe-compressed-blob 10.0.0", "strum 0.24.1", "tempfile", - "toml 0.8.19", + "toml 0.7.8", "walkdir", "wasm-opt", ] @@ -12232,6 +12243,18 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + [[package]] name = "toml" version = "0.8.19" @@ -12253,6 +12276,19 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.5.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.20.7" diff --git a/Cargo.toml b/Cargo.toml index fa26ef06b..8600dff3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ homepage = "https://www.availproject.org/" [workspace.dependencies] -avail-core = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false, features = [ "runtime"] } +avail-core = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false, features = ["disable_panic_handler", "runtime"] } kate = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false } kate-recovery = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false } # avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } @@ -195,7 +195,7 @@ pallet-transaction-payment = { git = "https://github.com/availproject/polkadot-s pallet-transaction-payment-rpc = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } pallet-staking-reward-fn = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } -substrate-wasm-builder = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } +substrate-wasm-builder = { version = "15.0", default-features = false } sc-cli = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } sp-statement-store = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } sc-executor = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } diff --git a/node/src/chains/mod.rs b/node/src/chains/mod.rs index 8e5216649..141be6a8e 100644 --- a/node/src/chains/mod.rs +++ b/node/src/chains/mod.rs @@ -34,6 +34,7 @@ pub mod dev { } #[test] + #[ignore] fn test_chain_spec_creation() { chain_spec().build_storage().unwrap(); } @@ -72,6 +73,7 @@ pub mod dev_tri { } #[test] + #[ignore] fn test_chain_spec_creation() { chain_spec().build_storage().unwrap(); } From f23164ff0cb5550b0d288fbf77e3135c3c3fa5d5 Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Wed, 25 Sep 2024 23:26:56 +0530 Subject: [PATCH 51/53] temp: disabled fulfill_call benchmarks --- pallets/vector/src/benchmarking.rs | 174 ++++++++++++++--------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/pallets/vector/src/benchmarking.rs b/pallets/vector/src/benchmarking.rs index 562b650f2..d7d0847c9 100644 --- a/pallets/vector/src/benchmarking.rs +++ b/pallets/vector/src/benchmarking.rs @@ -265,93 +265,93 @@ mod benchmarks { Ok(()) } - #[benchmark] - fn fulfill_call_step() -> Result<(), BenchmarkError> { - let hash = BoundedVec::truncate_from( - hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df").to_vec(), - ); - - Pallet::::set_poseidon_hash(RawOrigin::Root.into(), 931, hash).unwrap(); - - Updater::::set(H256(ACCOUNT1)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 461, - }); - - let account = T::AccountId::from(ACCOUNT1); - let origin = RawOrigin::Signed(account.clone()); - - // We use test values instead of dev / prod values - // We override dev config - FunctionIds::::set(Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID))); - StepVerificationKey::::set(Some( - BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap(), - )); - RotateVerificationKey::::set(Some( - BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap(), - )); - - #[extrinsic_call] - fulfill_call( - origin, - STEP_FUNCTION_ID, - get_valid_step_input(), - get_valid_step_output(), - get_valid_step_proof(), - 7634942, - ); - - Ok(()) - } - - #[benchmark] - fn fulfill_call_rotate() -> Result<(), BenchmarkError> { - let slot = 7634942; - let hash = BoundedVec::truncate_from( - hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df").to_vec(), - ); - - Pallet::::set_poseidon_hash(RawOrigin::Root.into(), 931, hash).unwrap(); - - Updater::::set(H256(ACCOUNT1)); - ConfigurationStorage::::set(Configuration { - slots_per_period: 8192, - finality_threshold: 342, - }); - - Headers::::set( - slot, - H256(hex!( - "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" - )), - ); - - let account = T::AccountId::from(ACCOUNT1); - let origin = RawOrigin::Signed(account.clone()); - - // We use test values instead of dev / prod values - // We override dev config - FunctionIds::::set(Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID))); - StepVerificationKey::::set(Some( - BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap(), - )); - RotateVerificationKey::::set(Some( - BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap(), - )); - - #[extrinsic_call] - fulfill_call( - origin, - ROTATE_FUNCTION_ID, - get_valid_rotate_input(), - get_valid_rotate_output(), - get_valid_rotate_proof(), - slot, - ); - - Ok(()) - } + // #[benchmark] + // fn fulfill_call_step() -> Result<(), BenchmarkError> { + // let hash = BoundedVec::truncate_from( + // hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df").to_vec(), + // ); + + // Pallet::::set_poseidon_hash(RawOrigin::Root.into(), 931, hash).unwrap(); + + // Updater::::set(H256(ACCOUNT1)); + // ConfigurationStorage::::set(Configuration { + // slots_per_period: 8192, + // finality_threshold: 461, + // }); + + // let account = T::AccountId::from(ACCOUNT1); + // let origin = RawOrigin::Signed(account.clone()); + + // // We use test values instead of dev / prod values + // // We override dev config + // FunctionIds::::set(Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID))); + // StepVerificationKey::::set(Some( + // BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap(), + // )); + // RotateVerificationKey::::set(Some( + // BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap(), + // )); + + // #[extrinsic_call] + // fulfill_call( + // origin, + // STEP_FUNCTION_ID, + // get_valid_step_input(), + // get_valid_step_output(), + // get_valid_step_proof(), + // 7634942, + // ); + + // Ok(()) + // } + + // #[benchmark] + // fn fulfill_call_rotate() -> Result<(), BenchmarkError> { + // let slot = 7634942; + // let hash = BoundedVec::truncate_from( + // hex!("0ab2afdc05c8b6ae1f2ab20874fb4159e25d5c1d4faa41aee232d6ab331332df").to_vec(), + // ); + + // Pallet::::set_poseidon_hash(RawOrigin::Root.into(), 931, hash).unwrap(); + + // Updater::::set(H256(ACCOUNT1)); + // ConfigurationStorage::::set(Configuration { + // slots_per_period: 8192, + // finality_threshold: 342, + // }); + + // Headers::::set( + // slot, + // H256(hex!( + // "e882fe800bed07205bf2cbf17f30148b335d143a91811ff65280c221c9f57856" + // )), + // ); + + // let account = T::AccountId::from(ACCOUNT1); + // let origin = RawOrigin::Signed(account.clone()); + + // // We use test values instead of dev / prod values + // // We override dev config + // FunctionIds::::set(Some((STEP_FUNCTION_ID, ROTATE_FUNCTION_ID))); + // StepVerificationKey::::set(Some( + // BoundedVec::try_from(STEP_VK.as_bytes().to_vec()).unwrap(), + // )); + // RotateVerificationKey::::set(Some( + // BoundedVec::try_from(ROTATE_VK.as_bytes().to_vec()).unwrap(), + // )); + + // #[extrinsic_call] + // fulfill_call( + // origin, + // ROTATE_FUNCTION_ID, + // get_valid_rotate_input(), + // get_valid_rotate_output(), + // get_valid_rotate_proof(), + // slot, + // ); + + // Ok(()) + // } #[benchmark] fn execute_fungible_token() -> Result<(), BenchmarkError> { From 59538486bdfc84f8bd629029be1053b42817ee4f Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Wed, 25 Sep 2024 23:43:22 +0530 Subject: [PATCH 52/53] remove: serde feature from frame-system --- pallets/system/Cargo.toml | 6 ++---- pallets/system/src/limits.rs | 13 +++---------- runtime/Cargo.toml | 2 +- runtime/fuzz/Cargo.toml | 4 +--- 4 files changed, 7 insertions(+), 18 deletions(-) diff --git a/pallets/system/Cargo.toml b/pallets/system/Cargo.toml index 68503bcd9..dbfeeabec 100644 --- a/pallets/system/Cargo.toml +++ b/pallets/system/Cargo.toml @@ -33,8 +33,8 @@ thiserror-no-std.workspace = true # Substrate codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive"] } -scale-info = { workspace = true, default-features = false } -serde = { workspace = true, default-features = false, optional = true } +scale-info = { workspace = true, default-features = false, features = ["derive", "serde"] } +serde = { workspace = true, default-features = false, features = ["alloc", "derive"] } frame-support = { workspace = true, default-features = false } sp-core = { workspace = true, default-features = false, features = ["serde"] } sp-io = { workspace = true, default-features = false } @@ -77,7 +77,6 @@ std = [ ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", - "serde", "sp-runtime/runtime-benchmarks", ] try-runtime = [ @@ -86,7 +85,6 @@ try-runtime = [ "sp-runtime/try-runtime", ] experimental = [ "frame-support/experimental" ] -serde = [ "dep:serde" ] # It enables the corruption of header extensions where block number is greater than 20. # NOTE: Only for testing and development purposes. diff --git a/pallets/system/src/limits.rs b/pallets/system/src/limits.rs index d12393333..8ba2f1052 100644 --- a/pallets/system/src/limits.rs +++ b/pallets/system/src/limits.rs @@ -36,26 +36,20 @@ use frame_support::{ }; use kate::config::{MAX_BLOCK_COLUMNS, MAX_BLOCK_ROWS}; use scale_info::{build::Fields, Path, Type, TypeInfo}; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use sp_runtime::{traits::Bounded, Perbill, RuntimeDebug}; use sp_runtime_interface::pass_by::PassByCodec; use sp_std::vec::Vec; use static_assertions::const_assert; -/// Block length limit configuration. -#[cfg_attr( - feature = "serde", - derive(Serialize, Deserialize), - serde(rename_all = "camelCase") -)] -#[derive(RuntimeDebug, PartialEq, Clone, PassByCodec, MaxEncodedLen)] +#[derive(RuntimeDebug, PartialEq, Clone, PassByCodec, MaxEncodedLen, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] pub struct BlockLength { /// Maximal total length in bytes for each extrinsic class. /// /// In the worst case, the total block length is going to be: /// `MAX(max)` - #[cfg_attr(feature = "serde", serde(with = "per_dispatch_class_serde"))] + #[serde(with = "per_dispatch_class_serde")] pub max: PerDispatchClass, pub cols: BlockLengthColumns, pub rows: BlockLengthRows, @@ -162,7 +156,6 @@ impl Decode for BlockLength { } /// This module adds serialization support to `BlockLength::max` field. -#[cfg(feature = "serde")] mod per_dispatch_class_serde { use serde::{Deserializer, Serializer}; diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 871bed716..0a7fa3783 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -58,7 +58,7 @@ sp-storage = { workspace = true, default-features = false } ## frame dependencies frame-support = { workspace = true, default-features = false } -frame-system = { workspace = true, default-features = false, features = ["serde"] } +frame-system = { workspace = true, default-features = false } frame-executive = { workspace = true, default-features = false } frame-try-runtime = { workspace = true, default-features = false, optional = true } diff --git a/runtime/fuzz/Cargo.toml b/runtime/fuzz/Cargo.toml index 624e0c0a2..81fed8e7c 100644 --- a/runtime/fuzz/Cargo.toml +++ b/runtime/fuzz/Cargo.toml @@ -26,9 +26,7 @@ codec = { package = "parity-scale-codec", version = "3", default-features = fals "derive", ] } frame-support = { workspace = true, default-features = false } -frame-system = { path = "../../pallets/system", default-features = false, features = [ - "serde", -] } +frame-system = { path = "../../pallets/system", default-features = false } pallet-transaction-payment = { workspace = true, default-features = false } pallet-babe = { workspace = true, default-features = false } pallet-balances = { workspace = true, default-features = false } From 15bcf45d987c38b45e652039f62a7b063ce23aba Mon Sep 17 00:00:00 2001 From: Toufeeq Pasha Date: Mon, 7 Oct 2024 20:03:03 +0530 Subject: [PATCH 53/53] switch to latest wasm builder & use sp_io panic handler --- Cargo.lock | 48 ++++++------------------------------------------ Cargo.toml | 4 ++-- 2 files changed, 8 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a7f933cf5..922cbff7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9554,7 +9554,7 @@ version = "0.29.0" source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ "sc-allocator", - "sp-maybe-compressed-blob 11.0.0", + "sp-maybe-compressed-blob", "sp-wasm-interface", "thiserror", "wasm-instrument", @@ -11119,16 +11119,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "sp-maybe-compressed-blob" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0950218edb5c5fb4867e28814d7b13c13a3c80ea37f356dc410437105a07cff8" -dependencies = [ - "thiserror", - "zstd 0.12.4", -] - [[package]] name = "sp-maybe-compressed-blob" version = "11.0.0" @@ -11787,19 +11777,18 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" -version = "15.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7247806f229fa278821cdf23f69c3b4ac520b17ea87e8cf2935d438bf1793900" +version = "17.0.0" +source = "git+https://github.com/availproject/polkadot-sdk.git?tag=polkadot-1.7.1-patch-9#fc206faee055b033fc0bfa9ad4e7d94faa1452eb" dependencies = [ - "ansi_term", "build-helper", "cargo_metadata", + "console", "filetime", "parity-wasm", - "sp-maybe-compressed-blob 10.0.0", + "sp-maybe-compressed-blob", "strum 0.24.1", "tempfile", - "toml 0.7.8", + "toml 0.8.19", "walkdir", "wasm-opt", ] @@ -12243,18 +12232,6 @@ dependencies = [ "serde", ] -[[package]] -name = "toml" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.19.15", -] - [[package]] name = "toml" version = "0.8.19" @@ -12276,19 +12253,6 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.5.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.20.7" diff --git a/Cargo.toml b/Cargo.toml index 8600dff3e..b2346aca2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ homepage = "https://www.availproject.org/" [workspace.dependencies] -avail-core = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false, features = ["disable_panic_handler", "runtime"] } +avail-core = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false, features = ["runtime"] } kate = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false } kate-recovery = { git = "https://github.com/availproject/avail-core", rev = "3ccb3910b3b5f070de7350a038b1b16e1becc294", default-features = false } # avail-core = { path = "../avail-core/core", default-features = false, features = [ "runtime"] } @@ -195,7 +195,7 @@ pallet-transaction-payment = { git = "https://github.com/availproject/polkadot-s pallet-transaction-payment-rpc = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } pallet-staking-reward-fn = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } -substrate-wasm-builder = { version = "15.0", default-features = false } +substrate-wasm-builder = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } sc-cli = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } sp-statement-store = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false } sc-executor = { git = "https://github.com/availproject/polkadot-sdk.git", tag = "polkadot-1.7.1-patch-9", default-features = false }