diff --git a/.dockerignore b/.dockerignore index 659e2f52..1f4cb7be 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,10 @@ -**target/ -**direnv/ +target/ +.direnv/ +vendor/ +nearx/contract/out/ +nearx/build/ +state.db/ +wrapped/ +build/ +.git/ +.env/ diff --git a/.envrc b/.envrc index 1305de82..605ff435 100644 --- a/.envrc +++ b/.envrc @@ -2,3 +2,4 @@ if ! has nix_direnv_version || ! nix_direnv_version 2.2.0; then source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.0/direnvrc" "sha256-5EwyKnkJNQeXrRkYbwwRBcXbibosCJqyIUuz9Xq+LRc=" fi use flake +source .env diff --git a/.gitignore b/.gitignore index 37c42c9d..3caaee68 100644 --- a/.gitignore +++ b/.gitignore @@ -16,11 +16,15 @@ nearx/build nearx/contract/cache nearx/contract/out nearx/contract/lib +near/contract/script/FunctionVerifier # Ignores development broadcast logs !**broadcast **broadcast/*/31337/ **broadcast/**/dry-run/ nearx/contract/broadcast +state.json # Dotenv file .env + +http-cacache/ diff --git a/.gitmodules b/.gitmodules index 96bfd38d..43326c9c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "nearx/contract/lib/openzeppelin-contracts"] path = nearx/contract/lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts -[submodule "nearx/contract/lib/openzeppelin-contracts-upgradeable"] - path = nearx/contract/lib/openzeppelin-contracts-upgradeable - url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable [submodule "nearx/contract/lib/foundry-devops"] path = nearx/contract/lib/foundry-devops url = https://github.com/chainaccelorg/foundry-devops @@ -19,3 +16,9 @@ [submodule "nearx/contract/lib/forge-std"] path = nearx/contract/lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "nearx/contract/lib/openzeppelin-foundry-upgrades"] + path = nearx/contract/lib/openzeppelin-foundry-upgrades + url = https://github.com/OpenZeppelin/openzeppelin-foundry-upgrades +[submodule "nearx/contract/lib/openzeppelin-contracts-upgradeable"] + path = nearx/contract/lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable diff --git a/Cargo.lock b/Cargo.lock index 64bc164e..ce912de0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,7 +21,7 @@ dependencies = [ "actix-macros", "actix-rt", "actix_derive", - "bitflags 2.4.2", + "bitflags 2.5.0", "bytes", "crossbeam-channel", "futures-core", @@ -44,7 +44,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -65,7 +65,7 @@ checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -118,9 +118,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "const-random", @@ -159,6 +159,350 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "alloy" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-contract", + "alloy-core", + "alloy-provider", + "alloy-transport", + "alloy-transport-http", + "reqwest", +] + +[[package]] +name = "alloy-consensus" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-eips", + "alloy-primitives 0.6.4", + "alloy-rlp", +] + +[[package]] +name = "alloy-contract" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-primitives 0.6.4", + "alloy-provider", + "alloy-rpc-types", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror", +] + +[[package]] +name = "alloy-core" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives 0.6.4", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.6.4", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.6.5", +] + +[[package]] +name = "alloy-eips" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-primitives 0.6.4", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "alloy-primitives 0.6.4", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-primitives 0.6.4", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "alloy-network" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives 0.6.4", + "alloy-rpc-types", + "alloy-signer", + "async-trait", + "futures-utils-wasm", + "serde", + "thiserror", +] + +[[package]] +name = "alloy-primitives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0628ec0ba5b98b3370bb6be17b12f23bfce8ee4ad83823325a20546d9b03b78" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "proptest", + "rand 0.8.5", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-primitives" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand 0.8.5", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-json-rpc", + "alloy-network", + "alloy-primitives 0.6.4", + "alloy-rpc-client", + "alloy-rpc-trace-types", + "alloy-rpc-types", + "alloy-transport", + "alloy-transport-http", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "lru", + "reqwest", + "serde_json", + "tokio", + "tracing", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d58d9f5da7b40e9bfff0b7e7816700be4019db97d4b6359fe7f94a9e22e42ac" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +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-trace-types" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-primitives 0.6.4", + "alloy-rpc-types", + "alloy-serde", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-primitives 0.6.4", + "alloy-rlp", + "alloy-serde", + "itertools 0.12.1", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "alloy-serde" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-primitives 0.6.4", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-primitives 0.6.4", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.4.1", + "indexmap 2.2.5", + "proc-macro-error", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.53", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "winnow 0.6.5", +] + +[[package]] +name = "alloy-sol-types" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.6.4", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.0", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "alloy-transport-http" +version = "0.1.0" +source = "git+https://github.com/alloy-rs/alloy.git#148fbe03315060f62532a45dbc85c768582cd972" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower", + "url", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -237,6 +581,130 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.4", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.4", + "num-traits", + "paste", + "rustc_version 0.4.0", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.4", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.4", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "array-macro" version = "2.1.8" @@ -258,6 +726,16 @@ dependencies = [ "term", ] +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "assert_matches" version = "1.5.0" @@ -297,18 +775,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -319,7 +797,16 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version", + "rustc_version 0.4.0", +] + +[[package]] +name = "atomic" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +dependencies = [ + "bytemuck", ] [[package]] @@ -335,13 +822,13 @@ dependencies = [ [[package]] name = "auto_impl" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -361,9 +848,9 @@ dependencies = [ "bitflags 1.3.2", "bytes", "futures-util", - "http", - "http-body", - "hyper", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "itoa", "matchit", "memchr", @@ -391,8 +878,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "mime", "rustversion", "tower-layer", @@ -432,6 +919,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base64ct" version = "1.6.0" @@ -444,6 +937,15 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" +dependencies = [ + "serde", +] + [[package]] name = "bincode" version = "1.3.3" @@ -476,9 +978,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -503,6 +1005,15 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -532,15 +1043,15 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", "syn_derive", ] [[package]] name = "brotli" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -575,9 +1086,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.0" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "byte-slice-cast" @@ -585,6 +1096,12 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" + [[package]] name = "byteorder" version = "1.5.0" @@ -640,6 +1157,33 @@ dependencies = [ "ppv-lite86", ] +[[package]] +name = "cacache" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142316461ed3a3dfcba10417317472da5bfd0461e4d276bf7c07b330766d9490" +dependencies = [ + "digest 0.10.7", + "either", + "futures", + "hex", + "libc", + "memmap2", + "miette", + "reflink-copy", + "serde", + "serde_derive", + "serde_json", + "sha1", + "sha2", + "ssri", + "tempfile", + "thiserror", + "tokio", + "tokio-stream", + "walkdir", +] + [[package]] name = "camino" version = "1.1.6" @@ -666,7 +1210,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.22", "serde", "serde_json", "thiserror", @@ -674,9 +1218,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" dependencies = [ "jobserver", "libc", @@ -706,7 +1250,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -759,7 +1303,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -883,9 +1427,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.0" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d59688ad0945eaf6b84cb44fedbe93484c81b48970e98f09db8a22832d7961" +checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78" dependencies = [ "cfg-if", "cpufeatures", @@ -902,9 +1446,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const-random" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ "const-random-macro", ] @@ -1060,7 +1604,7 @@ dependencies = [ "fiat-crypto", "platforms", "rand_core 0.6.4", - "rustc_version", + "rustc_version 0.4.0", "subtle", "zeroize", ] @@ -1073,7 +1617,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -1097,7 +1641,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -1108,7 +1652,7 @@ checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -1130,6 +1674,24 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +[[package]] +name = "deadpool" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb84100978c1c7b37f09ed3ce3e5f843af02c2a2c431bae5b19230dad2c1b490" +dependencies = [ + "async-trait", + "deadpool-runtime", + "num_cpus", + "tokio", +] + +[[package]] +name = "deadpool-runtime" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49" + [[package]] name = "der" version = "0.7.8" @@ -1150,6 +1712,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive_arbitrary" version = "1.3.2" @@ -1158,7 +1731,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -1170,7 +1743,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version", + "rustc_version 0.4.0", "syn 1.0.109", ] @@ -1195,7 +1768,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -1413,7 +1986,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -1594,7 +2167,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "syn 2.0.49", + "syn 2.0.53", "toml 0.8.10", "walkdir", ] @@ -1612,7 +2185,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -1638,7 +2211,7 @@ dependencies = [ "serde", "serde_json", "strum 0.25.0", - "syn 2.0.49", + "syn 2.0.53", "tempfile", "thiserror", "tiny-keccak", @@ -1654,7 +2227,7 @@ dependencies = [ "chrono", "ethers-core", "reqwest", - "semver", + "semver 1.0.22", "serde", "serde_json", "thiserror", @@ -1705,7 +2278,7 @@ dependencies = [ "futures-timer", "futures-util", "hashers", - "http", + "http 0.2.12", "instant", "jsonwebtoken", "once_cell", @@ -1763,7 +2336,7 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver", + "semver 1.0.22", "serde", "serde_json", "solang-parser", @@ -1773,7 +2346,7 @@ dependencies = [ "tokio", "tracing", "walkdir", - "yansi", + "yansi 0.5.1", ] [[package]] @@ -1792,6 +2365,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 = "ff" version = "0.13.0" @@ -1827,6 +2411,20 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" +[[package]] +name = "figment" +version = "0.10.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7270677e7067213e04f323b55084586195f18308cd7546cfac9f873344ccceb6" +dependencies = [ + "atomic", + "pear", + "serde", + "toml 0.8.10", + "uncased", + "version_check", +] + [[package]] name = "fixed-hash" version = "0.7.0" @@ -1976,7 +2574,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -2019,6 +2617,12 @@ dependencies = [ "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" @@ -2100,17 +2704,36 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", - "indexmap 2.2.3", + "http 0.2.12", + "indexmap 2.2.5", + "slab", + "tokio", + "tokio-util 0.7.10", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", + "indexmap 2.2.5", "slab", "tokio", "tokio-util 0.7.10", @@ -2132,7 +2755,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", ] [[package]] @@ -2141,7 +2764,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", "allocator-api2", "rayon", "serde", @@ -2191,9 +2814,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" @@ -2204,6 +2827,12 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hmac" version = "0.12.1" @@ -2224,9 +2853,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -2234,14 +2874,93 @@ dependencies = [ ] [[package]] -name = "http-body" -version = "0.4.6" +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", +] + +[[package]] +name = "http-cache" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b5ab65432bbdfe8490dfde21d0366353a8d39f2bc24aca0146889f931b0b4b5" +dependencies = [ + "async-trait", + "bincode", + "cacache", + "http 0.2.12", + "http-cache-semantics", + "httpdate", + "serde", + "url", +] + +[[package]] +name = "http-cache-reqwest" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8285341ce7e709c56a0f259ff1c789c70edfbaa88acd69d27e4d63980b92dc" +dependencies = [ + "anyhow", + "async-trait", + "http 0.2.12", + "http-cache", + "http-cache-semantics", + "reqwest", + "reqwest-middleware", + "serde", + "task-local-extensions", + "url", +] + +[[package]] +name = "http-cache-semantics" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aec9f678bca3f4a15194b980f20ed9bfe0dd38e8d298c65c559a93dfbd6380a" +dependencies = [ + "http 0.2.12", + "http-serde", + "serde", + "time", +] + +[[package]] +name = "http-serde" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "6f560b665ad9f1572cfcaf034f7fb84338a7ce945216d64a90fd81f046a3caee" dependencies = [ - "bytes", - "http", - "pin-project-lite", + "http 0.2.12", + "serde", ] [[package]] @@ -2272,9 +2991,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -2286,6 +3005,27 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.2", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -2293,8 +3033,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.28", "rustls", "tokio", "tokio-rustls", @@ -2306,7 +3046,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.28", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -2319,12 +3059,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.28", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.2.0", + "pin-project-lite", + "socket2", + "tokio", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -2421,15 +3177,21 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown 0.14.3", "serde", ] +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + [[package]] name = "inout" version = "0.1.3" @@ -2446,6 +3208,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -2460,7 +3225,7 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.9", "libc", "windows-sys 0.52.0", ] @@ -2509,9 +3274,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2533,6 +3298,92 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105" +[[package]] +name = "jsonrpsee" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16fcc9dd231e72d22993f1643d5f7f0db785737dbe3c3d7ca222916ab4280795" +dependencies = [ + "jsonrpsee-core", + "jsonrpsee-proc-macros", + "jsonrpsee-server", + "jsonrpsee-types", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b974d8f6139efbe8425f32cb33302aba6d5e049556b5bfc067874e7a0da54a2e" +dependencies = [ + "anyhow", + "async-trait", + "beef", + "futures-util", + "hyper 0.14.28", + "jsonrpsee-types", + "parking_lot 0.12.1", + "rand 0.8.5", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e79a7109506831bf0cbeaad08729cdf0e592300c00f626bccd6d479974221e" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "344440ccd8492c1ca65f1391c5aa03f91189db38d602d189b9266a1a5c6a4d22" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.28", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project", + "route-recognizer", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util 0.7.10", + "tower", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13dac43c1a9fc2648b37f306b0a5b0e29b2a6e1c36a33b95c1948da2494e9c5" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "jsonwebtoken" version = "8.3.0" @@ -2585,6 +3436,16 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb8515fff80ed850aea4a1595f2e519c003e2a00a82fe168ebf5269196caf444" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "keccak-hash" version = "0.8.0" @@ -2650,7 +3511,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "libc", "redox_syscall 0.4.1", ] @@ -2679,9 +3540,18 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "lru" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown 0.14.3", +] [[package]] name = "mach2" @@ -2723,6 +3593,15 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.8.0" @@ -2738,7 +3617,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", "metrics-macros", "portable-atomic", ] @@ -2750,7 +3629,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d4fa7ce7c4862db464a37b0b31d89bca874562f034bd7993895572783d02950" dependencies = [ "base64 0.21.7", - "hyper", + "hyper 0.14.28", "indexmap 1.9.3", "ipnet", "metrics", @@ -2769,7 +3648,7 @@ checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -2791,6 +3670,29 @@ dependencies = [ "sketches-ddsketch", ] +[[package]] +name = "miette" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" +dependencies = [ + "miette-derive", + "once_cell", + "thiserror", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "mime" version = "0.3.17" @@ -2824,9 +3726,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -2983,28 +3885,29 @@ dependencies = [ "borsh", "coerce", "config", - "either", - "futures", - "hex", "itertools 0.12.1", "log", - "near-crypto", - "near-jsonrpc-client", + "near-light-client-primitives", "near-light-client-protocol", "near-light-client-rpc", "near-primitives", - "near-primitives-core", "pretty_env_logger", - "protobuf 3.2.0", - "rand 0.7.3", - "reqwest", + "rand 0.8.5", "serde", - "serde_json", "sled", - "thiserror", "tokio", ] +[[package]] +name = "near-light-client-primitives" +version = "0.3.0" +dependencies = [ + "figment", + "log", + "near-primitives-core", + "serde", +] + [[package]] name = "near-light-client-protocol" version = "0.3.0" @@ -3017,10 +3920,11 @@ dependencies = [ "log", "near-crypto", "near-jsonrpc-primitives", + "near-light-client-primitives", "near-primitives", "near-primitives-core", "pretty_env_logger", - "rand 0.7.3", + "rand 0.8.5", "serde", "serde_json", "test-utils", @@ -3034,21 +3938,18 @@ dependencies = [ "anyhow", "async-trait", "borsh", - "either", "futures", "hex", "itertools 0.12.1", "log", - "near-crypto", "near-jsonrpc-client", "near-jsonrpc-primitives", "near-primitives", "near-primitives-core", "pretty_env_logger", - "rand 0.7.3", + "rand 0.8.5", "serde", "serde_json", - "thiserror", "tokio", ] @@ -3059,9 +3960,10 @@ dependencies = [ "async-trait", "borsh", "cfg-if", + "clap", "ethers", - "hex", "log", + "near-light-client-primitives", "near-light-client-protocol", "near-light-client-rpc", "near-primitives", @@ -3195,7 +4097,7 @@ checksum = "80fca203c51edd9595ec14db1d13359fb9ede32314990bf296b6c5c4502f6ab7" dependencies = [ "quote", "serde", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -3207,7 +4109,7 @@ dependencies = [ "fs2", "near-rpc-error-core", "serde", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -3246,6 +4148,42 @@ dependencies = [ "zeropool-bn", ] +[[package]] +name = "nearx-operator" +version = "0.3.0" +dependencies = [ + "actix", + "alloy", + "anyhow", + "figment", + "futures", + "hashbrown 0.14.3", + "hex", + "http-cache-reqwest", + "jsonrpsee", + "jsonrpsee-core", + "near-light-client-primitives", + "near-light-client-protocol", + "near-light-client-rpc", + "near-light-clientx", + "paste", + "pretty_assertions", + "priority-queue", + "reqwest", + "reqwest-middleware", + "reqwest-retry", + "serde", + "serde_json", + "succinct-client", + "test-utils", + "thiserror", + "tokio", + "tracing", + "tracing-subscriber", + "uuid 1.7.0", + "wiremock", +] + [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -3395,7 +4333,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.9", "libc", ] @@ -3417,7 +4355,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -3468,11 +4406,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.63" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cfg-if", "foreign-types", "libc", @@ -3489,7 +4427,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -3500,9 +4438,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.99" +version = "0.9.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" dependencies = [ "cc", "libc", @@ -3540,7 +4478,7 @@ dependencies = [ "async-trait", "futures", "futures-util", - "http", + "http 0.2.12", "opentelemetry", "prost", "thiserror", @@ -3674,6 +4612,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "path-slash" version = "0.2.1" @@ -3708,6 +4652,29 @@ dependencies = [ "hmac", ] +[[package]] +name = "pear" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi 1.0.1", +] + +[[package]] +name = "pear_codegen" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.53", +] + [[package]] name = "pem" version = "1.1.1" @@ -3725,9 +4692,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.7" +version = "2.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" dependencies = [ "memchr", "thiserror", @@ -3754,7 +4721,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -3775,7 +4742,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.3", + "indexmap 2.2.5", ] [[package]] @@ -3785,7 +4752,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version", + "rustc_version 0.4.0", ] [[package]] @@ -3818,7 +4785,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -3841,22 +4808,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -3898,7 +4865,7 @@ name = "plonky2" version = "0.1.4" source = "git+https://github.com/mir-protocol/plonky2.git?rev=d2598bd#d2598bded0cb24d36b0a9900e8ffd104c470831b" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", "anyhow", "getrandom 0.2.12", "hashbrown 0.14.3", @@ -3922,7 +4889,7 @@ name = "plonky2" version = "0.1.4" source = "git+https://github.com/mir-protocol/plonky2.git#8753162b77190f02ec6bbf1c3e31d6c3c843eb8e" dependencies = [ - "ahash 0.8.8", + "ahash 0.8.11", "anyhow", "getrandom 0.2.12", "hashbrown 0.14.3", @@ -4055,7 +5022,7 @@ source = "git+https://github.com/dndll/succinctx.git#4e539f2ea4a42cedcd0b056346e dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -4095,7 +5062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ "diff", - "yansi", + "yansi 0.5.1", ] [[package]] @@ -4115,7 +5082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -4142,6 +5109,17 @@ dependencies = [ "uint", ] +[[package]] +name = "priority-queue" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509354d8a769e8d0b567d6821b84495c60213162761a732d68ce87c964bd347f" +dependencies = [ + "autocfg", + "equivalent", + "indexmap 2.2.5", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -4196,13 +5174,26 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", + "version_check", + "yansi 1.0.1", +] + [[package]] name = "prometheus" version = "0.13.3" @@ -4224,13 +5215,17 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ - "bitflags 2.4.2", + "bit-set", + "bit-vec", + "bitflags 2.5.0", "lazy_static", "num-traits", "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax 0.8.2", + "rusty-fork", + "tempfile", "unarray", ] @@ -4329,6 +5324,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.35" @@ -4445,9 +5446,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" dependencies = [ "either", "rayon-core", @@ -4501,6 +5502,17 @@ dependencies = [ "smallvec", ] +[[package]] +name = "reflink-copy" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767be24c0da52e7448d495b8d162506a9aa125426651d547d545d6c2b4b65b62" +dependencies = [ + "cfg-if", + "rustix", + "windows", +] + [[package]] name = "regex" version = "1.10.3" @@ -4553,9 +5565,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "78bf93c4af7a8bb7d879d51cebe797356ff10ae8516ace542b5182d9dcac10b2" dependencies = [ "async-compression", "base64 0.21.7", @@ -4563,16 +5575,17 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-rustls", "hyper-tls", "ipnet", "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", @@ -4597,6 +5610,55 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest-middleware" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a3e86aa6053e59030e7ce2d2a3b258dd08fc2d337d52f73f6cb480f5858690" +dependencies = [ + "anyhow", + "async-trait", + "http 0.2.12", + "reqwest", + "serde", + "task-local-extensions", + "thiserror", +] + +[[package]] +name = "reqwest-retry" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af20b65c2ee9746cc575acb6bd28a05ffc0d15e25c992a8f4462d8686aacb4f" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "futures", + "getrandom 0.2.12", + "http 0.2.12", + "hyper 0.14.28", + "parking_lot 0.11.2", + "reqwest", + "reqwest-middleware", + "retry-policies", + "task-local-extensions", + "tokio", + "tracing", + "wasm-timer", +] + +[[package]] +name = "retry-policies" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17dd00bff1d737c40dbcd47d4375281bf4c17933f9eef0a185fc7bacca23ecbd" +dependencies = [ + "anyhow", + "chrono", + "rand 0.8.5", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -4624,16 +5686,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom 0.2.12", "libc", "spin 0.9.8", "untrusted 0.9.0", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4678,6 +5741,42 @@ dependencies = [ "serde", ] +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "ruint" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f308135fef9fc398342da5472ce7c484529df23743fb7c734e0f3d472971e62" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint 0.4.4", + "num-traits", + "parity-scale-codec", + "primitive-types 0.12.2", + "proptest", + "rand 0.8.5", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" + [[package]] name = "rust-embed" version = "6.8.1" @@ -4699,7 +5798,7 @@ dependencies = [ "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.49", + "syn 2.0.53", "walkdir", ] @@ -4729,19 +5828,34 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hex" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.22", ] [[package]] @@ -4750,7 +5864,7 @@ version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -4764,7 +5878,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.8", "rustls-webpki", "sct", ] @@ -4784,7 +5898,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.7", + "ring 0.17.8", "untrusted 0.9.0", ] @@ -4794,11 +5908,23 @@ 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 = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "salsa20" @@ -4820,9 +5946,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "2ef2175c2907e7c8bc0a9c3f86aeb5ec1f3b275300ad58a44d0c3ae379a5e52e" dependencies = [ "cfg-if", "derive_more", @@ -4832,9 +5958,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "634d9b8eb8fd61c5cdd3390d9b2132300a7e7618955b98b8416f118c1b4e144f" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -4875,7 +6001,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.7", + "ring 0.17.8", "untrusted 0.9.0", ] @@ -4937,13 +6063,31 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + [[package]] name = "send_wrapper" version = "0.4.0" @@ -4958,29 +6102,29 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.196" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -5014,7 +6158,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -5048,7 +6192,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_derive", "serde_json", @@ -5065,7 +6209,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -5074,7 +6218,7 @@ version = "0.9.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "itoa", "ryu", "serde", @@ -5103,7 +6247,31 @@ checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", ] [[package]] @@ -5151,6 +6319,16 @@ dependencies = [ "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bac61da6b35ad76b195eb4771210f947734321a8d81d7738e1580d953bc7a15e" +dependencies = [ + "cc", + "cfg-if", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -5256,12 +6434,28 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures", + "http 0.2.12", + "httparse", + "log", + "rand 0.8.5", + "sha-1 0.9.8", ] [[package]] @@ -5300,6 +6494,23 @@ dependencies = [ "der", ] +[[package]] +name = "ssri" +version = "9.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7a2b3c2bc9693bcb40870c4e9b5bf0d79f9cb46273321bf855ec513e919082" +dependencies = [ + "base64 0.21.7", + "digest 0.10.7", + "hex", + "miette", + "serde", + "sha-1 0.10.1", + "sha2", + "thiserror", + "xxhash-rust", +] + [[package]] name = "starkyx" version = "0.1.0" @@ -5392,7 +6603,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -5410,6 +6621,23 @@ dependencies = [ "zeroize", ] +[[package]] +name = "succinct-client" +version = "0.1.0" +source = "git+https://github.com/succinctlabs/succinctx.git#18611dc4ff59ac53f895cd45588d562f0c088758" +dependencies = [ + "alloy-primitives 0.4.2", + "anyhow", + "ethers", + "log", + "regex", + "reqwest", + "serde", + "serde_json", + "toml 0.8.10", + "uuid 1.7.0", +] + [[package]] name = "svm-rs" version = "0.3.5" @@ -5421,7 +6649,7 @@ dependencies = [ "hex", "once_cell", "reqwest", - "semver", + "semver 1.0.22", "serde", "serde_json", "sha2", @@ -5443,15 +6671,26 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.6.4" +source = "git+https://github.com/alloy-rs/core?rev=907d61a45a9135e979310990744080eef5f03fe5#907d61a45a9135e979310990744080eef5f03fe5" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "syn_derive" version = "0.1.8" @@ -5461,7 +6700,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -5497,11 +6736,20 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", @@ -5533,44 +6781,34 @@ dependencies = [ name = "test-utils" version = "0.3.0" dependencies = [ - "anyhow", - "borsh", "derive_more", - "either", - "hex", - "itertools 0.12.1", "log", - "near-crypto", - "near-jsonrpc-primitives", "near-light-client-protocol", "near-primitives", - "near-primitives-core", "pretty_assertions", "pretty_env_logger", - "rand 0.7.3", "serde", "serde_json", - "thiserror", ] [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -5675,7 +6913,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -5700,13 +6938,14 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", "tokio", + "tokio-util 0.7.10", ] [[package]] @@ -5792,7 +7031,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "toml_datetime", "winnow 0.5.40", ] @@ -5803,7 +7042,7 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "toml_datetime", "winnow 0.5.40", ] @@ -5814,7 +7053,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "toml_datetime", "winnow 0.5.40", ] @@ -5825,11 +7064,11 @@ version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.1", + "winnow 0.6.5", ] [[package]] @@ -5844,10 +7083,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", "hyper-timeout", "percent-encoding", "pin-project", @@ -5939,7 +7178,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -6031,7 +7270,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.12", "httparse", "log", "rand 0.8.5", @@ -6072,6 +7311,15 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + [[package]] name = "unicase" version = "2.7.0" @@ -6095,9 +7343,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -6108,6 +7356,12 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + [[package]] name = "unicode-xid" version = "0.2.4" @@ -6151,6 +7405,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -6171,7 +7426,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d82b1bc5417102a73e8464c686eef947bdfb99fcdfc0a4f228e81afa9526470a" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.5", "serde", "serde_json", "utoipa-gen", @@ -6187,7 +7442,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -6258,6 +7513,15 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[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.4.0" @@ -6291,9 +7555,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -6301,24 +7565,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -6328,9 +7592,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6338,28 +7602,43 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasm-timer" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -6424,13 +7703,23 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core", + "windows-targets 0.52.4", +] + [[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.0", + "windows-targets 0.52.4", ] [[package]] @@ -6448,7 +7737,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.4", ] [[package]] @@ -6468,17 +7757,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "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", ] [[package]] @@ -6489,9 +7778,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -6501,9 +7790,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -6513,9 +7802,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -6525,9 +7814,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -6537,9 +7826,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -6549,9 +7838,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -6561,9 +7850,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winnow" @@ -6576,9 +7865,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" +checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8" dependencies = [ "memchr", ] @@ -6593,6 +7882,30 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wiremock" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec874e1eef0df2dcac546057fe5e29186f09c378181cd7b635b4b7bcc98e9d81" +dependencies = [ + "assert-json-diff", + "async-trait", + "base64 0.21.7", + "deadpool", + "futures", + "http 1.1.0", + "http-body-util", + "hyper 1.2.0", + "hyper-util", + "log", + "once_cell", + "regex", + "serde", + "serde_json", + "tokio", + "url", +] + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -6604,7 +7917,7 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version", + "rustc_version 0.4.0", "send_wrapper 0.6.0", "thiserror", "wasm-bindgen", @@ -6621,6 +7934,12 @@ dependencies = [ "tap", ] +[[package]] +name = "xxhash-rust" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" + [[package]] name = "yaml-rust" version = "0.4.5" @@ -6636,6 +7955,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "zerocopy" version = "0.7.32" @@ -6653,7 +7978,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.53", ] [[package]] @@ -6661,6 +7986,20 @@ name = "zeroize" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] [[package]] name = "zeropool-bn" diff --git a/Cargo.toml b/Cargo.toml index 38d28a83..4e27c745 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,17 +8,21 @@ members = [ "bin/*", "crates/*", "nearx" ] resolver = "2" [workspace.dependencies] -anyhow = "1.0" -async-trait = "0.1" -config = "0.13" -derive_more = "0.99" -either = { version = "1.9", features = [ "serde" ] } -itertools = "0.12" -log = "0.4" -pretty_assertions = "1.4" -pretty_env_logger = "0.5" -sled = "0.34" # TODO: maybe heavy, use heed instead -thiserror = "1.0" +anyhow = "1.0" +async-trait = "0.1" +config = "0.13" +derive_more = "0.99" +dotenv = "0.15" +either = { version = "1.9", features = [ "serde" ] } +figment = { version = "0.10", features = [ "toml", "env" ] } +itertools = "0.12" +log = "0.4" +pretty_assertions = "1.4" +pretty_env_logger = "0.5" +sled = "0.34" # TODO: maybe heavy, use heed instead +thiserror = "1.0" +tracing = "0.1" +tracing-subscriber = "0.3" # Async axum = "*" @@ -41,10 +45,21 @@ near-jsonrpc-primitives = "0.20" near-primitives = "0.20" near-primitives-core = "0.20" -near-light-client-protocol = { path = "crates/protocol" } -near-light-client-rpc = { path = "crates/rpc" } -near-light-clientx = { path = "circuits/plonky2x" } -test-utils = { path = "crates/test-utils" } +near-light-client-primitives = { path = "crates/primitives" } +near-light-client-protocol = { path = "crates/protocol" } +near-light-client-rpc = { path = "crates/rpc" } + +near-light-clientx = { path = "nearx" } +test-utils = { path = "crates/test-utils" } + +[patch.crates-io] +alloy-core = { git = "https://github.com/alloy-rs/core", rev = "907d61a45a9135e979310990744080eef5f03fe5" } +alloy-dyn-abi = { git = "https://github.com/alloy-rs/core", rev = "907d61a45a9135e979310990744080eef5f03fe5" } +alloy-json-abi = { git = "https://github.com/alloy-rs/core", rev = "907d61a45a9135e979310990744080eef5f03fe5" } +alloy-primitives = { git = "https://github.com/alloy-rs/core", rev = "907d61a45a9135e979310990744080eef5f03fe5" } +alloy-sol-macro = { git = "https://github.com/alloy-rs/core", rev = "907d61a45a9135e979310990744080eef5f03fe5" } +alloy-sol-types = { git = "https://github.com/alloy-rs/core", rev = "907d61a45a9135e979310990744080eef5f03fe5" } +syn-solidity = { git = "https://github.com/alloy-rs/core", rev = "907d61a45a9135e979310990744080eef5f03fe5" } [patch."https://github.com/succinctlabs/starkyx.git"] starkyx = { git = "https://github.com/dndll/starkyx.git" } diff --git a/Dockerfile b/Dockerfile.offchain similarity index 100% rename from Dockerfile rename to Dockerfile.offchain diff --git a/Dockerfile.operator b/Dockerfile.operator new file mode 100644 index 00000000..e39849c6 --- /dev/null +++ b/Dockerfile.operator @@ -0,0 +1,40 @@ +FROM --platform=$BUILDPLATFORM rust:1.72.0-bookworm as build +ARG TARGETARCH + +WORKDIR /near + +COPY rust-toolchain.toml ./rust-toolchain.toml +COPY Cargo.toml Cargo.lock ./ +COPY nearx/contract near/contract + +RUN rustup show +RUN apt-get update && apt-get install -y \ + git \ + jq \ + make \ + bash \ + openssl \ + libssl-dev \ + protobuf-compiler \ + pkg-config \ + cbindgen + +RUN cargo new --bin bin/dummy +RUN cargo new --lib crates/dummylib +RUN cargo new --lib nearx +RUN cargo build --release --bin dummy --config net.git-fetch-with-cli=true + +COPY ./ ./ +RUN cargo build --release --bin nearx-operator --config net.git-fetch-with-cli=true +RUN ldd target/release/nearx-operator +RUN cp target/release/nearx-operator /near/near-light-client + +FROM debian:bookworm-slim +RUN apt-get update && apt-get install -y openssl libssl-dev pkg-config ca-certificates && rm -rf /var/lib/apt/lists/* +COPY --from=build /near/target/release/nearx-operator /usr/local/bin +COPY --from=build /near/config.toml /var/near-light-client/config.toml + +ENV NEAR_LIGHT_CLIENT_DIR=/var/near-light-client +ENV NEAR_LIGHT_CLIENT_CONFIG_FILE=/var/near-light-client/config.toml + +ENTRYPOINT ["/usr/local/bin/nearx-operator"] diff --git a/Makefile b/Makefile index ea6af160..542355ba 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,12 @@ .EXPORT_ALL_VARIABLES: -include .env -TAG_PREFIX?=near -IMAGE_TAG?=0.0.3 +TAG_PREFIX?=us-docker.pkg.dev/pagoda-solutions-dev/rollup-data-availability/ +IMAGE_TAG?=dev docker: - DOCKER_BUILDKIT=1 docker build --progress=plain -t $(TAG_PREFIX)/light-client:$(IMAGE_TAG) . + DOCKER_BUILDKIT=1 docker build --progress=plain -t $(TAG_PREFIX)/light-client:$(IMAGE_TAG) -f Dockerfile.offchain . + docker build -t $(TAG_PREFIX)/nearx-operator:$(IMAGE_TAG) -f Dockerfile.operator . test: cargo test --workspace diff --git a/api/NEAR Light Client/.env.sample b/api/NEAR Light Client/.env.sample deleted file mode 100644 index 53a8be52..00000000 --- a/api/NEAR Light Client/.env.sample +++ /dev/null @@ -1,2 +0,0 @@ -# Succinct -SUCCINCT_API_KEY= diff --git a/api/NEAR Light Client/bruno.json b/api/NEAR Light Client/bruno.json deleted file mode 100644 index 62b6681c..00000000 --- a/api/NEAR Light Client/bruno.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "1", - "name": "NEAR Light Client", - "type": "collection" -} \ No newline at end of file diff --git a/api/NEAR Light Client/environments/testnet.bru b/api/NEAR Light Client/environments/testnet.bru deleted file mode 100644 index a711c9f6..00000000 --- a/api/NEAR Light Client/environments/testnet.bru +++ /dev/null @@ -1,8 +0,0 @@ -vars { - succintBaseUrl: https://alpha.succinct.xyz/api - nearBaseUrl: https://archival-rpc.testnet.near.org - lightClientBaseUrl: http://0.0.0.0:3030 -} -vars:secret [ - succintAuthToken -] diff --git a/api/README.md b/api/README.md new file mode 100644 index 00000000..9fd7d910 --- /dev/null +++ b/api/README.md @@ -0,0 +1,13 @@ + +TODO: +let token = bru.setEnvVar("access_token", data.token); + +Redeploying dev: +- Deploy entrypoints +- Wait for success +- rename old release to tag +- update nane of new releases +- get verifier, deploy with forge script +- send deployment info to succinct /deployment/new +- execute forge script to update functionIds +- send deployment diff --git a/api/NEAR Light Client/Light Client/Header: By epoch.bru b/api/light-client/Header: By epoch.bru similarity index 100% rename from api/NEAR Light Client/Light Client/Header: By epoch.bru rename to api/light-client/Header: By epoch.bru diff --git a/api/NEAR Light Client/Light Client/Header: Head.bru b/api/light-client/Header: Head.bru similarity index 100% rename from api/NEAR Light Client/Light Client/Header: Head.bru rename to api/light-client/Header: Head.bru diff --git a/api/NEAR Light Client/Light Client/Proof (Receipt).bru b/api/light-client/Proof (Receipt).bru similarity index 100% rename from api/NEAR Light Client/Light Client/Proof (Receipt).bru rename to api/light-client/Proof (Receipt).bru diff --git a/api/NEAR Light Client/Light Client/Proof (Transaction).bru b/api/light-client/Proof (Transaction).bru similarity index 100% rename from api/NEAR Light Client/Light Client/Proof (Transaction).bru rename to api/light-client/Proof (Transaction).bru diff --git a/api/NEAR Light Client/Light Client/Proof[Experimental]: Receipt.bru b/api/light-client/Proof[Experimental]: Receipt.bru similarity index 100% rename from api/NEAR Light Client/Light Client/Proof[Experimental]: Receipt.bru rename to api/light-client/Proof[Experimental]: Receipt.bru diff --git a/api/NEAR Light Client/Light Client/Verify[Experimental].bru b/api/light-client/Verify[Experimental].bru similarity index 100% rename from api/NEAR Light Client/Light Client/Verify[Experimental].bru rename to api/light-client/Verify[Experimental].bru diff --git a/api/light-client/operator/push.bru b/api/light-client/operator/push.bru new file mode 100644 index 00000000..5d622211 --- /dev/null +++ b/api/light-client/operator/push.bru @@ -0,0 +1,818 @@ +meta { + name: Req proof (push) + type: http + seq: 3 +} + +post { + url: {{lightClientBaseUrl}} + body: json + auth: none +} + +body:json { + { + "jsonrpc": "2.0", + "id": "dontcare", + "method": "prove", + "params": { + "ids": [ + { + "type": "transaction", + "transaction_hash": "AUE2x5y4s8sZDRfaTMznW2Kx9uTgicQG9fzebvBgqq9", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "Bcj5ipQD9e4dw2rZYEKq9UEcXWRaaCJswziFT6EDMSdq", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "3UzHjFP8hVR2P6JJHwWchhcXPUV3vuPCDhtdWK7JmTy9", + "receiver_id": "zavodil.testnet" + }, + { + "type": "receipt", + "receipt_id": "hQ4NQefXahZR8LcsTKWQPKi81zCFKfCJsyMewoxmg9F", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "9cVuYLKYF26QevZ315RLb9ArU3gbcgPc4LDRJfZQyZHo", + "receiver_id": "priceoracle.testnet" + }, + { + "type": "receipt", + "receipt_id": "4JkyYYCCFjbMpbLmRWYHEEXkpKeV6AzVfhJck7rGKudn", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "9Zp41hsK5NEfkjiv3PhtqpgbRiHqsvpFcwe6CHrQ2kh2", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "3z2zqitrXNYQs19z5tK5a4bZSxdx7baqzGFUyGAkW9Mz", + "sender_id": "zavodil.testnet" + }, + { + "type": "transaction", + "transaction_hash": "6qTggNtcCeks9pscLxmFHSzDe6bnfy4sX8WBQj6MYU3X", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "3gSQ6tZE7M5tkRSoNbMERTRR45QErXiAGEYjodzWcGTL", + "receiver_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "8N91Gtum3vSHSe66f1atCPAztTi2y3zXUNFZYf7qXoE8", + "receiver_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "9ZuwWLYnYUGvTeMMBU5KubP4xMGbfMJ8gt3r1AeRHus2", + "receiver_id": "operator_manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "CjaBC9EJE2eYg1vAy6sjJWpzgAroMv7tbFkhyz5Nhk3h", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "yZmQCtrnz7CauPqAjYVFNLokzgWm8QrdP7mNm6Y1nBU", + "receiver_id": "asset-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "26YmnfTUCCL77VxjARA8jnCzupTAQnD7JQLvGDhEA4h8", + "receiver_id": "asset-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "BgPrJhYfC6gNh4pYMQ3BnPWPMgBDphLH3H8RNnW27tAc", + "receiver_id": "asset-manager.orderly.testnet" + }, + { + "type": "transaction", + "transaction_hash": "3V1qYGZe9NBc4EQjg5RzM5CrDiRgxqbQsYaRvMTyU4UR", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "4VvKfzUzQVA6zNSSG1CZRbiTe4QRz5rwAzcZadKi1EST", + "sender_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "transaction", + "transaction_hash": "FTLQF8KxwThbfriNk8jNHJsmNk9mteXwQ71Q6hc7JLbg", + "sender_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "transaction", + "transaction_hash": "4VqSnHtFPGsgRJ7f4iz75bibCfbEiqYjnyEdentUyvbr", + "sender_id": "operator_manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "57hyHzGLxcYGgDyqeGPTVN6J8Gms4CVsjqFsySA1B9qc", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "AR78eh3QNfyyyy4UV2a9bax9zkudrP9zphCa9nDyeBcv", + "receiver_id": "ykaju2a8jcfg.users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "3sPxpYGTXYfNT6FvsrwUi9M8MMcuoahpAs3powS29XJH", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "7twejH9ZMD4t4zdLtJqANKhG37bckia8RLX5494Fw1SM", + "receiver_id": "relay.aurora" + }, + { + "type": "receipt", + "receipt_id": "DgRM8CNGkMokkhqcYFLUL39AcQ89a3AsNQrs4DynVohm", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "transaction", + "transaction_hash": "CQno9p4ea2A8TyYddGRJTr7Xh9ZSq6uP123QqR2r9nM1", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "AAoyzc41aoKjua4k9fJLEA5nGXFa9LMWWHtGKanJzscj", + "receiver_id": "aurora" + }, + { + "type": "transaction", + "transaction_hash": "FcQx6PWhDpHLyQJWd4HhfZ2xrkUcBfa3h57zsEtxwV4g", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "transaction", + "transaction_hash": "DsjV3URFPGbVcFbWrpR9zT5BrrhzAZFG4n2qh8zSe7jX", + "sender_id": "relay.aurora" + }, + { + "type": "receipt", + "receipt_id": "E3uAZcoK3z2Vwmngg7epGy6LyHMvC5fJQDHjwwjgb5E5", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "B4LoLw8na3PEtzo1ngh7iXcpWUR4Kv2SbwERrtRxCHip", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "7Pk6Lov1rqkYeAJgnT82EySuokoVPyN8w4aMEQdPVudr", + "receiver_id": "oracle-2.testnet" + }, + { + "type": "receipt", + "receipt_id": "3xxbDeKJQS6EmbtTELWuUJ3Zou4LTF27LzZbcLXCEHbU", + "receiver_id": "priceoracle.testnet" + }, + { + "type": "transaction", + "transaction_hash": "9AvZKNAmK94x8hqwcshNDmmRu3dMUQv7eNZXR2WuE6nt", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "FsdqZDxLcaSWoopSCAXPpNUkA4nr1kUkuzxBukkNqTv2", + "sender_id": "oracle-2.testnet" + }, + { + "type": "receipt", + "receipt_id": "dBsQDEoSDijFTtZPdYHEkGUB5sWZg1XAvbRhxa8Jmpi", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "E4kHaTr5DroFkKXJUrzfXKtPRjyR68YAqGyb3dSnKGuD", + "receiver_id": "lwjdvlvzfo79.users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "5FJCmPzb9Kfxesf1kbNnoJ3ZxbPQ4yj4EZhbsKjcCoqr", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "CokutTqGaabTnrKSi13bAUzeECdwByMRnj99BwRG7fRu", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "transaction", + "transaction_hash": "BvnUudsAkCaKvVvJ74prZFXds8PdpE925p8xZmRjYJ2C", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "GikmFvGMVn2UeJEcnDjN3BMEL5YmgCUypQDMBXLvW5g9", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "5ypE9P9j9ASjmunm6kSLrTtuJ5HByR6Hf3cCKrqffRS4", + "receiver_id": "operator_manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "68yQ89pQowx5DKFgNpgL4zcwrKgEaN96xGXmZZ8jBMzL", + "receiver_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "EfAZduDmKxNoMSYDqHEpD2nuBXJhyaCyeWtDhRnri9d1", + "receiver_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "8mUxUveBaHz7fi3ZS9kN1Ss6fkeBqvuR1pSeYWdunMXS", + "receiver_id": "asset-manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "AYUaHUAxBUYKt1ThDttNatx7XV5FKH9bFMWmmrhWWU7y", + "receiver_id": "asset-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "BxkNFzGUUBafcn8PY9X4vgDT9KgZNhUkbU7dsCXd7hNz", + "receiver_id": "asset-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "5gg7aEBjbuKKvYogcbLRjB69AXfDXkGeSsd3P1qMhB77", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "2awfPH5inWJgnDKToFrbm516MofkvJG5A1NR8b3ky65p", + "sender_id": "operator_manager.orderly.testnet" + }, + { + "type": "transaction", + "transaction_hash": "8WC45pj89X8RXaSXV13yKh3gmpVMaChBDskxYBisFg8g", + "sender_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "transaction", + "transaction_hash": "EQqdHTCe4ZYc6NKGeCbE89SV9Ft86wWpVyXVjACM38UP", + "sender_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "GCaGAJ9yBJtg3RJxafAwT8M7jQgUcWcADg1ujHEii194", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "4jEzH53nTjHjWDu8BiJaFQZPBP3T57XM5q971vQjB8kN", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "DcvY1wVUk5YsTL1s6G4K74gEACyrpeXAW8XUC11yib35", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "3Z6Ki6NtKAPqYjGbkUTnNQ4fc7bPPDVFvcvfoM5CsvnC", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "EMpoVsh6yt2xYghBDVC8HscXzUeWHJrZEwW1Kk6MXydq", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "E47awk7rt6vrFewuYdDM2N6qN6TbFKKm3jZbQUHb53fb", + "receiver_id": "73uvy8y6kxr8.users.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "HwhMdANKVFq6dPLuADeS5KZ67Rde2gUutZ8S2gXuL72Y", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "transaction", + "transaction_hash": "5eX8FWckCEiaRL19BbFHM1N9TbzdFZZWj1mN7dXr6ogv", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "C7NiDYZbbuQLGDnvB62tadnb8kWguYVVEWqaB1QStjba", + "receiver_id": "oracle-2.testnet" + }, + { + "type": "receipt", + "receipt_id": "Cgm82SB7JNWPTDh5dbyzFLvE7kvp3A87Aqz5RqeXT71g", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "86bhXNvcUjTz1dLVdNLWBxo1A6AUBso5wSHuordGHCxR", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "6WRoqR8Zq87YSEop8xsBG7QyRxGJ4dH3w95v1NcQvyDm", + "receiver_id": "priceoracle.testnet" + }, + { + "type": "transaction", + "transaction_hash": "D2jCP5FAYbuAjyMWV1Fv3HqgDMKCdeAQMC98aWZN8TGr", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "FfDx9vhagyqLCxRBoxa6ZXqVgczhHaPuRpBY61ktpM19", + "sender_id": "oracle-2.testnet" + }, + { + "type": "receipt", + "receipt_id": "DheV2jZJEuq9RSAopQuDXgFsfwB5BsKE3yV18jCfVjbM", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "53vz1by3LYYKzDZcJskcUm7Smv297wWFKPSvwD7pLJPd", + "receiver_id": "dtazz1s6wte2.users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "Hcy5vxQWYvGdrmevVaz6248Tg1k3QZtHQu1hUUsvoxkD", + "receiver_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "7MbcKn6ajP7EC34tEFj575rZBwDLPmJqQ5eDySkPeKAx", + "receiver_id": "operator_manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "DYuZi3qLKAEGWFKBMCp2xA5HyH8oS6EWuzzeQuxQEXda", + "receiver_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "transaction", + "transaction_hash": "AZ18KJ6W3nJ1JScJVdAxm8j4cqHnc4XTGFpSCitQadTf", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "AsZ8b8QYtK5Fs8XUDEmEx1A2at9bWr8r1aS8VnLcEtd3", + "receiver_id": "asset-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "CAvm9Arji4Kpdvcp9xk9qc9p83i2P2CfRMm9jyo2DFfi", + "receiver_id": "asset-manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "7jrdAT6NRQjDnpDu8QmUAbZ6oyLjEgMwzPLZsXpRPQVC", + "receiver_id": "asset-manager.orderly-dev.testnet" + }, + { + "type": "transaction", + "transaction_hash": "DR4FE9zXS1cQaAGU7f7y78p9yn4akVQHFEskSH2PD3Vh", + "sender_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "transaction", + "transaction_hash": "HcsL2SBdF8LtjJsFos6NkqpueMn1s1toYD77SdB5szy4", + "sender_id": "operator_manager.orderly.testnet" + }, + { + "type": "transaction", + "transaction_hash": "9LXG1JNhvuPfdo9fGZvBacxXe9NAASSPZmsW4mpCn1f4", + "sender_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "C9TSpXgbu7YRJ5Jm1dMuj8KfMLH7eJHxk2jENteGJzCP", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "9RBAJxHTEeE5v9QQAeZANNq9ydTTc87jvuGyrtCdo63P", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "AkmPwHhqviQSNv3Ee1TGFg4EuHK62fPMyTrykJXfJGom", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "transaction", + "transaction_hash": "GMDVAQhmhe9TEhpsY74FgJeL5QU1aMwqQz54BsSQ885T", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "FnLggXc5oiEjiEgeQYQV6BQsYKnPtramMMMiU2ZedANe", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "8gpNzBHQBH9ZWrw7cA8BAqw5ZRyNWbg1pDPoK8U6JTud", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "GGRLsLh79FFtCDfDMSwt15k2DTiho39WXRPqMd4SANRK", + "receiver_id": "zavodil.testnet" + }, + { + "type": "transaction", + "transaction_hash": "6eqiiQjc2N5HGMbQMzwuBtniQFtpWhetc1aq3yEuWJsA", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "F6R3jvNT91MnjQwYEJ53kzak2EN49UPd1EHBWB9vi9Vo", + "receiver_id": "12fbh1glcgat.users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "8s2tqX1x8TJqS7enoMU1gsxp4hPExUkc8zg7nND4Pfj1", + "receiver_id": "priceoracle.testnet" + }, + { + "type": "transaction", + "transaction_hash": "9qjjnRnuiJhgFAZonH9zfVcw7P437DdMMsa3aXQxqkRA", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "DF7N8Add65ksvhLofgN9W898jK7DWxhZhe6F51HLohBg", + "sender_id": "zavodil.testnet" + }, + { + "type": "receipt", + "receipt_id": "nYio38Xrm5wY8WmJSdQ9tEo9Re7wSF2A8mT8rRSxFa6", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "BYBGZKDmuUwaFs5c26i4UXM3Kv2KYZFQkb92J3YHrCoV", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "4H2tHD5PQ4NxFiJRZq7jos5Df4jQgM5ig2jaX1NQMTrY", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "FB4bRfgozXaHu44zTCgq12FUoZbJt1Vv96KQGbzjTJJz", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "transaction", + "transaction_hash": "CvozzbMChCeAKg6jm7UgJuqrA8KkpWPsL5mcnbLcbiqk", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "GoRr9hrxMarjxNAcwwREeRbSBT1RYstPeNQaVajJurff", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "27dU68Bf5EVKv931qQGzpAEuKFrXYcrdKg11jdwRin6S", + "receiver_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "4sZCtWBxQUFXR1YtYhFn7Fn786fNtGMhqfbPw2wEr5Wg", + "receiver_id": "operator_manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "uUomhhuxwhUkrj6dCddfHdbbY1paygejSAeJyuwkBZH", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "GHe3crwmPJZ4fU9yQieVKsS5BYLbrAMbxgPbvpaTmqFt", + "receiver_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "97x4tdZRgSWHsDFAfZbNFyHzAWRBoNmaBum4Uw92m1bL", + "receiver_id": "asset-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "5dYTWJ4sUsQXgNYbZLYnFJYEBGnxFxfrcNzhZcouWT5j", + "receiver_id": "asset-manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "GccuQBBSBtknXJyWwXuNdgiGi4QGvYeyKhPvcuwR2Xii", + "receiver_id": "68frdria49vm.users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "GjDGzTvKHX3syTJXNwV53Vx7FYnUkPojrfcaN9Q6DpYx", + "receiver_id": "asset-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "AU5NoxAG5a8GKxWSNncH915uDaCUSQnVRNrZnQ6vwia3", + "receiver_id": "s-lam1.testnet" + }, + { + "type": "receipt", + "receipt_id": "3cWJrJmaewhX93UnduHRU2M8sW8F8qwEoD1xJsBTaJSs", + "receiver_id": "price-oracle-v1.nearlend-official.testnet" + }, + { + "type": "transaction", + "transaction_hash": "8N8K3idQm4yFT6jn9wwTh7jTj9XiG564T6T67yqyVWqe", + "sender_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "transaction", + "transaction_hash": "9sc3pjhPHAsGJnH9ui68kht4bhNCzBPgYatpR79Cspm5", + "sender_id": "operator_manager.orderly.testnet" + }, + { + "type": "transaction", + "transaction_hash": "9FCCaaeYwSHgaYfGquGAWheCHpKwNPfWHnWBi78vFR5F", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "D7mcCM26QXUxvMbPTfmw1jeZRYTLQdBTZDpDXqdYQMEW", + "sender_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "transaction", + "transaction_hash": "AdyN4mXDa5UoLCf9XQTQ7HvQbQ2g24VcATDVGWhy46zq", + "sender_id": "s-lam1.testnet" + }, + { + "type": "receipt", + "receipt_id": "HezCULqMkxpwQkbxSCtuhHac9deHyLPZ6L9D8QMEEFHq", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "DCvFdk3n5cWvD8NVQ7hgBVVrYcKB29A6RewxXPLMwKP", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "8ztnGoe1e2mVN6giAzhopE27CUBbJKHzictagWFv6eUf", + "receiver_id": "relay.aurora" + }, + { + "type": "receipt", + "receipt_id": "4KHMyieDVBVgw7H4jB7GFsgc5WVkkkkcuWjHUWhoxQ9m", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "8MVX9Yjj3uzUZXYvL2VCfyrGASbij6ghR2zQMpDtf1s7", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "AAVFCoFRqVdjurTEGMZL4jSp2oZtFqtTcAGb31KNxtyk", + "receiver_id": "testnet" + }, + { + "type": "receipt", + "receipt_id": "Eo5fKR6YaSBzKW9vJUtVADEmoiAqqCSVutVYpvNm27Ry", + "receiver_id": "testnet" + }, + { + "type": "receipt", + "receipt_id": "9Dv2dZx3Fe6RffSRN8eTML6Ad4NwwWMbMVDbUMrXoF5W", + "receiver_id": "aurora" + }, + { + "type": "transaction", + "transaction_hash": "HM18RA6nrZYjdXz8q4HbWaqxteae64K5WoXv1rnfe2Uf", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "CQNbeL8ggXuZhKHEDzsi3rNi26Tza8eHFXCY3M46U1JW", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "8TGttUnnyfpVvxjjqXjy8vkKwb8uNwBkwgpnXizVaco3", + "receiver_id": "dev-1705307954732-23212261612584" + }, + { + "type": "receipt", + "receipt_id": "F69bauLbRkLHU5z8Rpwtj5oRyqiFr4XLhKKt5JMaB3b8", + "receiver_id": "dev-1705307954716-26005621820061" + }, + { + "type": "transaction", + "transaction_hash": "CqVVswF3dEMQ8uJciL2RC19txKwsKm1CiJU1YDNxnJEV", + "sender_id": "relay.aurora" + }, + { + "type": "transaction", + "transaction_hash": "Bkc69B8zVNfwoukDZptpcG76rhgE1ekvp21roCLa3k4b", + "sender_id": "testnet" + }, + { + "type": "transaction", + "transaction_hash": "4LW882GsjTojrXSqLEcLYRD4Dfns2bbTaizpfEWDXeAR", + "sender_id": "testnet" + }, + { + "type": "receipt", + "receipt_id": "8c6ePJ4xvUKB24z9146bjRXdCfX2Rqx7zxYPVG127M4K", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "3AqgqHdwYWWwFC3qWU443bDNS3vxRSTdj6dMUpzxvKoi", + "receiver_id": "vvtjqhhfnrl2.users.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "4zzAH9GA3LfzcKuH5eRzM7ywF8PLADuCsFNb6fva6f42", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "HdxzgzSZJjcBxYpWNMK6UpdEpoTKzpr4SrEvWVtdF97s", + "receiver_id": "testnet" + }, + { + "type": "receipt", + "receipt_id": "J4wZi1ydzgjhuJgwL6UYTN5TkHYha9S8zRoGvoCNft6w", + "receiver_id": "testnet" + }, + { + "type": "receipt", + "receipt_id": "ECiFmZbnGkp58AknPRNJdZM7VjQ6NxRRsFsJ2Q1pJDzy", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "7RuTSrDAZhAkXLqxYKoPqZv9mHKvWJdT4BxAtq6SKVEq", + "receiver_id": "dev-1705307951157-46295630099921" + }, + { + "type": "receipt", + "receipt_id": "84Tscq1mQuNq6rtp1YVcBGwZcv7nnmFY58ekQ5ZpN2xj", + "receiver_id": "dev-1705307951144-39784510361521" + }, + { + "type": "receipt", + "receipt_id": "699GLHexZMhH7HKdkNBQMktTMDr3AvdHpb5Pdu8CeLkC", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "acAXEvqvNxYbJXDa34ApA8XHdXFtdZLUmDWz7s6cvM9", + "receiver_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "7z5Zc7jojgmPz8HkF1KkNDSAy2FTMtXbhwTwGhfxjBw4", + "sender_id": "testnet" + }, + { + "type": "transaction", + "transaction_hash": "64ViGfWopTMWyTgdDqvZU5wigx6m4ysfQFAeH8bKP8JX", + "sender_id": "testnet" + }, + { + "type": "transaction", + "transaction_hash": "HDXxhUfEnooUb3B4Earft18ibBvWdTs3Bk9SDKv6Nd9W", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "G9i4dZgzDZzgBrgBEtooLm9cVVBJGfaqBtjFm4cdnVPa", + "receiver_id": "operator_manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "AjhoYqQrYhq6mAz1LP47YLxfssDCK9V1jZ3gKDMMAM9B", + "receiver_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "receipt", + "receipt_id": "GVHMrJZY6VGaKhY5Ay2uihGHK5wtjB4qBBdrRsXLaFLr", + "receiver_id": "wallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "4rGJ7mSkt8V4tgYHjoNLc3s4BxaqkQTszxrftDtJLFAQ", + "receiver_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "2iTTQdUQCwGDCVVYWKdCxrznMgP2tHnpjsnq27SVxJte", + "receiver_id": "asset-manager.orderly.testnet" + }, + { + "type": "receipt", + "receipt_id": "A4nZmcuzmchT1QDiWs8yeBZ134bovwBWibuFScFork7f", + "receiver_id": "asset-manager.orderly-qa.testnet" + }, + { + "type": "transaction", + "transaction_hash": "D9aMyFpgBQk1CpPTrhEqgdKEAcPF3NexeWBXmf8d4B2c", + "sender_id": "hotwallet.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "Gfgs99YvvGae9q6z5WDMpdhVkAHmwFjZ7yk8p7Jsbit", + "receiver_id": "asset-manager.orderly-dev.testnet" + }, + { + "type": "transaction", + "transaction_hash": "GSiDVPdWYQFJ8WrJrXbQa7az7qAFzfR4WYK2snNDxWJv", + "sender_id": "operator_manager.orderly.testnet" + }, + { + "type": "transaction", + "transaction_hash": "qnLPZdSybWhkUQEwG8vHGtFMcHuKtUoWX2oHYnxVfCC", + "sender_id": "operator-manager.orderly-qa.testnet" + }, + { + "type": "transaction", + "transaction_hash": "Gqn6vq2QNL8NbhgW9sDKgbCij2TwUTtuGDWr9gybfsbk", + "sender_id": "operator-manager.orderly-dev.testnet" + }, + { + "type": "receipt", + "receipt_id": "4X8euaFjsFZP98A1bCfkgDMFashgtSxHns4mU1ReZWPY", + "receiver_id": "users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "AcAenoXYdKTu3AvLGScBnXsPG4vedWs1hcysRnksB1RB", + "receiver_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "E4sgW7Ucyjp9YHFiJZTdoGtUAvdGAFYSNKCht1BJijN9", + "receiver_id": "y1rifte3q9bd.users.dev-kaiching.testnet" + }, + { + "type": "receipt", + "receipt_id": "BZekNMxiCSkanDBWc1ayTE67uFra3gsXvvA8ZNeyaNS8", + "receiver_id": "v2_1.perp.spin-fi.testnet" + }, + { + "type": "transaction", + "transaction_hash": "68QsmAVyaVft3WWJ8FhitTuVGosnQL5MJMNZD4SNpN4f", + "sender_id": "users.dev-kaiching.testnet" + }, + { + "type": "transaction", + "transaction_hash": "8grJwgNZjCX2358axxFnCMr8T9mvK9choDYtcG5juBWc", + "sender_id": "perp.spin-fi.testnet" + }, + { + "type": "receipt", + "receipt_id": "BX4d2vHY1EYVAAkBQhHsJZQbumaaDHjBTejGNiYwMaZV", + "receiver_id": "testnet" + }, + { + "type": "receipt", + "receipt_id": "2Fzou4H3regnvi3BmwhxzuebvqGscqrJXNouqrLLiNYJ", + "receiver_id": "testnet" + }, + { + "type": "receipt", + "receipt_id": "3anHYE6zuA7J9Tid2U3WosdSUaZkDMNUozg5qvh1oMNr", + "receiver_id": "dev-1705307935659-11845443462054" + }, + { + "type": "receipt", + "receipt_id": "C5bdGmjQY7GqmwwJf9yUZMZ6CkSDFmYHSNEGQCGskByc", + "receiver_id": "dev-1705307935640-33745202086023" + } + ] + } + } +} diff --git a/api/light-client/operator/sync.bru b/api/light-client/operator/sync.bru new file mode 100644 index 00000000..03738c08 --- /dev/null +++ b/api/light-client/operator/sync.bru @@ -0,0 +1,25 @@ +meta { + name: Req proof (sync) + type: http + seq: 1 +} + +post { + url: {{operatorBaseUrl}} + body: json + auth: none +} + +body:json { + { + "jsonrpc": "2.0", + "id": "dontcare", + "method": "sync", + "params": { + } + } +} + +assert { + res.status: eq 200 +} diff --git a/api/light-client/operator/verify.bru b/api/light-client/operator/verify.bru new file mode 100644 index 00000000..734ce051 --- /dev/null +++ b/api/light-client/operator/verify.bru @@ -0,0 +1,22 @@ +meta { + name: Req proof (verify) + type: http + seq: 2 +} + +post { + url: {{lightClientBaseUrl}} + body: json + auth: none +} + +body:json { + { + "jsonrpc": "2.0", + "id": "dontcare", + "method": "verify", + "params": { + "ids": [] + } + } +} diff --git a/api/NEAR Light Client/Light Client/Raw/Get Block.bru b/api/light-client/raw/Get Block.bru similarity index 100% rename from api/NEAR Light Client/Light Client/Raw/Get Block.bru rename to api/light-client/raw/Get Block.bru diff --git a/api/NEAR Light Client/Light Client/Raw/Get Chunk.bru b/api/light-client/raw/Get Chunk.bru similarity index 100% rename from api/NEAR Light Client/Light Client/Raw/Get Chunk.bru rename to api/light-client/raw/Get Chunk.bru diff --git a/api/NEAR Light Client/Light Client/Raw/Get Transaction.bru b/api/light-client/raw/Get Transaction.bru similarity index 100% rename from api/NEAR Light Client/Light Client/Raw/Get Transaction.bru rename to api/light-client/raw/Get Transaction.bru diff --git a/api/NEAR Light Client/Light Client/Raw/Light Client Proof (Receipt).bru b/api/light-client/raw/Light Client Proof (Receipt).bru similarity index 100% rename from api/NEAR Light Client/Light Client/Raw/Light Client Proof (Receipt).bru rename to api/light-client/raw/Light Client Proof (Receipt).bru diff --git a/api/NEAR Light Client/Light Client/Raw/Light Client Proof (Transaction).bru b/api/light-client/raw/Light Client Proof (Transaction).bru similarity index 100% rename from api/NEAR Light Client/Light Client/Raw/Light Client Proof (Transaction).bru rename to api/light-client/raw/Light Client Proof (Transaction).bru diff --git a/api/NEAR Light Client/Light Client/Raw/Next Light Client Block.bru b/api/light-client/raw/Next Light Client Block.bru similarity index 100% rename from api/NEAR Light Client/Light Client/Raw/Next Light Client Block.bru rename to api/light-client/raw/Next Light Client Block.bru diff --git a/api/light-client/raw/Protocol config.bru b/api/light-client/raw/Protocol config.bru new file mode 100644 index 00000000..df8064b6 --- /dev/null +++ b/api/light-client/raw/Protocol config.bru @@ -0,0 +1,26 @@ +meta { + name: Protocol config + type: http + seq: 7 +} + +post { + url: {{nearBaseUrl}} + body: json + auth: none +} + +body:json { + { + "jsonrpc": "2.0", + "id": "dontcare", + "method": "EXPERIMENTAL_protocol_config", + "params": { + "block_id": "{{id}}" + } + } +} + +vars:pre-request { + id: 8S5rDw9i5mtbxVFG8BvwukqBLbSvHLeUepQ5Hu4vT5f9 +} diff --git a/api/NEAR Light Client/Succinct/Get Deployments.bru b/api/succinct/Get Deployments.bru similarity index 53% rename from api/NEAR Light Client/Succinct/Get Deployments.bru rename to api/succinct/Get Deployments.bru index f1825262..591638e5 100644 --- a/api/NEAR Light Client/Succinct/Get Deployments.bru +++ b/api/succinct/Get Deployments.bru @@ -1,11 +1,11 @@ meta { name: Get Deployments type: http - seq: 5 + seq: 8 } get { - url: {{succintBaseUrl}}/deployments/near/near-light-client + url: {{succinctBaseUrl}}/deployments/near/near-light-client body: none auth: none } diff --git a/api/succinct/Get proof status.bru b/api/succinct/Get proof status.bru new file mode 100644 index 00000000..5e4d27b2 --- /dev/null +++ b/api/succinct/Get proof status.bru @@ -0,0 +1,19 @@ +meta { + name: Get proof status + type: http + seq: 4 +} + +get { + url: {{succinctBaseUrl}}/proof/{{proof_id}} + body: json +} + + +vars:pre-request { + proof_id: e112ffa6-d2ee-4263-ac93-a31b94277882 +} + +vars:post-response { + status: res.body.status +} diff --git a/api/succinct/Get proofs.bru b/api/succinct/Get proofs.bru new file mode 100644 index 00000000..2460a07e --- /dev/null +++ b/api/succinct/Get proofs.bru @@ -0,0 +1,50 @@ +meta { + name: Get proofs + type: http + seq: 9 +} + +get { + url: {{succinctBaseUrl}}/proofs?project=near/near-light-client + body: json + auth: bearer +} + +query { + project: near/near-light-client +} + +auth:bearer { + token: {{succinctAuthToken}} +} + +body:json { + [ + { + "type": "req_bytes", + "releaseId": "{{sync_release_id}}", + "parentId": null, + "files": null, + "data": { + "input": "{{trusted_header_hash}}" + } + }, + { + "type": "req_bytes", + "releaseId": "{{verify_release_id}}", + "parentId": null, + "files": null, + "data": { + "input": "{{trusted_header_hash}}009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0024e2d4f8d3394fabea1a8ac255ec3ef9c6e14cc90e8e45c1d185f9a858d484107a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000a594de1c36eca52f15d9f7d4177515570f3a6966e5ac51da1ce4abb7e496c6a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00311fa837e07749c47b2825d06dd14d3aa6f438e2e1cc69857b737d0104ac080576325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f454878ba125cc5f380439ee3c3e6510e8d66e7adcb70e59951bcf51c2916d5686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0156b47c3c713180318844195b0e0e29810c5f099fe19411eaf116d55b3f6d1f96706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0027d1be4cbf7826333bb3a66339314d6b23088907bc03abe8e1f0402f6b8e99fb6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d6c0e7346e597949cf4ef07e57b029426cac6d2a0e80761b07aaa83e5622fe16f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f4bf0c2de11327648a0b56a170029f349308fc88d64badffaf4b1575a0444056f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ae58764b2108d1e23de28591a61e52e6fdeb49f0985ab6bf5f332e338db742f877616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000e7d92ca3c2fbd087783533f3e3c493881189b9e95829763ee2222d5ef50524361737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0010478412784e05112c2ab987ce3d691a1f8d284f5e80d71d573229b6d643563b61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009eac5b84d08bbf7716b595fc0d10686ead30355e5b7a8c9305ac02240823513961737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0124e495308164a0a97925a27e59fadec0c6fc59de23c5ffaef3ff30a2c513d51a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133fb9d5f75d87a3cf8eca81ad16c669a686aac61fc514a6cf1159e739618c2e86f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d6c2a78d92595947756cc38ad2fb077984f691ebbba0d1db03c2cbed071d16ef6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133f6198c994c4ca12b360abc226c232f1dd46bef6c5be02c39278b8de8ea04696f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003d268ee173d6cbe5f0c0efa3833fe6590950938cb7b24b15957587fd0380729375736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008be60e1ba421b4c0cf104749bd2f322f6d985763053b347bf68c6000908aa693796b616a753261386a6366672e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002aa060c38662a90fa07a34b800cd3c84360d894dc4bec1c81a7b41d3eb282092706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006674894d631ca3e373a87b27ea614f16468fa9ddaf401f079d93359f14f29f6e72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bc656c82f3aed97695b555e49b55e584f960197f092a53ac9bcc3f872125436476325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a988b23956e4e5ab00dd3d16decdd0714554562ae9fbfae9053acca1a91f37cc75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00883c8876a557200a3b14ad46b0646af75750403ab3cb5ff04ef6a72f4f71b7786175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d916068721ec0d451382e00bebd8f4f713321e3bde850c36463517d6c50115c5706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01bf4b51df07bf9819b996b720eadafc5323ec7a2ad7fc0555190771faaa582d3272656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1e6131d4648085ea2f1e23ba516e6d03a05c6448c30639b1b082c8650544506686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00956fff9f472d68ff61b7c3e88b678738f5082e44ca40277cb394501a86d8b42177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005ef99fadc671ee47c6015c92351d2c172995832ac01ecd1e8b8ceae3722ccc296f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + } + ] +} + +vars:pre-request { + proof_id: fb7389cb-84cd-46de-9af8-5ff0e04eefd1 +} + +vars:post-response { + status: res.body.status +} diff --git a/api/NEAR Light Client/Succinct/Get proof status.bru b/api/succinct/Get request status.bru similarity index 99% rename from api/NEAR Light Client/Succinct/Get proof status.bru rename to api/succinct/Get request status.bru index cd626aa6..e45d8cb1 100644 --- a/api/NEAR Light Client/Succinct/Get proof status.bru +++ b/api/succinct/Get request status.bru @@ -1,17 +1,17 @@ meta { - name: Get proof status + name: Get request status type: http - seq: 4 + seq: 5 } get { - url: {{succintBaseUrl}}/proof/{{proof_id}} + url: {{succinctBaseUrl}}/request/{{proof_id}} body: json auth: bearer } auth:bearer { - token: {{succintAuthToken}} + token: {{succinctAuthToken}} } body:json { @@ -38,7 +38,7 @@ body:json { } vars:pre-request { - proof_id: 6bb1148e-1a2a-477e-a17b-20016cdaa32d + proof_id: b6bea2f1-c070-45fa-b1b6-607b6fbbb37e } vars:post-response { diff --git a/api/succinct/Release Verify.bru b/api/succinct/Release Verify.bru new file mode 100644 index 00000000..14ef0bf9 --- /dev/null +++ b/api/succinct/Release Verify.bru @@ -0,0 +1,46 @@ +meta { + name: Release Verify + type: http + seq: 10 +} + +post { + url: {{succinctBaseUrl}}/release/new + body: json + auth: bearer +} + +headers { + authority: alpha.succinct.xyz + accept: */* + accept-language: en-GB,en;q=0.9 + content-type: text/plain;charset=UTF-8 + origin: https://alpha.succinct.xyz + referer: https://alpha.succinct.xyz/near/near-light-client/releases/new + sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121" + sec-ch-ua-mobile: ?0 + sec-ch-ua-platform: "Linux" + sec-fetch-dest: empty + sec-fetch-mode: cors + sec-fetch-site: same-origin + sec-gpc: 1 + user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 +} + +auth:bearer { + token: {{succinctAuthToken}} +} + +body:json { + { + "org_name": "near", + "project_name": "near-light-client", + "git_ref": "{{gitRef}}", + "entrypoint": "verify", + "env_vars": [] + } +} + +body:text { + {"org_name":"near","project_name":"near-light-client","git_ref":"700edd24ac1666307f3f740e36bf4c5808c26e1b","entrypoint":"verify","env_vars":[]} +} diff --git a/api/succinct/Release: DEL.bru b/api/succinct/Release: DEL.bru new file mode 100644 index 00000000..712b8460 --- /dev/null +++ b/api/succinct/Release: DEL.bru @@ -0,0 +1,37 @@ +meta { + name: Delete release + type: http + seq: 6 +} + +delete { + url: {{succinctBaseUrl}}/release/{{id}} + body: none + auth: bearer +} + +headers { + authority: alpha.succinct.xyz + accept: */* + accept-language: en-GB,en;q=0.9 + cookie: session={{succinctSession}} + origin: https://alpha.succinct.xyz + referer: https://alpha.succinct.xyz/near/near-light-client/releases/11 + sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121" + sec-ch-ua-mobile: ?0 + sec-ch-ua-platform: "Linux" + sec-fetch-dest: empty + sec-fetch-mode: cors + sec-fetch-site: same-origin + sec-gpc: 1 + user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 +} + +auth:bearer { + token: {{succinctAuthToken}} +} + +vars:pre-request { + id: 20b28ab4-b47f-458d-9933-8c7f565f082a + session: {{succinctSession}} +} diff --git a/api/NEAR Light Client/Succinct/Req proof (batch).bru b/api/succinct/Req proof (batch).bru similarity index 99% rename from api/NEAR Light Client/Succinct/Req proof (batch).bru rename to api/succinct/Req proof (batch).bru index f4926c3e..d102676e 100644 --- a/api/NEAR Light Client/Succinct/Req proof (batch).bru +++ b/api/succinct/Req proof (batch).bru @@ -5,13 +5,13 @@ meta { } post { - url: {{succintBaseUrl}}/proof/batch/new + url: {{succinctBaseUrl}}/proof/batch/new body: json auth: bearer } auth:bearer { - token: {{succintAuthToken}} + token: {{succinctAuthToken}} } body:json { diff --git a/api/NEAR Light Client/Succinct/Req proof (sync).bru b/api/succinct/Req proof (sync).bru similarity index 88% rename from api/NEAR Light Client/Succinct/Req proof (sync).bru rename to api/succinct/Req proof (sync).bru index a72f30d9..4c48a3d8 100644 --- a/api/NEAR Light Client/Succinct/Req proof (sync).bru +++ b/api/succinct/Req proof (sync).bru @@ -5,13 +5,13 @@ meta { } post { - url: {{succintBaseUrl}}/proof/new + url: {{succinctBaseUrl}}/proof/new body: json auth: bearer } auth:bearer { - token: {{succintAuthToken}} + token: {{succinctAuthToken}} } body:json { diff --git a/api/NEAR Light Client/Succinct/Req proof (verify).bru b/api/succinct/Req proof (verify).bru similarity index 99% rename from api/NEAR Light Client/Succinct/Req proof (verify).bru rename to api/succinct/Req proof (verify).bru index 33f4f20d..ec208edc 100644 --- a/api/NEAR Light Client/Succinct/Req proof (verify).bru +++ b/api/succinct/Req proof (verify).bru @@ -5,13 +5,13 @@ meta { } post { - url: {{succintBaseUrl}}/proof/batch/new + url: {{succinctBaseUrl}}/proof/batch/new body: json auth: bearer } auth:bearer { - token: {{succintAuthToken}} + token: {{succinctAuthToken}} } body:json { @@ -27,7 +27,7 @@ body:json { } vars:pre-request { - release_id: b837edf9-a25a-4229-aa70-f986d65fd309 + release_id: c35d498e-f283-4b14-a42f-3a35807d3a70 trusted_header_hash: 63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3 } diff --git a/api/succinct/deploy/check.bru b/api/succinct/deploy/check.bru new file mode 100644 index 00000000..fe2ceeb9 --- /dev/null +++ b/api/succinct/deploy/check.bru @@ -0,0 +1,52 @@ +meta { + name: check-release + type: http + seq: 2 +} + +get { + url: {{succinctBaseUrl}}/projects/near/near-light-client/releases/{{release}} + body: text + auth: none +} + +headers { + authority: alpha.succinct.xyz + accept: */* + accept-language: en-GB,en;q=0.9 + origin: https://alpha.succinct.xyz + referer: https://alpha.succinct.xyz/near/near-light-client/releases/new + sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121" + sec-ch-ua-mobile: ?0 + sec-ch-ua-platform: "Linux" + sec-fetch-dest: empty + sec-fetch-mode: cors + sec-fetch-site: same-origin + sec-gpc: 1 + user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 + content-type: text/plain;charset=UTF-8 +} + +vars:pre-request { + release: noop +} + +assert { + res.status: eq 200 + res.body.status: eq "success" +} + +script:pre-request { + let release = bru.getProcessEnv(`CHECK_RELEASE_NUM`) + if (release != null) { + bru.setVar("release", release) + } +} + +script:post-response { + let entrypoint = bru.getProcessEnv("ENTRYPOINT") + if (res.body.status == "success") { + bru.setEnvVar(`${entrypoint}_RELEASE_NUM`, bru.getProcessEnv(`CHECK_RELEASE_NUM`)) + bru.setEnvVar(`${entrypoint}_RELEASE_ID`, bru.getProcessEnv(`CHECK_RELEASE_ID`)) + } +} diff --git a/api/succinct/deploy/new-deployment.bru b/api/succinct/deploy/new-deployment.bru new file mode 100644 index 00000000..685973f8 --- /dev/null +++ b/api/succinct/deploy/new-deployment.bru @@ -0,0 +1,69 @@ +meta { + name: new-deployment + type: http + seq: 1 +} + +post { + url: {{succinctBaseUrl}}/release/new + body: text +} + +headers { + authority: alpha.succinct.xyz + accept: */* + accept-language: en-GB,en;q=0.9 + origin: https://alpha.succinct.xyz + referer: https://alpha.succinct.xyz/near/near-light-client/releases/new + sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121" + sec-ch-ua-mobile: ?0 + sec-ch-ua-platform: "Linux" + sec-fetch-dest: empty + sec-fetch-mode: cors + sec-fetch-site: same-origin + sec-gpc: 1 + user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 + content-type: text/plain;charset=UTF-8 + cookie: session={{succinctSession}} +} + +auth:bearer { + token: {{succinctApiKey}} +} + +body:text { + { + "org_name": "near", + "project_name": "near-light-client", + "git_ref": "{{gitRef}}", + "entrypoint": "{{entrypoint}}", + "env_vars": [] + } +} + +vars:pre-request { + gitRef: notused + entrypoint: fake +} + +assert { + res.status: eq 200 +} + +script:pre-request { + let gitRef = bru.getProcessEnv("GIT_REF") + if (gitRef != null) { + bru.setVar("gitRef", gitRef) + } + let entrypoint = bru.getProcessEnv("ENTRYPOINT") + if (entrypoint != null) { + bru.setVar("entrypoint", entrypoint) + } + bru.setVar("succinctSession", bru.getProcessEnv("SUCCINCT_SESSION")) + bru.setVar("succinctApiKey", bru.getProcessEnv("SUCCINCT_API_KEY")) +} + +script:post-response { + bru.setVar(`CHECK_RELEASE_ID`, res.body.release_id) + bru.setVar(`CHECK_RELEASE_NUM`, res.body.release_number) +} diff --git a/api/succinct/deploy/notify-deployment.bru b/api/succinct/deploy/notify-deployment.bru new file mode 100644 index 00000000..fcfe62f1 --- /dev/null +++ b/api/succinct/deploy/notify-deployment.bru @@ -0,0 +1,93 @@ +meta { + name: notify-deployment + type: http + seq: 50 +} + +post { + url: {{succinctBaseUrl}}/deployment/new + body: text +} + +headers { + authority: alpha.succinct.xyz + accept: */* + accept-language: en-GB,en;q=0.9 + content-type: text/plain;charset=UTF-8 + origin: https://alpha.succinct.xyz + referer: https://alpha.succinct.xyz/near/near-light-client/deployments/new + sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121" + sec-ch-ua-mobile: ?0 + sec-ch-ua-platform: "Linux" + sec-fetch-dest: empty + sec-fetch-mode: cors + sec-fetch-site: same-origin + sec-gpc: 1 + user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 + cookie: session=Qa84UBz81dNmH6kV7DTW_de8TtSdeYZExnnngHJoMH8 +} + +body:text { + { + "release_id": "{{release}}", + "contract_address": "{{contract}}", + "gateway_address": "{{gateway}}", + "chain_id": {{chain_id}}, + "function_id": "{{function_id}}", + "salt": "{{salt}}", + "tx_hash": {{tx_hash}} + } +} + + +vars:pre-request { + salt: d4f4fed64865db8ba82177c0c4528a9eb7ec47ec4fb0ddaf8d56dd7b79537597 + chain_id: 421614 + function_id: + tx_hash: +} + +script:pre-request { + let release = bru.getEnvVar(`RELEASE_ID`) + console.log(`release: ${release}`) + if (release != null) { + bru.setVar("release", release) + } + + let contract = bru.getEnvVar(`VERIFIER_ADDRESS`) + console.log(`contract: ${contract}`) + if (contract != null) { + bru.setVar("contract", contract) + } + + let gateway = bru.getProcessEnv(`SUCCINCT_GATEWAY_ID`) + console.log(`gateway: ${gateway}`) + if (gateway != null) { + bru.setVar("gateway", gateway) + } + + let chain = bru.getProcessEnv(`CHAIN_ID`) + console.log(`chain: ${chain}`) + if (chain != null) { + bru.setVar("chain", chain) + } + + let function_id = bru.getEnvVar(`FUNCTION_ID`) + console.log(`function_id: ${function_id}`) + if (function_id != null) { + bru.setVar("function_id", function_id) + } + + let salt = bru.getEnvVar(`CREATE2_SALT`) + console.log(`salt: ${salt}`) + if (salt != null) { + bru.setVar("salt", salt) + } + + let tx_hash = bru.getEnvVar(`TX_HASH`) + console.log(`tx_hash: ${tx_hash}`) + if (tx_hash != null) { + bru.setVar("tx_hash", tx_hash) + } +} + diff --git a/api/succinct/deploy/pull-vk.bru b/api/succinct/deploy/pull-vk.bru new file mode 100644 index 00000000..15ecc640 --- /dev/null +++ b/api/succinct/deploy/pull-vk.bru @@ -0,0 +1,43 @@ +meta { + name: pull-vk + type: http + seq: 4 +} + +get { + url: {{succinctBaseUrl}}/release/{{releaseId}}/download/FunctionVerifier.sol + body: text + auth: none +} + +headers { + authority: alpha.succinct.xyz + accept: */* + accept-language: en-GB,en;q=0.9 + origin: https://alpha.succinct.xyz + referer: https://alpha.succinct.xyz/near/near-light-client/releases/new + sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121" + sec-ch-ua-mobile: ?0 + sec-ch-ua-platform: "Linux" + sec-fetch-dest: empty + sec-fetch-mode: cors + sec-fetch-site: same-origin + sec-gpc: 1 + user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 + content-type: text/plain;charset=UTF-8 +} + +vars:pre-request { + releaseId: c2829278-6849-4487-ba5f-96ce503837d5 +} + +assert { + res.status: eq 200 +} + +script:pre-request { + let releaseId = bru.getEnvVar("RELASE_ID") + if (releaseId != null) { + bru.setVar("releaseId", releaseId) + } +} diff --git a/api/succinct/deploy/update-name.bru b/api/succinct/deploy/update-name.bru new file mode 100644 index 00000000..6af4bbe5 --- /dev/null +++ b/api/succinct/deploy/update-name.bru @@ -0,0 +1,58 @@ +meta { + name: update-name + type: http + seq: 3 +} + +patch { + url: {{succinctBaseUrl}}/release/{{release}}/name + body: json + auth: none +} + +headers { + authority: alpha.succinct.xyz + accept: */* + accept-language: en-GB,en;q=0.9 + content-type: application/json + origin: https://alpha.succinct.xyz + referer: https://alpha.succinct.xyz/near/near-light-client/releases/17 + sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121" + sec-ch-ua-mobile: ?0 + sec-ch-ua-platform: "Linux" + sec-fetch-dest: empty + sec-fetch-mode: cors + sec-fetch-site: same-origin + sec-gpc: 1 + user-agent: Mozilla/5.0 (X11; Linux x86_64) AppMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 + cookie: session={{succinctSession}} +} + +body:json { + {"name":"{{version}}"} +} + +vars:pre-request { + release: noop + version: noop +} + +assert { + res.body.status: eq success + res.status: eq 200 +} + +script:pre-request { + let release = bru.getEnvVar(`RELEASE_ID`) + console.log(`release: ${release}`) + if (release != null) { + bru.setVar("release", release) + } + + let version = bru.getEnvVar("VERSION") + console.log(`version: ${version}`) + if (version != null) { + bru.setVar("version", version) + } + bru.setVar("succinctSession", bru.getProcessEnv("SUCCINCT_SESSION")) +} diff --git a/bin/client/Cargo.toml b/bin/client/Cargo.toml index 9032d080..66450364 100644 --- a/bin/client/Cargo.toml +++ b/bin/client/Cargo.toml @@ -5,30 +5,21 @@ name = "near-light-client" version.workspace = true [dependencies] -anyhow.workspace = true -async-trait.workspace = true -axum.workspace = true -borsh.workspace = true -reqwest.workspace = true -serde.workspace = true -serde_json.workspace = true -sled.workspace = true -thiserror.workspace = true -tokio.workspace = true +anyhow.workspace = true +async-trait.workspace = true +axum.workspace = true +borsh.workspace = true coerce.workspace = true config.workspace = true -either.workspace = true -futures.workspace = true -hex.workspace = true itertools.workspace = true log.workspace = true pretty_env_logger.workspace = true -protobuf.workspace = true +serde.workspace = true +sled.workspace = true +tokio.workspace = true -near-crypto.workspace = true -near-jsonrpc-client.workspace = true -near-primitives-core.workspace = true -near-primitives.workspace = true +near-light-client-primitives.workspace = true +near-primitives.workspace = true protocol = { path = "../../crates/protocol", package = "near-light-client-protocol" } rpc = { path = "../../crates/rpc", package = "near-light-client-rpc" } diff --git a/bin/client/src/client/actor.rs b/bin/client/src/client/actor.rs new file mode 100644 index 00000000..755730d2 --- /dev/null +++ b/bin/client/src/client/actor.rs @@ -0,0 +1,140 @@ +use coerce::actor::{ + context::ActorContext, + message::{Handler, Message}, + Actor, +}; +use near_primitives::types::TransactionOrReceiptId; +use protocol::{experimental::Proof as ExperimentalProof, Proof}; + +use super::LightClient; +// TODO: convert to actix +use crate::prelude::*; + +pub struct Shutdown; + +impl Message for Shutdown { + type Result = Result<()>; +} + +pub struct Head; + +impl Message for Head { + type Result = Option
; +} + +pub struct Archive { + pub epoch: CryptoHash, +} + +impl Message for Archive { + type Result = Option
; +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct GetProof(pub TransactionOrReceiptId); + +impl Message for GetProof { + type Result = Option; +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct BatchGetProof(pub Vec); + +impl Message for BatchGetProof { + type Result = Option; +} + +pub struct VerifyProof { + pub proof: Proof, +} + +impl Message for VerifyProof { + type Result = Result; +} +#[async_trait] +impl Actor for LightClient { + async fn started(&mut self, _ctx: &mut ActorContext) { + self.bootstrap_store() + .await + .expect("Failed to bootstrap store"); + // TODO: anonymous ctx.spawn(id, actor) + let catchup = self.config.catchup; + let store = self.store.clone(); + let client = self.client.clone(); + tokio::task::spawn(async move { Self::start_syncing(catchup, store, client).await }); + } +} + +#[async_trait] +impl Handler for LightClient { + async fn handle( + &mut self, + _message: Head, + _ctx: &mut ActorContext, + ) -> ::Result { + self.store.head().await.ok() + } +} + +#[async_trait] +impl Handler for LightClient { + async fn handle( + &mut self, + message: Archive, + _ctx: &mut ActorContext, + ) -> ::Result { + self.header(message.epoch).await + } +} + +#[async_trait] +impl Handler for LightClient { + async fn handle( + &mut self, + _message: Shutdown, + ctx: &mut ActorContext, + ) -> ::Result { + self.store.shutdown().await; + ctx.stop(None); + Ok(()) + } +} + +#[async_trait] +impl Handler for LightClient { + async fn handle( + &mut self, + message: GetProof, + _ctx: &mut ActorContext, + ) -> ::Result { + self.get_proofs(BatchGetProof(vec![message])) + .await + .ok() + .and_then(|proofs| proofs.into_iter().next()) + } +} + +#[async_trait] +impl Handler for LightClient { + async fn handle( + &mut self, + message: VerifyProof, + _ctx: &mut ActorContext, + ) -> ::Result { + self.verify_proof(message.proof).await.map_err(|e| { + log::error!("{:?}", e); + e + }) + } +} + +#[async_trait] +impl Handler for LightClient { + async fn handle( + &mut self, + message: BatchGetProof, + _ctx: &mut ActorContext, + ) -> ::Result { + self.experimental_get_proofs(message).await.ok() + } +} diff --git a/bin/client/src/client/message.rs b/bin/client/src/client/message.rs deleted file mode 100644 index b7f67c33..00000000 --- a/bin/client/src/client/message.rs +++ /dev/null @@ -1,47 +0,0 @@ -use coerce::actor::message::Message; -use near_primitives::types::TransactionOrReceiptId; -use protocol::{experimental::Proof as ExperimentalProof, Proof}; - -use crate::prelude::*; - -pub struct Shutdown; - -impl Message for Shutdown { - type Result = Result<()>; -} - -pub struct Head; - -impl Message for Head { - type Result = Option
; -} - -pub struct Archive { - pub epoch: CryptoHash, -} - -impl Message for Archive { - type Result = Option
; -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct GetProof(pub TransactionOrReceiptId); - -impl Message for GetProof { - type Result = Option; -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct BatchGetProof(pub Vec); - -impl Message for BatchGetProof { - type Result = Option; -} - -pub struct VerifyProof { - pub proof: Proof, -} - -impl Message for VerifyProof { - type Result = Result; -} diff --git a/bin/client/src/client/mod.rs b/bin/client/src/client/mod.rs index 497a9255..1051ab88 100644 --- a/bin/client/src/client/mod.rs +++ b/bin/client/src/client/mod.rs @@ -1,20 +1,18 @@ use std::{str::FromStr, sync::Arc}; -use coerce::actor::{context::ActorContext, message::Handler, Actor}; -use message::{Archive, GetProof, Head, Shutdown, VerifyProof}; use near_primitives::views::validator_stake_view::ValidatorStakeView; use protocol::{Proof, Protocol}; use rpc::LightClientRpc; use tokio::time; -use self::{message::BatchGetProof, store::Store}; +use self::{actor::BatchGetProof, store::Store}; use crate::{ client::store::{head_key, Collection, Entity}, config::Config, prelude::*, }; -pub mod message; +pub mod actor; mod store; pub struct LightClient { @@ -23,97 +21,9 @@ pub struct LightClient { store: Arc>, } -#[async_trait] -impl Actor for LightClient { - async fn started(&mut self, _ctx: &mut ActorContext) { - self.bootstrap_store() - .await - .expect("Failed to bootstrap store"); - // TODO: anonymous ctx.spawn(id, actor) - let catchup = self.config.catchup; - let store = self.store.clone(); - let client = self.client.clone(); - tokio::task::spawn(async move { Self::start_syncing(catchup, store, client).await }); - } -} - -#[async_trait] -impl Handler for LightClient { - async fn handle( - &mut self, - _message: Head, - _ctx: &mut ActorContext, - ) -> ::Result { - self.store.head().await.ok() - } -} - -#[async_trait] -impl Handler for LightClient { - async fn handle( - &mut self, - message: Archive, - _ctx: &mut ActorContext, - ) -> ::Result { - self.header(message.epoch).await - } -} - -#[async_trait] -impl Handler for LightClient { - async fn handle( - &mut self, - _message: Shutdown, - ctx: &mut ActorContext, - ) -> ::Result { - self.store.shutdown().await; - ctx.stop(None); - Ok(()) - } -} - -#[async_trait] -impl Handler for LightClient { - async fn handle( - &mut self, - message: GetProof, - _ctx: &mut ActorContext, - ) -> ::Result { - self.get_proofs(BatchGetProof(vec![message])) - .await - .ok() - .and_then(|proofs| proofs.into_iter().next()) - } -} - -#[async_trait] -impl Handler for LightClient { - async fn handle( - &mut self, - message: VerifyProof, - _ctx: &mut ActorContext, - ) -> ::Result { - self.verify_proof(message.proof).await.map_err(|e| { - log::error!("{:?}", e); - e - }) - } -} - -#[async_trait] -impl Handler for LightClient { - async fn handle( - &mut self, - message: BatchGetProof, - _ctx: &mut ActorContext, - ) -> ::Result { - self.experimental_get_proofs(message).await.ok() - } -} - impl LightClient { pub fn new(config: &Config) -> Result { - let client = rpc::NearRpcClient::new(config.network); + let client = rpc::NearRpcClient::new(&config.rpc); // TODO: store selector in config let store = store::sled::init(config)?; @@ -128,8 +38,7 @@ impl LightClient { async fn bootstrap_store(&mut self) -> Result<()> { let head = self.store.head().await; if head.is_err() { - let sync_from = - CryptoHash::from_str(&self.config.starting_head).map_err(anyhow::Error::msg)?; + let sync_from = self.config.protocol.genesis; let starting_head = self .client diff --git a/bin/client/src/config.rs b/bin/client/src/config.rs index df8b86ff..9410a48b 100644 --- a/bin/client/src/config.rs +++ b/bin/client/src/config.rs @@ -1,7 +1,6 @@ -use std::{env, path::PathBuf}; +use std::path::PathBuf; -use config::{Config as ConfigTrait, ConfigError, Environment, File}; -use rpc::Network; +use near_light_client_primitives::{config::default_host, prelude::Configurable}; use crate::prelude::*; @@ -9,42 +8,27 @@ use crate::prelude::*; pub struct Config { #[serde(default = "default_db_path")] pub state_path: PathBuf, - pub starting_head: String, - pub network: Network, #[serde(default = "default_host")] pub host: String, pub catchup: bool, + pub rpc: rpc::Config, + pub protocol: protocol::config::Config, } +impl Configurable for Config {} + fn default_db_path() -> PathBuf { "state.db".into() } -fn default_host() -> String { - "0.0.0.0:3000".into() -} - -impl Config { - pub fn new() -> Result { - let run_mode = env::var("NEAR_LIGHT_CLIENT_NETWORK") - .unwrap_or_else(|_| "testnet".into()) - .to_lowercase(); - log::debug!("Run mode {run_mode}"); - - let default_path = - env::var("NEAR_LIGHT_CLIENT_CONFIG_FILE").unwrap_or_else(|_| "default".to_string()); - - let s = ConfigTrait::builder() - .add_source(File::with_name(&default_path).required(false)) - .add_source(File::with_name(&run_mode).required(false)) - // This file shouldn't be checked in to git - .add_source(File::with_name("local").required(false)) - .add_source(Environment::with_prefix("NEAR_LIGHT_CLIENT")) - .build()?; +#[cfg(test)] +mod tests { + use near_light_client_primitives::config::BaseConfig; - let r = s.try_deserialize(); + use super::*; - log::debug!("Config: {:#?}", r); - r + #[test] + fn test_read_config() { + Config::test_config(); } } diff --git a/bin/client/src/controller.rs b/bin/client/src/controller.rs index 1d8c027c..0c581bf9 100644 --- a/bin/client/src/controller.rs +++ b/bin/client/src/controller.rs @@ -47,7 +47,7 @@ async fn health_check() -> StatusCode { mod header { use super::*; - use crate::client::message::{Archive, Head}; + use crate::client::actor::{Archive, Head}; #[derive(Debug, Deserialize, Serialize)] pub struct Params { @@ -84,7 +84,7 @@ mod proof { use protocol::Proof; use super::*; - use crate::client::message::{BatchGetProof, GetProof, VerifyProof}; + use crate::client::actor::{BatchGetProof, GetProof, VerifyProof}; pub(super) async fn post_get_proof( State(client): State>, diff --git a/bin/client/src/main.rs b/bin/client/src/main.rs index 48844ff5..92420930 100644 --- a/bin/client/src/main.rs +++ b/bin/client/src/main.rs @@ -1,6 +1,8 @@ use coerce::actor::{system::ActorSystem, IntoActor}; +use config::Config; +use near_light_client_primitives::config::BaseConfig; -use crate::client::{message::Shutdown, LightClient}; +use crate::client::{actor::Shutdown, LightClient}; mod client; mod config; @@ -12,7 +14,7 @@ pub struct ShutdownMsg; async fn main() -> anyhow::Result<()> { pretty_env_logger::init(); - let config = config::Config::new()?; + let config = Config::new(std::env::var("NEAR_LIGHT_CLIENT_DIR").ok().as_deref())?; let system = ActorSystem::builder() .system_name("near-light-client") .build(); diff --git a/bin/operator/Cargo.toml b/bin/operator/Cargo.toml new file mode 100644 index 00000000..d93c861e --- /dev/null +++ b/bin/operator/Cargo.toml @@ -0,0 +1,46 @@ +[package] +edition.workspace = true +license.workspace = true +name = "nearx-operator" +version.workspace = true + +[lib] + +[dependencies] +actix = { version = "*", features = [ "macros" ] } +anyhow.workspace = true +figment.workspace = true +futures.workspace = true +hashbrown = { version = "*", features = [ "serde" ] } +hex.workspace = true +http-cache-reqwest = "0.13.0" +jsonrpsee = { version = "0.22.1", features = [ "server", "macros" ] } +jsonrpsee-core = "0.22.1" +priority-queue = "*" +reqwest-middleware = "*" +reqwest-retry = "*" +reqwest.workspace = true +serde.workspace = true +serde_json.workspace = true +thiserror.workspace = true +tokio.workspace = true +tracing-subscriber.workspace = true +tracing.workspace = true +uuid = { version = "1.4.1", features = [ "serde", "v4" ] } + +alloy = { git = "https://github.com/alloy-rs/alloy.git", features = [ "contract", "provider-http" ] } + +near-light-client-primitives.workspace = true +near-light-client-protocol.workspace = true +near-light-client-rpc.workspace = true +near-light-clientx.workspace = true + +succinct-client = { git = "https://github.com/succinctlabs/succinctx.git" } + +[dev-dependencies] +hex.workspace = true +near-light-clientx.workspace = true +paste = "1.0.12" +pretty_assertions.workspace = true +test-utils.workspace = true +wiremock = "0.6.0" diff --git a/bin/operator/src/config.rs b/bin/operator/src/config.rs new file mode 100644 index 00000000..5148b9a6 --- /dev/null +++ b/bin/operator/src/config.rs @@ -0,0 +1,26 @@ +use near_light_client_primitives::{config::default_host, prelude::Configurable}; +use serde::Deserialize; + +#[derive(Debug, Deserialize, Clone)] +pub struct Config { + #[serde(default = "default_host")] + pub host: String, + pub rpc: near_light_client_rpc::Config, + pub protocol: near_light_client_protocol::config::Config, + pub succinct: crate::succinct::Config, + pub engine: crate::engine::Config, +} + +impl Configurable for Config {} + +#[cfg(test)] +mod tests { + use near_light_client_primitives::config::BaseConfig; + + use super::*; + + #[test] + fn test_read_config() { + Config::test_config(); + } +} diff --git a/bin/operator/src/engine/mod.rs b/bin/operator/src/engine/mod.rs new file mode 100644 index 00000000..d075901a --- /dev/null +++ b/bin/operator/src/engine/mod.rs @@ -0,0 +1,451 @@ +use std::{sync::Arc, time::Duration}; + +use actix::prelude::*; +use anyhow::{anyhow, Result}; +use futures::FutureExt; +use hashbrown::{hash_map::DefaultHashBuilder, HashMap}; +use near_light_client_rpc::{ + prelude::{info, Itertools}, + TransactionOrReceiptId, +}; +use near_light_clientx::config::bps_from_network; +use priority_queue::PriorityQueue; +use serde::{Deserialize, Serialize}; +use tracing::{debug, error, trace}; +pub use types::RegistryInfo; + +use self::types::{PriorityWeight, TransactionOrReceiptIdNewtype}; +use crate::succinct::{ + self, + types::{ProofResponse, ProofStatus}, + ProofId, +}; + +mod types; + +// TODO[Optimisation]: decide if we can try to identity hash based on ids, +// they're already hashed, perhaps a collision would be if receipt_id ++ tx_id +// are the same, unlikely +type Queue = PriorityQueue; + +#[derive(Debug, Deserialize, Clone)] +#[serde(default)] +pub struct Config { + drain_interval: u64, + sync_interval: u64, + cleanup_interval: u64, + persist_interval: u64, +} + +impl Default for Config { + fn default() -> Self { + Config { + drain_interval: 1, + sync_interval: 60 * 30, + cleanup_interval: 60, + persist_interval: 30, + } + } +} + +pub struct Engine { + registry: HashMap, + succinct_client: Arc, + proving_queue: Queue, + batches: HashMap>, + request_info: HashMap>, + config: Config, + verify_amt: usize, +} + +impl Engine { + pub fn new(config: &super::Config, succinct_client: Arc) -> Self { + info!("starting queue manager"); + + let state = PersistedState::try_from("state.json"); + + Self { + registry: state + .as_ref() + .map(|s| s.registry.clone()) + .unwrap_or_default(), + succinct_client, + proving_queue: state + .as_ref() + .map(|s| Queue::from_iter(s.queue.clone())) + .unwrap_or(Queue::with_default_hasher()), + batches: state + .as_ref() + .map(|s| s.batches.clone()) + .unwrap_or_default(), + request_info: state.map(|s| s.request_info).unwrap_or_default(), + config: config.engine.clone(), + verify_amt: bps_from_network(&config.rpc.network), + } + } + + #[tracing::instrument(skip(self))] + fn prove( + &mut self, + id: Option, + tx: TransactionOrReceiptId, + ) -> ::Result { + let weight = if let Some(id) = id { + self.registry + .get(&id) + .ok_or_else(|| anyhow!("id not found"))? + .weight + } else { + 1 + }; + debug!("enqueuing {:?} with weight: {weight}", tx); + self.proving_queue.push(tx.into(), weight); + Ok(()) + } + + fn make_batch(&mut self) -> Option<(u32, Vec)> { + if self.proving_queue.len() < self.verify_amt { + return None; + } + let id = self.batches.len() as u32; + let mut txs = vec![]; + for _ in 0..self.verify_amt { + let (req, _) = self.proving_queue.pop()?; + txs.push(req.0); + } + self.batches.insert(id, None); + Some((id, txs)) + } +} + +impl Actor for Engine { + type Context = Context; + + fn started(&mut self, ctx: &mut Self::Context) { + ctx.run_interval(Duration::from_secs(self.config.drain_interval), |_, ctx| { + ctx.address().do_send(Drain) + }); + ctx.run_interval(Duration::from_secs(self.config.sync_interval), |_, ctx| { + ctx.address().do_send(Sync) + }); + ctx.run_interval( + Duration::from_secs(self.config.cleanup_interval), + |_, ctx| ctx.address().do_send(Cleanup), + ); + ctx.run_interval( + Duration::from_secs(self.config.persist_interval), + |_, ctx| ctx.address().do_send(Persist), + ); + } +} + +#[derive(Message)] +#[rtype(result = "Result<()>")] +pub struct ProveTransaction { + pub id: Option, + pub tx: TransactionOrReceiptId, +} + +impl Handler for Engine { + type Result = Result<()>; + + fn handle(&mut self, msg: ProveTransaction, _ctx: &mut Self::Context) -> Self::Result { + self.prove(msg.id, msg.tx)?; + Ok(()) + } +} + +#[derive(Debug, Clone, Message)] +#[rtype(result = "Result")] +pub struct CheckProof(pub ProofId); + +impl From for CheckProof { + fn from(id: ProofId) -> Self { + Self(id) + } +} + +// TODO: change to periodic job to check proofs for all batches and clean up +impl Handler for Engine { + type Result = ResponseFuture>; + + #[tracing::instrument(skip(self))] + fn handle(&mut self, _msg: CheckProof, _ctx: &mut Self::Context) -> Self::Result { + // // This feels like a succinct client job, keep checking queues + // let fut = self.check_proof(msg.0); + // Box::pin(fut) + todo!() + } +} + +#[derive(Message, Debug)] +#[rtype(result = "()")] +pub struct Register(pub RegistryInfo); + +impl Handler for Engine { + type Result = (); + + #[tracing::instrument(skip(self))] + fn handle(&mut self, msg: Register, _ctx: &mut Self::Context) -> Self::Result { + self.registry.insert(msg.0.id, msg.0); + } +} + +#[derive(Message, Debug)] +#[rtype(result = "Result<()>")] +pub struct Sync; + +impl Handler for Engine { + type Result = AtomicResponse>; + + #[tracing::instrument(skip(self))] + fn handle(&mut self, _msg: Sync, _ctx: &mut Self::Context) -> Self::Result { + let client = self.succinct_client.clone(); + // Not ssure this needs atomic + AtomicResponse::new(Box::pin( + async move { client.sync(true).await } + .into_actor(self) + .map(move |r, this, _| { + debug!("sync requested {:?}", r); + this.request_info.insert(r?, None); + Ok(()) + }), + )) + } +} + +#[derive(Message, Debug)] +#[rtype(result = "Result<()>")] +pub struct Drain; + +impl Handler for Engine { + type Result = AtomicResponse>; + + #[tracing::instrument(skip(self))] + fn handle(&mut self, _msg: Drain, _ctx: &mut Self::Context) -> Self::Result { + AtomicResponse::new(if let Some((id, batch)) = self.make_batch() { + let client = self.succinct_client.clone(); + let fut = async move { client.verify(batch, true).await } + // Then ask succinct to verify + .into_actor(self) + // Once verify proof id is returned, write the result to ourselves + .map(move |r, this, _| match r { + Ok(r) => { + debug!("batch {id} done, batches: {:?}", this.batches); + this.batches.insert(id, Some(r)); + Ok(()) + } + Err(e) => { + error!("{:?}", e); + Err(e) + } + }); + Box::pin(fut) + } else { + Box::pin(async { Ok(()) }.into_actor(self)) + }) + } +} + +#[derive(Message, Debug)] +#[rtype(result = "()")] +pub struct Cleanup; + +impl Handler for Engine { + type Result = AtomicResponse; + + #[tracing::instrument(skip(self))] + fn handle(&mut self, _msg: Cleanup, _ctx: &mut Self::Context) -> Self::Result { + trace!("cleaning up"); + + let to_check = self + .batches + .clone() + .into_iter() + .filter_map(|(_, pid)| pid) + .filter(|pid| self.request_info.get(pid).is_none()) + .take(30) // TODO: configure + .collect_vec(); + + if to_check.is_empty() { + return AtomicResponse::new(Box::pin(async {}.into_actor(self))); + } + + let client = self.succinct_client.clone(); + // Not ssure this needs atomic + AtomicResponse::new(Box::pin( + async move { + let mut futs = vec![]; + debug!("checking on {} proofs", to_check.len()); + for pid in to_check { + futs.push(client.get_proof(pid).map(move |p| (pid, p))); + } + futures::future::join_all(futs).await + } + .into_actor(self) + .map(move |r, this, _| { + r.into_iter().for_each(|(pid, p)| match p { + Ok(p) => { + debug!("proof: {:?} status: {:?}", pid, p.status); + this.request_info.insert(pid, Some(p.status)); + } + Err(e) => { + error!("{:?}", e); + } + }); + }), + )) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PersistedState { + registry: HashMap, + batches: HashMap>, + request_info: HashMap>, + queue: HashMap, +} + +impl TryFrom<&str> for PersistedState { + type Error = anyhow::Error; + fn try_from(s: &str) -> anyhow::Result { + let contents = std::fs::read_to_string(s); + if let Ok(contents) = contents { + let s = serde_json::from_str(&contents)?; + Ok(s) + } else { + anyhow::bail!("Failed to read state file") + } + } +} + +#[derive(Message, Debug)] +#[rtype(result = "anyhow::Result<()>")] +pub struct Persist; + +impl Handler for Engine { + type Result = anyhow::Result<()>; + + #[tracing::instrument(skip(self))] + fn handle(&mut self, _msg: Persist, _ctx: &mut Self::Context) -> Self::Result { + trace!("persisting state"); + let state = PersistedState { + registry: self.registry.clone(), + batches: self.batches.clone(), + request_info: self.request_info.clone(), + queue: self.proving_queue.clone().into_sorted_iter().collect(), + }; + std::fs::write("state.json", serde_json::to_string(&state)?)?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + + use near_light_client_primitives::config::BaseConfig; + use near_light_client_rpc::TransactionOrReceiptId; + use near_light_clientx::config::{Config, Testnet}; + use test_utils::fixture; + + use super::*; + use crate::succinct::tests::mocks; + + const VERIFY_AMT: usize = Testnet::BPS; + + async fn manager() -> Engine { + let client = mocks().await; + + Engine::new(&crate::config::Config::test_config(), Arc::new(client)) + } + + // TODO: move to integration tests + // #[ignore = "test is a live e2e test"] + // #[tokio::test] + // async fn e2e_test_verify() { + // let mut m = manager().await; + // + // let fixture = fixture::>("ids.json"); + // let fixtures = fixture.iter().take(VERIFY_AMT); + // for r in fixtures { + // m.prove(message::ProveTransaction { + // tx: r.clone(), + // id: None, + // }) + // .await + // .unwrap(); + // } + // QueueManager::try_drain(m.succinct_client, m.proving_queue).await; + // } + + // #[tokio::test] + // async fn test_check_proof() { + // let m = manager().await; + // + // let _r = m + // .check_proof(ProofId(Stubs::verify_pid()).into()) + // .await + // .unwrap(); + // } + + #[tokio::test] + async fn test_weights() { + let mut m = manager().await; + + let fixture = fixture::>("ids.json"); + let to_take = VERIFY_AMT - 1; + let fixtures = fixture.clone().into_iter().take(to_take); + let priority_from = VERIFY_AMT - 7; + + let mut priority: Vec = vec![]; + + for (i, r) in fixtures.enumerate() { + let id = if i >= priority_from { + m.registry.insert( + i, + RegistryInfo { + id: i, + weight: i as u32, + }, + ); + // Store the prioritsed entries + priority.push(r.clone().into()); + Some(i) + } else { + None + }; + m.prove(id, r).unwrap(); + } + + let mut check_queue = m.proving_queue.clone(); + + let mut i = to_take - 1; + while let Some((tx, w)) = check_queue.pop() { + if i >= priority_from { + assert_eq!(i as u32, w); + assert!(priority.contains(&tx)); + i -= 1; + } else { + assert_eq!(w, 1) + } + } + + let (tx, w) = m.proving_queue.pop().unwrap(); + // Make empty batch, since theres not enough to fill + let batch = m.make_batch(); + println!("batch {:?}", batch); + assert!(batch.is_none()); + + // Put the tx we took back + m.prove(Some(w as usize), tx.0).unwrap(); + m.prove(None, fixture.last().unwrap().clone()).unwrap(); + println!("{}", m.proving_queue.len()); + + let (id, batch) = m.make_batch().unwrap(); + assert_eq!(id, 0); + assert!(!batch.is_empty()); + } + + #[test] + fn test_persist() {} +} diff --git a/bin/operator/src/engine/types.rs b/bin/operator/src/engine/types.rs new file mode 100644 index 00000000..31b9d9aa --- /dev/null +++ b/bin/operator/src/engine/types.rs @@ -0,0 +1,115 @@ +use near_light_client_rpc::{prelude::GetProof, TransactionOrReceiptId}; +use serde::{Deserialize, Serialize}; + +pub(crate) type PriorityWeight = u32; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct TransactionOrReceiptIdNewtype(pub TransactionOrReceiptId); + +impl From for TransactionOrReceiptIdNewtype { + fn from(id: TransactionOrReceiptId) -> Self { + Self(id) + } +} +impl std::hash::Hash for TransactionOrReceiptIdNewtype { + fn hash(&self, state: &mut H) { + let (is_transaction, id, account) = match &self.0 { + GetProof::Transaction { + transaction_hash, + sender_id, + } => (true, transaction_hash, sender_id), + GetProof::Receipt { + receipt_id, + receiver_id, + } => (false, receipt_id, receiver_id), + }; + is_transaction.hash(state); + id.hash(state); + account.hash(state); + } +} + +impl PartialEq for TransactionOrReceiptIdNewtype { + fn eq(&self, other: &Self) -> bool { + match (&self.0, &other.0) { + ( + TransactionOrReceiptId::Transaction { + transaction_hash: l1, + sender_id: l2, + }, + TransactionOrReceiptId::Transaction { + transaction_hash: r1, + sender_id: r2, + }, + ) => l1 == r1 && l2 == r2, + ( + TransactionOrReceiptId::Receipt { + receipt_id: l1, + receiver_id: l2, + }, + TransactionOrReceiptId::Receipt { + receipt_id: r1, + receiver_id: r2, + }, + ) => l1 == r1 && l2 == r2, + _ => false, + } + } +} + +impl Eq for TransactionOrReceiptIdNewtype {} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RegistryInfo { + pub id: usize, + // Their weight in the shared queue + pub weight: PriorityWeight, +} + +#[cfg(test)] +mod tests { + + use std::str::FromStr; + + use near_light_client_protocol::near_account_id::AccountId; + use test_utils::CryptoHash; + + use super::*; + + #[test] + fn test_transaction_or_receipt_id_eq() { + let transaction1 = TransactionOrReceiptIdNewtype(TransactionOrReceiptId::Transaction { + transaction_hash: CryptoHash::default(), + sender_id: AccountId::from_str("sender1").unwrap(), + }); + let transaction2 = TransactionOrReceiptIdNewtype(TransactionOrReceiptId::Transaction { + transaction_hash: CryptoHash::default(), + sender_id: AccountId::from_str("sender1").unwrap(), + }); + assert!(transaction1 == transaction2); + + let receipt1 = TransactionOrReceiptIdNewtype(TransactionOrReceiptId::Receipt { + receipt_id: CryptoHash::default(), + receiver_id: AccountId::from_str("receiver1").unwrap(), + }); + let receipt2 = TransactionOrReceiptIdNewtype(TransactionOrReceiptId::Receipt { + receipt_id: CryptoHash::default(), + receiver_id: AccountId::from_str("receiver1").unwrap(), + }); + assert!(receipt1 == receipt2); + + let transaction3 = TransactionOrReceiptIdNewtype(TransactionOrReceiptId::Transaction { + transaction_hash: CryptoHash::default(), + sender_id: AccountId::from_str("sender2").unwrap(), + }); + assert!(transaction1 != transaction3); + + let receipt3 = TransactionOrReceiptIdNewtype(TransactionOrReceiptId::Receipt { + receipt_id: CryptoHash::default(), + receiver_id: AccountId::from_str("receiver2").unwrap(), + }); + assert!(receipt1 != receipt3); + + assert!(transaction1 != receipt1); + } +} diff --git a/bin/operator/src/lib.rs b/bin/operator/src/lib.rs new file mode 100644 index 00000000..2ee4be41 --- /dev/null +++ b/bin/operator/src/lib.rs @@ -0,0 +1,18 @@ +pub use prelude::*; + +pub mod config; +pub mod engine; +pub mod rpc; +pub mod succinct; + +pub mod prelude { + pub use actix::{self, prelude::*}; + pub use near_light_client_primitives::prelude::*; + + pub use crate::{ + config::Config, + engine::Engine, + rpc::{ProveRpcServer as RpcServerExt, RpcServerImpl as RpcServer}, + succinct::{Client as SuccinctClient, *}, + }; +} diff --git a/bin/operator/src/main.rs b/bin/operator/src/main.rs new file mode 100644 index 00000000..925a1917 --- /dev/null +++ b/bin/operator/src/main.rs @@ -0,0 +1,39 @@ +use std::sync::Arc; + +use nearx_operator::*; +use tracing::{debug, info}; +use tracing_subscriber::{filter::EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt}; + +#[actix::main] +pub async fn main() -> anyhow::Result<()> { + let filter = EnvFilter::from_default_env() + .add_directive("hyper=info".parse()?) + .add_directive("reqwest=info".parse()?); + + tracing_subscriber::registry() + .with( + fmt::layer() + .compact() + .with_line_number(true) + .with_file(false), + ) + .with(filter) + .init(); + + let config = config::Config::new(std::env::var("NEAR_LIGHT_CLIENT_DIR").ok().as_deref())?; + + let client = Arc::new(SuccinctClient::new(&config).await?); + + let engine = Engine::new(&config, client.clone()).start(); + + debug!("Running operator with host: {}", config.host); + let server_handle = RpcServer::new(client, engine.clone()).run(&config).await?; + + if tokio::signal::ctrl_c().await.is_ok() { + info!("Shutting down.."); + server_handle.abort(); + System::current().stop(); + } + + Ok(()) +} diff --git a/bin/operator/src/rpc.rs b/bin/operator/src/rpc.rs new file mode 100644 index 00000000..73a5bc7e --- /dev/null +++ b/bin/operator/src/rpc.rs @@ -0,0 +1,139 @@ +use std::{net::SocketAddr, sync::Arc, time::Duration}; + +use actix::Addr; +use jsonrpsee::{ + proc_macros::rpc, + server::Server, + types::{ErrorCode, ErrorObjectOwned}, + PendingSubscriptionSink, SubscriptionMessage, +}; +use jsonrpsee_core::{async_trait, SubscriptionResult}; +use near_light_client_rpc::prelude::GetProof; +use tokio::task::JoinHandle; +use tracing::error; + +use crate::{ + config::Config, + engine::{Engine, ProveTransaction, Register, RegistryInfo}, + succinct::{self, ProofId}, +}; + +type Result = core::result::Result; + +pub struct RpcServerImpl { + succinct_client: Arc, + queue: Addr, +} + +impl RpcServerImpl { + pub fn new(succinct_client: Arc, queue: Addr) -> Self { + tracing::info!("starting rpc server"); + Self { + succinct_client, + queue, + } + } + + pub async fn run(self, config: &Config) -> anyhow::Result> { + let server = Server::builder() + .build(config.host.parse::()?) + .await?; + let _addr = server.local_addr()?; + let handle = server.start(self.into_rpc()); + Ok(tokio::spawn(handle.stopped())) + } +} + +#[rpc(server)] +pub trait ProveRpc { + #[method(name = "sync")] + async fn sync(&self) -> Result; + + #[method(name = "verify")] + async fn verify(&self, ids: Vec) -> Result; + + #[method(name = "prove")] + async fn push(&self, ids: Vec) -> Result<()>; + + #[subscription(name = "subscribe" => "override", item = Vec)] + async fn subscribe_proof(&self, keys: Option>) -> SubscriptionResult; + + #[method(name = "register")] + async fn register(&self, info: RegistryInfo) -> Result<()>; +} + +#[async_trait] +impl ProveRpcServer for RpcServerImpl { + async fn sync(&self) -> Result { + let pid = self + .succinct_client + .sync(true) + .await + .map_err(coerce_error)?; + Ok(pid) + } + + async fn verify(&self, ids: Vec) -> Result { + let pid = self + .succinct_client + .verify(ids, true) + .await + .map_err(coerce_error)?; + Ok(pid) + } + + async fn push(&self, ids: Vec) -> Result<()> { + for tx in ids { + self.queue + .send(ProveTransaction { id: None, tx }) + .await + .map_err(coerce_error)? + .map_err(coerce_error)?; + } + Ok(()) + } + + async fn subscribe_proof( + &self, + pending: PendingSubscriptionSink, + proofs: Option>, + ) -> SubscriptionResult { + // TODO: assert that these proofs arent in the queue already, or if they are, + // help the queue manager out with the queries + if let Some(mut proofs) = proofs { + let sink = pending.accept().await?; + + let start_time = std::time::Instant::now(); + loop { + let now = std::time::Instant::now(); + if now - start_time > Duration::from_secs(10) { + break; + } + let mut successful = vec![]; + for (i, id) in proofs.clone().iter().enumerate() { + let res = self.succinct_client.get_proof(*id).await; + if let Ok(res) = res { + let msg = SubscriptionMessage::from_json(&res)?; + sink.send(msg).await?; + successful.push(i); + } + } + successful.sort(); + successful.reverse(); + for i in successful { + proofs.remove(i); + } + } + } + Ok(()) + } + + async fn register(&self, info: RegistryInfo) -> Result<()> { + self.queue.send(Register(info)).await.map_err(coerce_error) + } +} + +pub fn coerce_error>(e: T) -> ErrorObjectOwned { + error!("{:?}", e.into()); + ErrorCode::ServerError(500).into() +} diff --git a/bin/operator/src/succinct/mod.rs b/bin/operator/src/succinct/mod.rs new file mode 100644 index 00000000..dafeccd3 --- /dev/null +++ b/bin/operator/src/succinct/mod.rs @@ -0,0 +1,730 @@ +use std::{str::FromStr, time::Duration}; + +use alloy::{ + primitives::*, + providers::{network::Ethereum, Provider as ProviderExt, RootProvider}, + sol_types::SolValue, + transports::http::Http, +}; +use anyhow::{ensure, Context}; +use http_cache_reqwest::{CACacheManager, Cache, CacheMode, HttpCache, HttpCacheOptions}; +use near_light_client_rpc::prelude::{CryptoHash, Itertools}; +pub use near_light_clientx::plonky2x::backend::prover::ProofId; +use near_light_clientx::{ + config::bps_from_network, + plonky2x::{ + backend::{ + circuit::DefaultParameters, + function::{BytesRequestData, ProofRequest, ProofRequestBase}, + }, + utils::hex, + }, +}; +use reqwest::{ + header::{self, HeaderMap, HeaderValue}, + Url, +}; +use reqwest_middleware::ClientWithMiddleware; +use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware}; +use serde::Deserialize; +use succinct_client::{request::SuccinctClient as SuccinctClientExt, utils::get_gateway_address}; +use tracing::{debug, info, trace}; +use types::TransactionOrReceiptIdPrimitive; + +use self::types::{Circuit, Deployment, NearX::NearXInstance, NearXClient, ProofResponse}; +use crate::{config, succinct::types::ProofRequestResponse, types::NearX::TransactionOrReceiptId}; + +pub mod types; + +type Provider = RootProvider>; + +#[derive(Debug, Deserialize, Clone, PartialEq, Eq, Hash)] +pub struct Config { + /// The succinct platform api key + pub api_key: String, + /// The succinct platform rpc + #[serde(default = "default_rpc")] + pub rpc_url: String, + /// ETH rpc where the contract is deployed + pub eth_rpc_url: String, + /// Address of the eth contract + pub contract_address: Address, + /// The version we are targeting + pub version: String, + /// Github organisation_id id for the proof platform + #[serde(default = "default_organisation")] + pub organisation_id: String, + /// Github project id + #[serde(default = "default_project")] + pub project_id: String, + /// Max retries when waiting for a request + #[serde(default = "default_max_retries")] + pub client_max_retries: u32, + /// Request timeout from the platform, in seconds + #[serde(default = "default_timeout")] + pub client_timeout: u64, +} + +fn default_rpc() -> String { + "https://alpha.succinct.xyz/api".into() +} + +fn default_organisation() -> String { + "near".into() +} + +fn default_project() -> String { + "near-light-client".into() +} + +fn default_max_retries() -> u32 { + 3 +} + +fn default_timeout() -> u64 { + 30 +} + +pub struct Client { + config: Config, + inner: ClientWithMiddleware, + contract: NearXInstance, Provider>, + ext: SuccinctClientExt, + genesis: CryptoHash, + releases: Vec, + verify_amt: usize, +} + +impl Client { + pub async fn new(config: &config::Config) -> anyhow::Result { + info!("starting succinct client"); + info!("rpc: {}", config.succinct.rpc_url); + info!("contract address: {}", config.succinct.contract_address); + info!("eth rpc: {}", config.succinct.eth_rpc_url); + + ensure!( + config.succinct.contract_address != Address::ZERO, + "invalid contract address", + ); + let (contract, chain_id) = Self::init_contract_client(&config.succinct).await?; + + let inner = Self::init_inner_client(&config.succinct).await?; + + // TODO[Feature]: introduce override if succinct wont relay the proof, call to a + // hosted prover who will prove, relay and unbrick + let succinct_client = SuccinctClientExt::new( + config.succinct.rpc_url.clone(), + config.succinct.api_key.clone(), + false, + false, + ); + + let mut s = Self { + inner, + contract, + config: config.succinct.clone(), + ext: succinct_client, + genesis: config.protocol.genesis, + releases: Default::default(), + verify_amt: bps_from_network(&config.rpc.network), + }; + s.releases = s.fetch_releases(&chain_id).await?; + ensure!(!s.releases.is_empty(), "no releases found"); + + Ok(s) + } + + async fn init_contract_client(config: &Config) -> anyhow::Result<(NearXClient, u32)> { + debug!("initializing contract client"); + + let url = Url::from_str(&config.eth_rpc_url).with_context(|| "invalid rpc url")?; + let inner = Provider::new_http(url); + let chain_id = inner + .get_chain_id() + .await + .with_context(|| "failed to get chain id")?; + let contract = NearXInstance::new(config.contract_address, inner); + debug!("chain id: {}", chain_id); + + Ok((contract, chain_id.to())) + } + + async fn init_inner_client(config: &Config) -> anyhow::Result { + let mut headers = HeaderMap::new(); + let mut auth = HeaderValue::from_str(&format!("Bearer {}", config.api_key))?; + auth.set_sensitive(true); + headers.insert(header::AUTHORIZATION, auth); + + let inner = reqwest::ClientBuilder::default() + .timeout(std::time::Duration::from_secs(config.client_timeout)) // Long timeout to avoid spamming api + .default_headers(headers) + .build()?; + + let retry_policy = + ExponentialBackoff::builder().build_with_max_retries(config.client_max_retries); + let client = reqwest_middleware::ClientBuilder::new(inner) + .with(Cache(HttpCache { + mode: CacheMode::Default, + manager: CACacheManager::default(), + options: HttpCacheOptions::default(), + })) + .with(RetryTransientMiddleware::new_with_policy(retry_policy)) + .build(); + Ok(client) + } + + #[tracing::instrument(skip(self))] + async fn fetch_releases(&self, chain_id: &u32) -> anyhow::Result> { + debug!( + "filtering releases for {chain_id} and version {}", + self.config.version + ); + Ok(Self::extract_release_details( + self.fetch_deployments().await?, + chain_id, + &self.config.version, + )) + .inspect(|r| debug!("releases: {:?}", r)) + } + + fn extract_release_details( + deployments: Vec, + chain_id: &u32, + version: &str, + ) -> Vec { + let gateway: Option
= get_gateway_address(*chain_id).and_then(|a| a.parse().ok()); + deployments + .into_iter() + .filter(|d| d.release_info.release.name.contains(version)) + .filter(|d| d.chain_id == *chain_id) + .filter_map(|mut d| { + if d.gateway == Address::ZERO { + gateway.map(|a| { + d.gateway = a; + d + }) + } else { + debug!("matched deployment: {:#?}", d); + Some(d) + } + }) + .collect_vec() + } + + fn build_proof_request_bytes( + &self, + release_id: &str, + data: BytesRequestData, + ) -> ProofRequest { + trace!( + "building proof request for {:?} with data {:?}", + release_id, + hex!(&data.input) + ); + ProofRequest::::Bytes(ProofRequestBase { + release_id: release_id.to_string(), + parent_id: None, + files: None, + data, + }) + } + + fn build_sync_request(&self, trusted_header_hash: CryptoHash) -> BytesRequestData { + debug!("building sync request for {:?}", trusted_header_hash); + BytesRequestData { + input: trusted_header_hash.0.to_vec(), + } + } + + fn build_verify_request( + &self, + trusted_header_hash: CryptoHash, + ids: Vec, + ) -> BytesRequestData { + debug!("building verify request for {:?}", trusted_header_hash); + trace!("ids {:?}", ids); + BytesRequestData { + // TODO: define this input by abi + input: [ + trusted_header_hash.0.to_vec(), + ids.into_iter() + .map(TransactionOrReceiptId::from) + .collect_vec() + .abi_encode_packed(), + ] + .concat(), + } + } + + #[tracing::instrument(skip(self))] + async fn fetch_deployments(&self) -> anyhow::Result> { + debug!("getting deployments"); + Ok(self + .inner + .get(format!( + "{}/deployments/{}/{}", + self.config.rpc_url, self.config.organisation_id, self.config.project_id + )) + .send() + .await? + .error_for_status()? + .json() + .await + .inspect(|d| trace!("fetched deployments: {:?}", d))?) + } + + #[tracing::instrument(skip(self))] + async fn request_relayed_proof( + &self, + circuit: &Circuit, + req: BytesRequestData, + ) -> anyhow::Result { + ensure!( + self.config.contract_address.0 != [0u8; 20], + "no contract address" + ); + let function_id = circuit.function_id(&self.contract).await?; + debug!("requesting relayed proof for {:?}", function_id); + ensure!( + self.releases + .iter() + .any(|d| d.function_id == hex::encode(function_id)), + "function_id not found in active releases" + ); + let request_id = self + .ext + .submit_request( + circuit.deployment(&self.releases).chain_id, + self.config.contract_address.0 .0.into(), + circuit.with_selector(&req.input).into(), + function_id.into(), + req.input.into(), + ) + .await + .inspect(|d| debug!("requested relay proof: {:?}", d))?; + self.wait_for_proof(&request_id).await + } + + #[tracing::instrument(skip(self))] + async fn fetch_proofs(&self) -> anyhow::Result> { + let res: anyhow::Result<_> = Ok(self + .inner + .get(format!("{}/proofs", self.config.rpc_url)) + .query(&[ + ( + "project", + format!("{}/{}", self.config.organisation_id, self.config.project_id), + ), + ("limit", "10".to_string()), + ]) + .send() + .await? + .error_for_status()? + .json::>() + .await?); + res + } + + /// Wait for the proof to be submitted to the explorer so we can track them + /// by their proof id + #[tracing::instrument(skip(self))] + pub async fn wait_for_proof(&self, request_id: &str) -> anyhow::Result { + let mut interval = tokio::time::interval(Duration::from_secs(5)); + let mut attempts = 0; + loop { + let proofs = self.fetch_proofs().await?; + if let Some(p) = Self::search_for_request(&proofs, request_id) { + break Ok(ProofId(p.id)); + } + attempts += 1; + if attempts > 10 { + anyhow::bail!("{request_id} timed out waiting for proof id"); + } + interval.tick().await; + } + } + + fn search_for_request<'p>( + proofs: &'p [ProofResponse], + request_id: &str, + ) -> Option<&'p ProofResponse> { + proofs + .iter() + .find(|p| { + p.edges.requests.iter().any(|r| { + debug!("checking if {:?} matches {:?}", r.id, request_id); + r.id == request_id + }) + }) + .inspect(|p| debug!("found proof {:?} matching request: {:?}", p.id, request_id)) + } + + /// Request a proof to be proven, this doesn't relay the proof to the + /// contract, useful for users who don't want to relay + #[tracing::instrument(skip(self))] + pub async fn request_proof( + &self, + circuit: &Circuit, + req: BytesRequestData, + ) -> anyhow::Result { + let release_id = circuit.deployment(&self.releases).release_info.release.id; + let req = self.build_proof_request_bytes(&release_id, req); + + Ok(self + .inner + .post(format!("{}/proof/new", self.config.rpc_url)) + .json(&req) + .send() + .await? + .error_for_status()? + .json::() + .await + .inspect(|d| debug!("requested proof: {:?}", d.proof_id))? + .proof_id) + } + + #[tracing::instrument(skip(self))] + pub async fn get_proof(&self, proof_id: ProofId) -> anyhow::Result { + debug!("fetching proof: {}", proof_id.0); + Ok(self + .inner + .get(format!("{}/proof/{}", self.config.rpc_url, proof_id.0)) + .send() + .await? + .error_for_status()? + .json::() + .await + .inspect(|d| debug!("fetched proof: {:?}/{:?}", d.id, d.status))?) + } + + /// Sync the light client + #[tracing::instrument(skip(self))] + pub async fn sync(&self, relay: bool) -> anyhow::Result { + let circuit = Circuit::Sync; + let req = self.build_sync_request(self.fetch_trusted_header_hash().await?); + + let id = if relay { + self.request_relayed_proof(&circuit, req).await? + } else { + self.request_proof(&circuit, req).await? + }; + Ok(id) + } + + /// Verify a set of transactions + #[tracing::instrument(skip(self))] + pub async fn verify( + &self, + ids: Vec, + relay: bool, + ) -> anyhow::Result { + trace!("verifying {} ids", ids.len()); + ensure!( + ids.len() == self.verify_amt, + format!( + "wrong number of transactions for verify, expected {}, got {}", + self.verify_amt, + ids.len() + ) + ); + let circuit = Circuit::Verify; + let req = self.build_verify_request(self.fetch_trusted_header_hash().await?, ids); + + let id = if relay { + self.request_relayed_proof(&circuit, req).await? + } else { + self.request_proof(&circuit, req).await? + }; + Ok(id) + } + + /// Fetch the last synced header from the contract + #[tracing::instrument(skip(self))] + async fn fetch_trusted_header_hash(&self) -> anyhow::Result { + let mut h = self + .contract + .latestHeader() + .call() + .await + .map(|x| *x._0) + .map(CryptoHash)?; + debug!("fetched trusted header hash {:?}", h); + if h == CryptoHash::default() { + info!("no trusted header found, using checkpoint hash"); + h = self.genesis; + } + Ok(h) + } +} + +// FIXME: not using succinct platform anymore, disabling tests +#[cfg(test)] +pub mod tests { + use alloy::sol_types::SolCall; + use near_light_client_primitives::config::BaseConfig; + use serde_json::json; + use test_utils::{fixture, logger}; + use uuid::Uuid; + use wiremock::{ + matchers::{body_partial_json, body_string_contains, method, path, query_param_contains}, + Mock, MockServer, ResponseTemplate, + }; + + use self::types::NearX; + use super::*; + + // const VERIFY_AMT: usize = 64; + pub struct Stub(Circuit); + impl Stub { + pub fn selector(&self) -> String { + let selector = match self.0 { + Circuit::Sync => NearX::syncFunctionIdCall::SELECTOR, + Circuit::Verify => NearX::verifyFunctionIdCall::SELECTOR, + }; + hex!(selector) + } + + pub fn proof_id(&self) -> Uuid { + Uuid::from_str(match self.0 { + Circuit::Sync => "cde59ba0-a60b-4721-b96c-61401ff28852", + Circuit::Verify => "582276cc-62f0-4728-9a20-86f260c09874", + }) + .unwrap() + } + + pub fn request_id(&self) -> String { + match self.0 { + Circuit::Sync => "64bb0a1e-2695-42c8-aee3-9d8c1b17b379", + Circuit::Verify => "533a983c-ec21-456c-a1dc-79965df9de5f", + } + .to_string() + } + + pub async fn mock(&self, server: &MockServer, releases: &[Deployment]) { + let d = self.0.deployment(releases); + // Stub the get function id + Mock::given(method("POST")) + .and(path("/")) + .and(body_string_contains(self.selector())) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({ + "jsonrpc": "2.0", "id": 1, + "result": d.function_id + }))) + .mount(server) + .await; + + // Mock for requesting a new platform proof + Mock::given(method("POST")) + .and(path("/proof/new")) + .and(body_string_contains(&d.release_info.release.id)) + .respond_with(ResponseTemplate::new(200).set_body_json(json!({"proof_id": + self.proof_id()}))) + .mount(server) + .await; + + Mock::given(method("POST")) + .and(path("/request/new")) + .and(body_string_contains(&d.function_id)) + .respond_with( + ResponseTemplate::new(200).set_body_json(json!({"request_id": + self.request_id()})), + ) + .mount(server) + .await; + + let proof_fixture = match self.0 { + Circuit::Sync => "sync_proof.json", + Circuit::Verify => "verify_proof.json", + }; + + Mock::given(method("GET")) + .and(path(format!("/proof/{}", self.proof_id()))) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(fixture::(proof_fixture)), + ) + .mount(server) + .await; + } + } + + impl From for Stub { + fn from(value: Circuit) -> Self { + Self(value) + } + } + + const CHAIN_ID: u32 = 421614; + const VERSION: &str = "dev"; + const HEADER_HASH: &str = "0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3"; + + pub async fn mocks() -> Client { + logger(); + + let deployments = fixture::>("deployments.json"); + let mut config = crate::config::Config::test_config(); + config.succinct.version = VERSION.to_string(); + + let server = MockServer::start().await; + config.succinct.rpc_url = server.uri(); + config.succinct.eth_rpc_url = server.uri(); + config.succinct.rpc_url = server.uri(); + + let releases = Client::extract_release_details(deployments.clone(), &CHAIN_ID, VERSION); + + // Mock for eth_chainId request + Mock::given(method("POST")) + .and(path("/")) + .and(body_partial_json(json!({"method":"eth_chainId"}))) + .respond_with(ResponseTemplate::new(200).set_body_json( + json!({"jsonrpc":"2.0","id":1,"result":hex!(CHAIN_ID.to_be_bytes())}), + )) + .mount(&server) + .await; + + // Mock for fetching deployments + Mock::given(method("GET")) + .and(path("/deployments/near/near-light-client")) + .respond_with(ResponseTemplate::new(200).set_body_json(&deployments)) + .mount(&server) + .await; + + Mock::given(method("GET")) + .and(path("/proofs")) + .and(query_param_contains("project", "near-light-client")) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(fixture::>("get_proofs.json")), + ) + .mount(&server) + .await; + + // Mock the getTrustedHeaderHash + Mock::given(method("POST")) + .and(path("/")) + .and(body_string_contains(hex!( + NearX::latestHeaderCall::SELECTOR + ))) + .respond_with( + ResponseTemplate::new(200) + .set_body_json(json!({"jsonrpc":"2.0","id":1,"result":HEADER_HASH})), + ) + .mount(&server) + .await; + + Stub(Circuit::Sync).mock(&server, &releases).await; + Stub(Circuit::Verify).mock(&server, &releases).await; + + Client::new(&config).await.unwrap() + } + + // #[tokio::test] + // async fn test_can_build_sync() { + // let client = mocks().await; + // let (header, _, _) = testnet_state(); + // let hash = header.hash(); + + // let sync_release_id = + // "1cde66c3-46df-4aab-8409-4cbb97abee1c".to_string(); + + // let req = client.build_sync_request(hash); + // assert_eq!(req.input, hash.0.to_vec()); + + // if let ProofRequest::Bytes(full) = + // client.build_proof_request_bytes(&sync_release_id, + // req.clone()) { + // println!("{}", serde_json::to_string_pretty(&full).unwrap()); + + // assert_eq!(full.data.input, req.input); + // assert_eq!(full.parent_id, None); + // assert_eq!(full.files, None); + // assert_eq!(full.release_id, sync_release_id); + // } else { + // panic!("wrong request type"); + // } + // } + + // #[tokio::test] + // async fn test_sync() { + // let client = mocks().await; + + // let s = client.sync(false).await.unwrap(); + // println!("synced with {:?}", s); + // } + + // #[tokio::test] + // async fn test_sync_relay() { + // let client = mocks().await; + // let s = client.sync(true).await.unwrap(); + // println!("synced with {:?}", s); + // } + + // #[tokio::test] + // async fn test_can_build_verify() { + // let (header, _, _) = testnet_state(); + // let hash = header.hash(); + + // let client = mocks().await; + // let verify_release_id = + // "c35d498e-f283-4b14-a42f-3a35807d3a70".to_string(); + + // let txs = + // fixture::>("ids.json") + // .into_iter() + // .take(VERIFY_AMT) + // .collect_vec(); + + // let req = client.build_verify_request(hash, txs); + // pretty_assertions::assert_eq!(req.input[..32], hash.0.to_vec()); + // // Not using the same as above because of the padding + // pretty_assertions::assert_eq!(hex!(&req.input[32..]), + // "0x009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0024e2d4f8d3394fabea1a8ac255ec3ef9c6e14cc90e8e45c1d185f9a858d484107a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000a594de1c36eca52f15d9f7d4177515570f3a6966e5ac51da1ce4abb7e496c6a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00311fa837e07749c47b2825d06dd14d3aa6f438e2e1cc69857b737d0104ac080576325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f454878ba125cc5f380439ee3c3e6510e8d66e7adcb70e59951bcf51c2916d5686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0156b47c3c713180318844195b0e0e29810c5f099fe19411eaf116d55b3f6d1f96706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0027d1be4cbf7826333bb3a66339314d6b23088907bc03abe8e1f0402f6b8e99fb6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d6c0e7346e597949cf4ef07e57b029426cac6d2a0e80761b07aaa83e5622fe16f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f4bf0c2de11327648a0b56a170029f349308fc88d64badffaf4b1575a0444056f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ae58764b2108d1e23de28591a61e52e6fdeb49f0985ab6bf5f332e338db742f877616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000e7d92ca3c2fbd087783533f3e3c493881189b9e95829763ee2222d5ef50524361737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0010478412784e05112c2ab987ce3d691a1f8d284f5e80d71d573229b6d643563b61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009eac5b84d08bbf7716b595fc0d10686ead30355e5b7a8c9305ac02240823513961737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0124e495308164a0a97925a27e59fadec0c6fc59de23c5ffaef3ff30a2c513d51a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133fb9d5f75d87a3cf8eca81ad16c669a686aac61fc514a6cf1159e739618c2e86f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d6c2a78d92595947756cc38ad2fb077984f691ebbba0d1db03c2cbed071d16ef6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133f6198c994c4ca12b360abc226c232f1dd46bef6c5be02c39278b8de8ea04696f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003d268ee173d6cbe5f0c0efa3833fe6590950938cb7b24b15957587fd0380729375736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008be60e1ba421b4c0cf104749bd2f322f6d985763053b347bf68c6000908aa693796b616a753261386a6366672e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002aa060c38662a90fa07a34b800cd3c84360d894dc4bec1c81a7b41d3eb282092706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006674894d631ca3e373a87b27ea614f16468fa9ddaf401f079d93359f14f29f6e72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bc656c82f3aed97695b555e49b55e584f960197f092a53ac9bcc3f872125436476325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a988b23956e4e5ab00dd3d16decdd0714554562ae9fbfae9053acca1a91f37cc75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00883c8876a557200a3b14ad46b0646af75750403ab3cb5ff04ef6a72f4f71b7786175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d916068721ec0d451382e00bebd8f4f713321e3bde850c36463517d6c50115c5706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01bf4b51df07bf9819b996b720eadafc5323ec7a2ad7fc0555190771faaa582d3272656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1e6131d4648085ea2f1e23ba516e6d03a05c6448c30639b1b082c8650544506686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00956fff9f472d68ff61b7c3e88b678738f5082e44ca40277cb394501a86d8b42177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005ef99fadc671ee47c6015c92351d2c172995832ac01ecd1e8b8ceae3722ccc296f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + // ); + + // if let ProofRequest::Bytes(full) = + // client.build_proof_request_bytes(&verify_release_id, + // req.clone()) { + // assert_eq!(full.data.input, req.input); + // assert_eq!(full.parent_id, None); + // assert_eq!(full.files, None); + // assert_eq!(full.release_id, verify_release_id); + // } else { + // panic!("wrong request type"); + // } + + // let bytes = Circuit::Verify.with_selector(&req.input); + // pretty_assertions::assert_eq!(hex!(&bytes[4..]), + // hex!(req.input)); } + + // #[tokio::test] + // async fn test_verify() { + // let client = mocks().await; + // let txs = + // fixture::>("ids.json") + // .into_iter() + // .take(VERIFY_AMT) + // .collect_vec(); + + // let s = client.verify(txs, false).await.unwrap(); + // println!("verify with {:?}", s); + // } + + // #[tokio::test] + // async fn test_verify_relay() { + // let client = mocks().await; + // let txs = + // fixture::>("ids.json") + // .into_iter() + // .take(VERIFY_AMT) + // .collect_vec(); + + // let s = client.verify(txs, true).await.unwrap(); + // println!("verify with {:?}", s); + // } + + // #[tokio::test] + // async fn test_check_proof() { + // let client = mocks().await; + // let _proofs = client.fetch_proofs().await.unwrap(); + // } +} diff --git a/bin/operator/src/succinct/types.rs b/bin/operator/src/succinct/types.rs new file mode 100644 index 00000000..32358ee4 --- /dev/null +++ b/bin/operator/src/succinct/types.rs @@ -0,0 +1,181 @@ +use alloy::{ + primitives::*, providers::network::Ethereum, sol, sol_types::SolCall, transports::http::Http, +}; +use near_light_client_primitives::pad_account_id; +pub use near_light_client_rpc::TransactionOrReceiptId as TransactionOrReceiptIdPrimitive; +use near_light_clientx::plonky2x::backend::{ + circuit::DefaultParameters, + function::{ProofRequest, ProofResult}, + prover::ProofId, +}; +use serde::{Deserialize, Serialize}; +use tracing::debug; +use uuid::Uuid; +use NearX::TransactionOrReceiptId; + +use self::NearX::NearXInstance; +use crate::types::NearX::{syncCall, verifyCall}; + +pub type NearXClient = NearXInstance, super::Provider>; + +// TODO: update ABI when updating contract, can we just pass the path of the +// contract now we use alloy? +sol!( + #[sol(abi, rpc)] + NearX, + "../../nearx/contract/abi.json" +); + +/// The circuits we support in this nearxclient +#[derive(Debug)] +pub enum Circuit { + Sync, + Verify, +} +impl Circuit { + fn selector(&self) -> [u8; 4] { + match self { + Circuit::Sync => syncCall::SELECTOR, + Circuit::Verify => verifyCall::SELECTOR, + } + } + + /// Writes the input prepended with the selector + pub fn with_selector(&self, input: &[u8]) -> Vec { + [&self.selector()[..], input].concat() + } + + /// Get the function id from the contract + /// This can be updated in realtime, so we query this every time without + /// caching + pub async fn function_id(&self, client: &NearXClient) -> anyhow::Result<[u8; 32]> { + let id = match self { + Circuit::Sync => client.syncFunctionId().call().await.map(|x| x._0), + Circuit::Verify => client.verifyFunctionId().call().await.map(|x| x._0), + }?; + Ok(*id) + } + + /// Filter a deployment from the release list + /// Safety: panics when a deployment cannot be found + pub fn deployment(&self, releases: &[Deployment]) -> Deployment { + debug!("finding deployment in {:?}", releases); + let find = |entrypoint: &str| -> Deployment { + debug!("finding deployment for {}", entrypoint); + releases + .iter() + .find(|r| r.release_info.release.entrypoint == entrypoint) + .unwrap_or_else(|| panic!("could not find release for entrypoint {entrypoint}")) + .to_owned() + }; + match self { + Circuit::Sync => find("sync"), + Circuit::Verify => find("verify"), + } + } +} + +// Eventually we can get these types from succinct crate +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProofRequestResponse { + pub proof_id: ProofId, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProofResponse { + pub id: Uuid, + pub status: ProofStatus, + pub proof_request: ProofRequest, + pub result: Option>, + pub edges: ProofEdges, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ProofEdges { + #[serde(default)] + pub requests: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum ProofStatus { + Pending, + Running, + Success, + Failure, + Requested, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Deployment { + pub id: u32, + pub address: Address, + pub chain_id: u32, + pub function_id: String, + pub owner: Address, + pub gateway: Address, + pub tx_hash: TxHash, + #[serde(rename = "edges")] + pub release_info: DeploymentEdges, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct DeploymentEdges { + pub release: Release, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Release { + pub id: String, + pub number: u64, + pub name: String, + #[serde(rename = "project_id")] + pub project_id: String, + pub entrypoint: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Request { + pub id: String, +} + +impl From for TransactionOrReceiptId { + fn from(value: TransactionOrReceiptIdPrimitive) -> Self { + let (id, account, is_transaction) = match value { + TransactionOrReceiptIdPrimitive::Transaction { + transaction_hash, + sender_id, + } => (transaction_hash, sender_id, true), + TransactionOrReceiptIdPrimitive::Receipt { + receipt_id, + receiver_id, + } => (receipt_id, receiver_id, false), + }; + TransactionOrReceiptId { + id: id.0.into(), + account: pad_account_id(&account).into(), + isTransaction: is_transaction, + } + } +} + +#[cfg(test)] +mod tests { + use test_utils::fixture; + + use super::*; + + // TODO: integration tests + #[test] + fn test_deserialise_deployments() { + let _ = fixture::>("deployments.json"); + } + #[test] + fn test_deserialise_sync_proof() { + let _proof = fixture::("sync_proof.json"); + } + #[test] + fn test_deserialise_verify_proof() { + let _proof = fixture::("verify_proof.json"); + } +} diff --git a/bin/operator/tests/succinct.rs b/bin/operator/tests/succinct.rs new file mode 100644 index 00000000..48f84998 --- /dev/null +++ b/bin/operator/tests/succinct.rs @@ -0,0 +1,59 @@ +#![allow(dead_code)] // Justification: Until we decide on test feature flags + +use nearx_operator::{config::Config, succinct::*, BaseConfig}; + +async fn client() -> Client { + let _ = tracing_subscriber::fmt::try_init(); + Client::new(&Config::test_config()).await.unwrap() +} + +// TODO: these test shouldn't be run in CI, probably sporadically +// #[tokio::test] +// async fn test_sync() { +// let s = client().await.sync(false).await.unwrap(); +// println!("synced with {:?}", s); +// } +// +// #[tokio::test] +// async fn test_sync_relay() { +// let s = client().await.sync(true).await.unwrap(); +// println!("synced with {:?}", s); +// } +// +// #[tokio::test] +// async fn test_verify() { +// let client = client().await; +// +// let txs = fixture::>("ids.json") +// .into_iter() +// .take(VERIFY_AMT) +// .collect_vec(); +// +// let s = client.verify(txs, false).await.unwrap(); +// println!("verify with {:?}", s); +// } +// +// #[tokio::test] +// async fn test_verify_relay() { +// let client: Client = client().await; +// +// let txs = fixture::>("ids.json") +// .into_iter() +// .take(VERIFY_AMT) +// .collect_vec(); +// +// let s = client.verify(txs, true).await.unwrap(); +// println!("verify with {:?}", s); +// } + +// #[tokio::test] +// async fn test_check_proof() { +// let c = client().await; +// let request_id = "76688871-5262-4384-9891-0a68fe7a2efb"; +// let p = c.wait_for_proof(request_id).await.unwrap(); +// println!("found proof: {:?}", p); +// assert_eq!( +// p.0, +// Uuid::from_str("3dcaeed9-b467-4d4f-bfb5-c22bac100527").unwrap() +// ); +// } diff --git a/bruno.json b/bruno.json new file mode 100644 index 00000000..7d570281 --- /dev/null +++ b/bruno.json @@ -0,0 +1,19 @@ +{ + "version": "1", + "name": "api", + "type": "collection", + "presets": { + "requestType": "http", + "requestUrl": "{{succinctBaseUrl}}" + }, + "ignore": [ + "bin", + "target", + ".git", + "crates", + "build", + "nearx", + "vendor", + "wrapped" + ] +} diff --git a/config.toml b/config.toml new file mode 100644 index 00000000..b29f6285 --- /dev/null +++ b/config.toml @@ -0,0 +1,34 @@ +[default] +catchup = false +state_path = "state.db" + +[default.rpc] +network = "Testnet" + +[default.protocol] +genesis = "6pD4xDH3kRSyBdEacErHF7WTeJ2fUXmzU8zXHHTrCnHY" + +[default.succinct] +api_key = "default" +contract_address = "0x0000000000000000000000000000000000000000" +eth_rpc_url = "https://gateway.tenderly.co/public/sepolia" +version = "latest" + +[default.engine] +cleanup_interval = 60 +drain_interval = 1 +persist_interval = 30 +sync_interval = 3000 + +[testnet] +catchup = true + +[testnet.rpc] +network = "Testnet" + +# Sepolia +[testnet.succinct] +api_key = "testnet" +contract_address = "0x73876e41ca149853160Ed5BFeC22e3C7bABEA67a" +eth_rpc_url = "https://gateway.tenderly.co/public/sepolia" +version = "v0.0.4-rc.1" diff --git a/crates/primitives/Cargo.toml b/crates/primitives/Cargo.toml new file mode 100644 index 00000000..1f516571 --- /dev/null +++ b/crates/primitives/Cargo.toml @@ -0,0 +1,13 @@ +[package] +edition.workspace = true +license.workspace = true +name = "near-light-client-primitives" +version.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +figment.workspace = true +log.workspace = true +near-primitives-core.workspace = true +serde.workspace = true diff --git a/crates/primitives/src/config.rs b/crates/primitives/src/config.rs new file mode 100644 index 00000000..2d5759b7 --- /dev/null +++ b/crates/primitives/src/config.rs @@ -0,0 +1,81 @@ +use std::env; + +use figment::{ + providers::{Env, Format, Toml}, + Error as ConfigError, Figment, +}; +use serde::Deserialize; + +pub fn default_host() -> String { + "0.0.0.0:3001".into() +} + +/// Marker trait to enable default configs +pub trait Configurable {} + +pub trait BaseConfig { + #[allow(clippy::new_ret_no_self)] + fn new(path_prefix: Option<&str>) -> Result; + fn test_config() -> T; + fn default() -> T; +} + +impl<'de, T: Deserialize<'de>> BaseConfig for T +where + T: Configurable, +{ + fn default() -> T { + T::new(None).expect("Failed to load config") + } + fn new(path: Option<&str>) -> Result { + let path = path.unwrap_or(""); + + let env_prefix = "NEAR_LIGHT_CLIENT"; + + let required = env::var(format!("{env_prefix}_CONFIG_FILE")) + .unwrap_or_else(|_| "config.toml".to_string()); + log::debug!("required file: {required}"); + + let mode = env::var(format!("{env_prefix}_MODE")) + .unwrap_or_else(|_| "testnet".into()) + .to_lowercase(); + + let mode_path = format!("{path}{mode}.toml"); + log::debug!("mode file: {mode_path}"); + + let local_path = format!("{path}local.toml"); + log::debug!("local file: {local_path}"); + + let figment = Figment::new() + .select(mode) + .merge(Toml::file(&required).nested()) + .merge(Toml::file(&local_path).nested()) + .merge( + Env::prefixed(&format!("{env_prefix}_")) + .split("__") + .global(), + ); + log::debug!("config: {figment:#?}"); + + figment.extract() + } + + fn test_config() -> T { + Self::new(Some("../../")).unwrap() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[derive(Debug, Deserialize, Clone)] + struct StubConfig {} + impl Configurable for StubConfig {} + + #[test] + fn test_default() { + std::env::set_var("NEAR_LIGHT_CLIENT_NETWORK", "fakenet"); + StubConfig::test_config(); + } +} diff --git a/crates/primitives/src/lib.rs b/crates/primitives/src/lib.rs new file mode 100644 index 00000000..f2f307b1 --- /dev/null +++ b/crates/primitives/src/lib.rs @@ -0,0 +1,26 @@ +pub mod config; + +use near_primitives_core::types::AccountId; + +// https://github.com/near/nearcore/blob/master/nearcore/src/config.rs#L133C1-L134C1 +// TODO: expose this from NP, currently this is a risk that the light client +// could be exploited if the max seats changes without knowing +// they already have, need to witness the var, TODO: create ticket +pub const NUM_BLOCK_PRODUCER_SEATS: usize = 50; + +// Used by nearcore to determine the end of the account in the state trie. +pub const ACCOUNT_DATA_SEPARATOR: u8 = b','; + +pub fn pad_account_id(account_id: &AccountId) -> [u8; AccountId::MAX_LEN] { + let account_id = account_id.as_str().as_bytes().to_vec(); + pad_account_bytes(account_id) +} + +pub fn pad_account_bytes(mut account_id: Vec) -> [u8; AccountId::MAX_LEN] { + account_id.resize(AccountId::MAX_LEN, ACCOUNT_DATA_SEPARATOR); + account_id.try_into().expect("invalid account bytes") +} + +pub mod prelude { + pub use super::config::{BaseConfig, Configurable}; +} diff --git a/crates/protocol/Cargo.toml b/crates/protocol/Cargo.toml index 3082e49a..a41213d7 100644 --- a/crates/protocol/Cargo.toml +++ b/crates/protocol/Cargo.toml @@ -18,6 +18,7 @@ near-primitives.workspace = true serde.workspace = true thiserror.workspace = true +near-light-client-primitives.workspace = true # async-trait.workspace = true # axum.workspace = true # coerce.workspace = true diff --git a/crates/protocol/src/config.rs b/crates/protocol/src/config.rs index 8e8971f5..0d28ec19 100644 --- a/crates/protocol/src/config.rs +++ b/crates/protocol/src/config.rs @@ -1,7 +1,7 @@ -// https://github.com/near/nearcore/blob/master/nearcore/src/config.rs#L133C1-L134C1 -// TODO: expose this from NP, currently this is a risk that the light client -// could be exploited if the max seats changes without knowing -pub const NUM_BLOCK_PRODUCER_SEATS: usize = 50; +use serde::Deserialize; -// Used by nearcore to determine the end of the account in the state trie. -pub const ACCOUNT_DATA_SEPARATOR: u8 = b','; +#[derive(Debug, Deserialize, Clone)] +pub struct Config { + /// The trusted head to begin the light client from + pub genesis: near_primitives::hash::CryptoHash, +} diff --git a/crates/protocol/src/lib.rs b/crates/protocol/src/lib.rs index 461d37d5..5150f3bb 100644 --- a/crates/protocol/src/lib.rs +++ b/crates/protocol/src/lib.rs @@ -1,8 +1,8 @@ -use config::NUM_BLOCK_PRODUCER_SEATS; use error::Error; pub use merkle_util::*; pub use near_crypto::{ED25519PublicKey, PublicKey, Signature}; pub use near_primitives::{ + account::id as near_account_id, block_header::{ApprovalInner, BlockHeaderInnerLite}, merkle::MerklePathItem, types::{validator_stake::ValidatorStake, BlockHeight, EpochId}, @@ -261,7 +261,11 @@ impl Protocol { let approved_stake = match Self::validate_signature(approval_message, sig, pk) { Ok(_) => approved_stake + stake, - Err(Error::SignatureInvalid) | Err(Error::ValidatorNotSigned) => approved_stake, + Err(Error::SignatureInvalid) => { + log::debug!("invalid signature: pk: {} sig: {:?}", pk, sig); + approved_stake + } + Err(Error::ValidatorNotSigned) => approved_stake, Err(_) => approved_stake, }; @@ -469,7 +473,7 @@ mod tests { &approval_message.unwrap(), ); - assert_eq!((total, approved), (440511369730158962073902098744970, 0)); + assert_eq!((total, approved), (512915271547861520119028536348929, 0)); } #[test] @@ -487,8 +491,8 @@ mod tests { assert_eq!( (total, approved), ( - 440511369730158962073902098744970, - 296239000750863364078617965755968 + 512915271547861520119028536348929, + 345140782903867823005444871054881 ) ); diff --git a/crates/protocol/src/prelude.rs b/crates/protocol/src/prelude.rs index 13c83d24..d32fa0cd 100644 --- a/crates/protocol/src/prelude.rs +++ b/crates/protocol/src/prelude.rs @@ -3,6 +3,7 @@ pub use itertools::{izip, Itertools}; pub use log::{debug, error, info, trace, warn}; pub use near_primitives::types::AccountId; pub use near_primitives_core::{ + account::id::AccountIdRef, borsh::{self, BorshDeserialize, BorshSerialize}, hash::CryptoHash, }; diff --git a/crates/rpc/Cargo.toml b/crates/rpc/Cargo.toml index 2e32c324..e30a32f7 100644 --- a/crates/rpc/Cargo.toml +++ b/crates/rpc/Cargo.toml @@ -8,26 +8,14 @@ version.workspace = true anyhow.workspace = true async-trait.workspace = true borsh.workspace = true -either.workspace = true futures.workspace = true itertools.workspace = true log.workspace = true -near-crypto.workspace = true near-jsonrpc-client.workspace = true near-jsonrpc-primitives.workspace = true near-primitives-core.workspace = true near-primitives.workspace = true serde.workspace = true -thiserror.workspace = true - -# async-trait.workspace = true -# axum.workspace = true -# coerce.workspace = true -# config.workspace = true -# near-jsonrpc-client.workspace = true -# protobuf.workspace = true -# reqwest.workspace = true -# sled.workspace = true [dev-dependencies] hex.workspace = true diff --git a/crates/rpc/src/lib.rs b/crates/rpc/src/lib.rs index f82fc66b..4286664c 100644 --- a/crates/rpc/src/lib.rs +++ b/crates/rpc/src/lib.rs @@ -5,12 +5,14 @@ use std::{ use async_trait::async_trait; use futures::TryFutureExt; -use near_jsonrpc_client::{ +use near_jsonrpc_client::methods::EXPERIMENTAL_protocol_config::RpcProtocolConfigResponse; +pub use near_jsonrpc_client::{ methods::{self, light_client_proof::RpcLightClientExecutionProofResponse}, JsonRpcClient, }; -use near_primitives::{ +pub use near_primitives::{ block_header::BlockHeader, + types::{BlockId, BlockReference, TransactionOrReceiptId}, views::{validator_stake_view::ValidatorStakeView, LightClientBlockView}, }; @@ -86,9 +88,9 @@ impl std::fmt::Debug for NearRpcClient { } impl NearRpcClient { - pub fn new(network: Network) -> Self { - let client = JsonRpcClient::connect(network.to_endpoint()); - let archive = JsonRpcClient::connect(network.archive_endpoint()); + pub fn new(config: &Config) -> Self { + let client = JsonRpcClient::connect(config.network.to_endpoint()); + let archive = JsonRpcClient::connect(config.network.archive_endpoint()); NearRpcClient { client, archive } } @@ -138,6 +140,10 @@ pub trait LightClientRpc { ) -> Result; async fn fetch_epoch_bps(&self, epoch_id: &CryptoHash) -> Result>; async fn fetch_header(&self, hash: &CryptoHash) -> Result
; + async fn fetch_protocol_config( + &self, + block_id: &BlockReference, + ) -> Result; } #[async_trait] @@ -219,6 +225,33 @@ impl LightClientRpc for NearRpcClient { }) .map_err(|e| anyhow::format_err!("{:?}:{}", epoch_id, e)) } + + async fn fetch_protocol_config( + &self, + block_reference: &BlockReference, + ) -> Result { + let req = methods::EXPERIMENTAL_protocol_config::RpcProtocolConfigRequest { + block_reference: block_reference.clone(), + }; + self.client + .call(&req) + .or_else(|e| { + trace!("Error hitting main rpc, falling back to archive: {:?}", e); + self.archive.call(&req) + }) + .await + .map_err(|e| anyhow::format_err!("{:?}", e)) + } +} + +#[derive(Debug, Deserialize, Clone)] +pub struct Config { + pub network: Network, +} +impl From for Config { + fn from(network: Network) -> Self { + Config { network } + } } #[cfg(test)] @@ -298,7 +331,7 @@ mod tests { // this is committed in the repo, only needed for gathering data #[allow(dead_code)] async fn test_get_ids() { - let client = NearRpcClient::new(Network::Testnet); + let client = NearRpcClient::new(&(Network::Testnet.into())); let first_block = fetch_block( &client, diff --git a/crates/test-utils/Cargo.toml b/crates/test-utils/Cargo.toml index 9c513696..ccf7d634 100644 --- a/crates/test-utils/Cargo.toml +++ b/crates/test-utils/Cargo.toml @@ -5,27 +5,11 @@ name = "test-utils" version.workspace = true [dependencies] -anyhow.workspace = true -borsh.workspace = true derive_more.workspace = true -either.workspace = true -itertools.workspace = true log.workspace = true -near-crypto.workspace = true -near-jsonrpc-primitives.workspace = true near-light-client-protocol.workspace = true -near-primitives-core.workspace = true near-primitives.workspace = true pretty_assertions.workspace = true -serde.workspace = true -thiserror.workspace = true -# async-trait.workspace = true -# near-jsonrpc-client.workspace = true -# protobuf.workspace = true -# reqwest.workspace = true -# sled.workspace = true - -hex.workspace = true pretty_env_logger.workspace = true -rand = "*" +serde.workspace = true serde_json.workspace = true diff --git a/default.toml b/default.toml deleted file mode 100644 index 11609af1..00000000 --- a/default.toml +++ /dev/null @@ -1,4 +0,0 @@ -catchup = false -network = "Testnet" -starting_head = "4zwZQzjQDpimeLK3tX39nzok6UjDU9edS57EFhkAa4Sk" -state_path = "state.db" diff --git a/environments/local.bru b/environments/local.bru new file mode 100644 index 00000000..7ce1d589 --- /dev/null +++ b/environments/local.bru @@ -0,0 +1,14 @@ +vars { + succinctBaseUrl: https://alpha.succinct.xyz/api + nearBaseUrl: https://archival-rpc.testnet.near.org + lightClientBaseUrl: http://0.0.0.0:3030 + operatorBaseUrl: http://0.0.0.0:3001 + gitRef: 700edd24ac1666307f3f740e36bf4c5808c26e1b +} +vars:secret [ + succinctApiKey, + succinctSession, + version, + releaseId, + releaseNum, +] diff --git a/environments/testnet.bru b/environments/testnet.bru new file mode 100644 index 00000000..d6d7d9cd --- /dev/null +++ b/environments/testnet.bru @@ -0,0 +1,14 @@ +vars { + succinctBaseUrl: https://alpha.succinct.xyz/api + nearBaseUrl: https://archival-rpc.testnet.near.org + lightClientBaseUrl: http://0.0.0.0:3030 + operatorBaseUrl: http://0.0.0.0:3030 + gitRef: 700edd24ac1666307f3f740e36bf4c5808c26e1b +} +vars:secret [ + succinctApiKey, + succinctSession, + version, + releaseId, + releaseNum, +] diff --git a/fixtures/deployments.json b/fixtures/deployments.json new file mode 100644 index 00000000..630ef17f --- /dev/null +++ b/fixtures/deployments.json @@ -0,0 +1,219 @@ +[ + { + "id": 393, + "address": "0x145692522b9518ad1b59fe50d46a0aa6ae713b0b", + "chain_id": 421614, + "function_id": "0xfb248286ff8fea7e389e439fbcddbe3fb216a1f35fc259f5bb00d26a5bc51617", + "owner": "0x470353d38125b7c2caf0b4a3b89512b9f092063a", + "salt": "0x3e77f08c6cc5dd9543097916581cdaf26996d26ecee393887cfe5f9b065fad26", + "gateway": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "tx_hash": "0xa35d4b8e954cc824b36070557d78b8bdad0d557850420c262af9232670773991", + "created_at": "2024-03-18T09:49:42.774932Z", + "updated_at": "2024-03-18T09:49:42.774932Z", + "edges": { + "release": { + "id": "2e6ac09f-585a-4a41-847e-c13c42860526", + "number": 12, + "name": "Verify: dev", + "project_id": "00000000-0000-0000-0000-000000000000", + "entrypoint": "verify", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + }, + "creator": { + "id": 257, + "gh_login": "dndll", + "gh_access_token_expired_at": "0001-01-01T00:00:00Z", + "whitelisted": false, + "edges": {} + } + } + }, + { + "id": 392, + "address": "0x255e82c1e3033a604af5035af2b9c89e657cc37c", + "chain_id": 421614, + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "owner": "0x470353d38125b7c2caf0b4a3b89512b9f092063a", + "salt": "0x3f71bcee52116e3971e363bf2fcbf901a1a73e0075760e7620e05e5dc63d248c", + "gateway": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "tx_hash": "0xb26618eaa42375f4d8e72dd6abe478db90cd7ccc64173aa36fe7a982eda0157b", + "created_at": "2024-03-18T09:49:26.338036Z", + "updated_at": "2024-03-18T09:49:26.338036Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "name": "Sync: dev", + "project_id": "00000000-0000-0000-0000-000000000000", + "entrypoint": "sync", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + }, + "creator": { + "id": 257, + "gh_login": "dndll", + "gh_access_token_expired_at": "0001-01-01T00:00:00Z", + "whitelisted": false, + "edges": {} + } + } + }, + { + "id": 391, + "address": "0xc7ad2f0e0e49cb9d12e0ab077fa0f15d0f85911f", + "chain_id": 11155111, + "function_id": "0xc578c8451a0c281bece6ab12a0f4c2110169068813589720b74609c8eaded6d6", + "owner": "0x470353d38125b7c2caf0b4a3b89512b9f092063a", + "salt": "0xfdfa38403b854dcefd726ec01c59e2a38387355edf6d60f7b1a49ece86d4197d", + "gateway": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "tx_hash": "0x07a90cdcf5956a1d90592192a9d9f073aa515a9c8e1a67b3c217448e6f22be33", + "created_at": "2024-03-18T09:30:52.211858Z", + "updated_at": "2024-03-18T09:30:52.211859Z", + "edges": { + "release": { + "id": "2e6ac09f-585a-4a41-847e-c13c42860526", + "number": 12, + "name": "Verify: dev", + "project_id": "00000000-0000-0000-0000-000000000000", + "entrypoint": "verify", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + }, + "creator": { + "id": 257, + "gh_login": "dndll", + "gh_access_token_expired_at": "0001-01-01T00:00:00Z", + "whitelisted": false, + "edges": {} + } + } + }, + { + "id": 390, + "address": "0x0450745203701a6d04af99d201568d3879772c66", + "chain_id": 11155111, + "function_id": "0x506a8e4e52f3de38548fd122fbd193ca1aedf2cd7df87d65d5c661e8783709b0", + "owner": "0x470353d38125b7c2caf0b4a3b89512b9f092063a", + "salt": "0x2e99a89a810a78fc094079b239d54ede68ae013c6050f866db3b1186f357036b", + "gateway": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "tx_hash": "0x1c343711806aa85ccac77e8103c1644bae0261f42bc334fc5034217a072bbf0c", + "created_at": "2024-03-18T09:30:33.440769Z", + "updated_at": "2024-03-18T09:30:33.44077Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "name": "Sync: dev", + "project_id": "00000000-0000-0000-0000-000000000000", + "entrypoint": "sync", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + }, + "creator": { + "id": 257, + "gh_login": "dndll", + "gh_access_token_expired_at": "0001-01-01T00:00:00Z", + "whitelisted": false, + "edges": {} + } + } + }, + { + "id": 338, + "address": "0x9c8515caf27200a5aaed883301ec7f64c334ca81", + "chain_id": 11155111, + "function_id": "0x40041eb07332e45ca8716d35cabf07a11ebc1a8ae7327321b1c427c73dc44ded", + "owner": "0x53ecf6e5918fa051213dc5c072d52864f1a3588c", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "gateway": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "tx_hash": "0x8150d7b22b6c90b6f3833e3cc46a0d79b4a1ce2e140a283e9438d9e1973e548c", + "created_at": "2024-03-05T16:08:05.321794Z", + "updated_at": "2024-03-05T16:08:05.321795Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "name": "Verify: v0.0.4-rc.1", + "project_id": "00000000-0000-0000-0000-000000000000", + "entrypoint": "verify", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + }, + "creator": { + "id": 257, + "gh_login": "dndll", + "gh_access_token_expired_at": "0001-01-01T00:00:00Z", + "whitelisted": false, + "edges": {} + } + } + }, + { + "id": 333, + "address": "0x434fc8515affab3934bb995cc11a1f2688d1d1bc", + "chain_id": 11155111, + "function_id": "0xbba506d06307066be40ba5e88597e6884f878979122feb3432e54c683a5f5169", + "owner": "0x53ecf6e5918fa051213dc5c072d52864f1a3588c", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "gateway": "0x0000000000000000000000000000000000000000", + "tx_hash": "0x09d3b0de9cd4d633dc035be9b2c7d03f4a281f862aa8a0a01514c96ac214e309", + "created_at": "2024-03-04T15:43:12.255799Z", + "updated_at": "2024-03-04T15:43:12.255799Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "name": "Verify: v0.0.4-rc.1", + "project_id": "00000000-0000-0000-0000-000000000000", + "entrypoint": "verify", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + }, + "creator": { + "id": 257, + "gh_login": "dndll", + "gh_access_token_expired_at": "0001-01-01T00:00:00Z", + "whitelisted": false, + "edges": {} + } + } + }, + { + "id": 331, + "address": "0xe3aec8074468e3aa59252541adec0e64f9d5e523", + "chain_id": 17000, + "function_id": "0xe35f3f45f386b546d2eace4276820609ba0c9c5e9463a9d7d3df2674a8f0cc7c", + "owner": "0x53ecf6e5918fa051213dc5c072d52864f1a3588c", + "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", + "gateway": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "tx_hash": "0x706b8db4fddacd1a7d4871ebd0fc876415179822d5853e0f9bc5ae0d2b049f00", + "created_at": "2024-03-04T15:20:27.585405Z", + "updated_at": "2024-03-04T15:20:27.585405Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "name": "Verify: v0.0.4-rc.1", + "project_id": "00000000-0000-0000-0000-000000000000", + "entrypoint": "verify", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + }, + "creator": { + "id": 257, + "gh_login": "dndll", + "gh_access_token_expired_at": "0001-01-01T00:00:00Z", + "whitelisted": false, + "edges": {} + } + } + } +] diff --git a/fixtures/get_proofs.json b/fixtures/get_proofs.json new file mode 100644 index 00000000..8762b3f4 --- /dev/null +++ b/fixtures/get_proofs.json @@ -0,0 +1,1161 @@ +[ + { + "id": "705554c2-0c57-4413-b98e-b6fa795c40d7", + "status": "failure", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xeff7dccf304315aa520ad7e704062a8b8deadc5c0906e7e16d7305067a72a57e" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T16:09:15.296817Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "87f83a90-4395-498c-bc0a-dcd3ff450402", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "7/fczzBDFapSCtfnBAYqi43q3FwJBufhbXMFBnpypX4=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUe/33M8wQxWqUgrX5wQGKouN6txcCQbn4W1zBQZ6cqV+", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "pending", + "created_at": "2024-03-18T16:09:10.734035Z", + "updated_at": "2024-03-18T16:09:15.29794Z", + "edges": {} + } + ] + } + }, + { + "id": "56197c16-1522-4858-b8e2-45af2d31a85e", + "status": "failure", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xeff7dccf304315aa520ad7e704062a8b8deadc5c0906e7e16d7305067a72a57e" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T15:39:10.874311Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "66375151-6cdc-424e-83d7-f8150c7841cc", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "7/fczzBDFapSCtfnBAYqi43q3FwJBufhbXMFBnpypX4=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUe/33M8wQxWqUgrX5wQGKouN6txcCQbn4W1zBQZ6cqV+", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "pending", + "created_at": "2024-03-18T15:39:10.754351Z", + "updated_at": "2024-03-18T15:39:10.875786Z", + "edges": {} + } + ] + } + }, + { + "id": "a26aca88-dcca-48ed-aa66-2a185bcab05e", + "status": "failure", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xeff7dccf304315aa520ad7e704062a8b8deadc5c0906e7e16d7305067a72a57e" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T15:09:16.288382Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "a43f7b20-aebc-40c2-b7f3-5f91fdec0a68", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "7/fczzBDFapSCtfnBAYqi43q3FwJBufhbXMFBnpypX4=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUe/33M8wQxWqUgrX5wQGKouN6txcCQbn4W1zBQZ6cqV+", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "pending", + "created_at": "2024-03-18T15:09:11.530254Z", + "updated_at": "2024-03-18T15:09:16.289585Z", + "edges": {} + } + ] + } + }, + { + "id": "cde59ba0-a60b-4721-b96c-61401ff28852", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0x6a6441abfaefab6d9d6a57d331bb3f2e6dbfdc9650a3abfb400963a3a1a4109f" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T14:39:11.718599Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "64bb0a1e-2695-42c8-aee3-9d8c1b17b379", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "pPNrmpyIUhHNKj+UckoAdtCHwPE2zKPP4LDBGOALXWM=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "amRBq/rvq22dalfTMbs/Lm2/3JZQo6v7QAljo6GkEJ8=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUWpkQav676ttnWpX0zG7Py5tv9yWUKOr+0AJY6OhpBCf", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T14:39:11.214569Z", + "updated_at": "2024-03-18T14:42:50.112555Z", + "edges": {} + } + ] + } + }, + { + "id": "f757bd21-4112-4504-a972-3cf41542fc9a", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xbfbf7bf940b94562b3026778eb08c4c7cd3af43865ef705e3254bf6b7d5006a3" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T14:09:12.227044Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "e092f8ae-022a-4c79-b70e-6ad2b58e431f", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "507clqblrk/OsCC3oiJOIQJmvaPTGB3m6eY+sHxvcNk=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "v797+UC5RWKzAmd46wjEx8069Dhl73BeMlS/a31QBqM=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUb+/e/lAuUViswJneOsIxMfNOvQ4Ze9wXjJUv2t9UAaj", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T14:09:10.948818Z", + "updated_at": "2024-03-18T14:13:20.492489Z", + "edges": {} + } + ] + } + }, + { + "id": "d0e2b421-b3f6-4fbc-ae57-4725609225ab", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0x782468f57998d8b2514c367d62d39254e427cb71a45461fbc68729b2c79f2cc4" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T13:39:12.706978Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "025bb9e8-31be-476e-a2e3-f57bdf179fd4", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "Lh5wfLFadGp8q5hi+xUjsSGwi/2lILd0pLeVk08L30U=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "eCRo9XmY2LJRTDZ9YtOSVOQny3GkVGH7xocpssefLMQ=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUXgkaPV5mNiyUUw2fWLTklTkJ8txpFRh+8aHKbLHnyzE", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T13:39:10.742376Z", + "updated_at": "2024-03-18T13:42:20.276059Z", + "edges": {} + } + ] + } + }, + { + "id": "0a426706-31b8-4b4f-8d5a-8583b8ac85f6", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xa6ab63ce88fdebbaffe6da94e7407d9a005dc87797ec9026877c58f777c26a02" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T13:09:13.341573Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "6393b2b8-4a2a-4105-a19d-05d1850f19d6", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "r8HvvNghE/T0vFFbYh9CCrpfThBHGR5r63rdE4upwKM=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "pqtjzoj967r/5tqU50B9mgBdyHeX7JAmh3xY93fCagI=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUaarY86I/eu6/+balOdAfZoAXch3l+yQJod8WPd3wmoC", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T13:09:10.730517Z", + "updated_at": "2024-03-18T13:12:20.326129Z", + "edges": {} + } + ] + } + }, + { + "id": "5686c544-b213-45d1-af79-1c6f00fd3510", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0x09512fa832f460054d85d29b4cf51f85cad939c0075574dc29813b763f06954b" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T12:39:13.964311Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "b87f7d14-37ab-4fd3-b1c5-fcb5599ab336", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "zHUveDpVijHjLkutp3TWK6/rKIQGgaDSHJlW8TCI+zg=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "CVEvqDL0YAVNhdKbTPUfhcrZOcAHVXTcKYE7dj8GlUs=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUQlRL6gy9GAFTYXSm0z1H4XK2TnAB1V03CmBO3Y/BpVL", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T12:39:10.755999Z", + "updated_at": "2024-03-18T12:42:20.020214Z", + "edges": {} + } + ] + } + }, + { + "id": "13e1bc4f-d6b4-44b3-9a7d-a1011fb5e989", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xe099126078388822539e74c477bf6eb7e405ea2f6af95f34af02e89aff1c0f8c" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T12:09:14.383979Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "b96fe7a0-745c-411a-9895-b273e7f6bf12", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "5lWCx+812MDUccJ8+IvwtcsdJI/GXrmc3jGgkXVGGKg=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "4JkSYHg4iCJTnnTEd79ut+QF6i9q+V80rwLomv8cD4w=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUeCZEmB4OIgiU550xHe/brfkBeovavlfNK8C6Jr/HA+M", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T12:09:10.99944Z", + "updated_at": "2024-03-18T12:12:50.059651Z", + "edges": {} + } + ] + } + }, + { + "id": "233771b9-dbe8-4b80-80ed-a35ae1952f41", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0x34158345953048f70b47f5784982fed4c4e4f28f433c64c6481553703e9810d5" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T11:33:54.093285Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "9af5a516-e2b0-447a-bd13-833dd4fadab8", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "sRNG5pXZtp1zcYCReaeXSMlwQN9jtb4OP5eFpcTk4jk=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "NBWDRZUwSPcLR/V4SYL+1MTk8o9DPGTGSBVTcD6YENU=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUTQVg0WVMEj3C0f1eEmC/tTE5PKPQzxkxkgVU3A+mBDV", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T11:33:49.153019Z", + "updated_at": "2024-03-18T11:37:20.102661Z", + "edges": {} + } + ] + } + }, + { + "id": "f320be9c-d662-42ad-91cc-a13a6d7f285b", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xa2fd5655ff2f74c0fae7843653a731f1ab91c10c082a9ead01a18af02d79908d" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T11:24:52.723936Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "92bc9805-8d5b-4fe0-8cc6-d0deab965f95", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "5RwvBUDL/LEKgnS7mx45sDq1mrQr7StQY9fXVV1ES1U=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "ov1WVf8vdMD654Q2U6cx8auRwQwIKp6tAaGK8C15kI0=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUaL9VlX/L3TA+ueENlOnMfGrkcEMCCqerQGhivAteZCN", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T11:24:48.052637Z", + "updated_at": "2024-03-18T11:28:20.511018Z", + "edges": {} + } + ] + } + }, + { + "id": "582276cc-62f0-4728-9a20-86f260c09874", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "2e6ac09f-585a-4a41-847e-c13c42860526", + "data": { + "input": "0xa2fd5655ff2f74c0fae7843653a731f1ab91c10c082a9ead01a18af02d79908d01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a49e07cc9add37cced107ee8f1c5d1724792925dd5ed24c912158b8c13d9d9b36465762d313730353330373933353634302d33333734353230323038363032332c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00265ebe9ff4f941a961e8ce217a32442fff9fc6ef24d78ed47fa060ade1bce1336465762d313730353330373933353635392d31313834353434333436323035342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0012b32ec03f69a4f9e60f6c5d37e66002806e75cdb53957101cc0890c90633cc3746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c48635b03ec4cf4c36e4def535ddfdb051d60f385789d7ce39fbee2982b77a0746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01723736dcce51f837993573433fdc6f913d909ffacca29d704901ba397b553b9d706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014c307efe3e8f4487959d8e370fa6d48bd8783dff3b89a8b9851a73ce6a537bd075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009cf222fb550321ce78b68222bee7a2981d39824f475514c402c0f31f205234ad76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c225fa4ce35677204c899a0865c6a6a0f476a9d442a79eb0f94c52866cc7f0ea7931726966746533713962642e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ebb6c77273f31466c5f9a15fbe562c77e44b89b480d1e9757574fc66b959d4a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00344b2392c64731ff2ec8caae467f87309671b9546710a85e6c3598eee9f716ff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eb5e2e11de5b6367f922a9858781b28b083193dacf785142593d233565db64b76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c010c7f2373b7082fb1bd515a261e3f0d0727db493538d94660f7990ae76cbedf916f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e5756d2be638d13ee2ba79928a5ad23d52dbe9643e8fa9b7f915be2e687a91db6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00040374be2ed1932ed9daa32bab4b5bb4c00470ca00694c50472f8c334c96862561737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b47e9c92be55286eb6af4df92bd4aa3aee6322fff4646ddfe01b958dd2f4095d686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0086b171fc9678bf982345a8987a046c7fa0c43aae3bfd15d1b34a79cb4d03d71661737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00197a69c790d14a4bde0f6f3b1e454176726f932a62558608d0914586521d2e0f61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003931d08de61711eb2dfb48ad6ba8ecd3c21306f525a61c73c7f9d698696c3e816f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e61e10746bd3a4d24f74c1feca4fb86c5ebb437e4d127c9875ca5f35ba6fe20f77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090a9b640e45c3e817d0441fd69fc23b08f478ed0bc9d50990c0e58a2f4c35cd26f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e11a6147076ae83cd3387d8eb283a4c712dd4d354bae417455491507667a87f56f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f0f0f7aba1fa1f039740decb8f4c6e3367a4ed9a87810abfda6ca0d456dd0f35706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014b2fa42d3e913c40d6de6535426b27f106d81c29e05b50d62f935ae7228f1c84746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0167c562d961d17b291f13ac6a7f8cc0f2e8fd0ba9e8613ab876346027b5c587e7746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00089bed4c328a6a7da6808d5a3ecbd8b9aa34218b5118cd6310e0775f3341b40c686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c606cf6b2c7a75ebabc673a2f0d9f7888e4e73cad62f6b22761b9856e49ef4d76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0068e4ef9d310be1fdd2d39acaf3763739ddbd3e2f47b460ac2c185b08822bfc7c6465762d313730353330373935313134342d33393738343531303336313532312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005f875f84b40f7d33e6ea1f9be6f1cb4b46c8426bf203ff0371988197a916bf126465762d313730353330373935313135372d34363239353633303039393932312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c427f737e7de0edb3003eee28c0ed631882ca0b77daa43cd77ac847873f634aa706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00fd991da49a08b4defb4404350eccd92c1b103ed1f5cbfae8ac6f546f3178a0a4746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f733369a9ee8d964a2b0114698cebe555828ee568320db535a1b868d3cf3807e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "2e6ac09f-585a-4a41-847e-c13c42860526", + "created_at": "2024-03-18T11:01:19.287592Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "2e6ac09f-585a-4a41-847e-c13c42860526", + "number": 12, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "533a983c-ec21-456c-a1dc-79965df9de5f", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "uLPS5EZ1OhcY7YQ4vGRgsMjsbVGSyeglqdntENWP3ic=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0xfb248286ff8fea7e389e439fbcddbe3fb216a1f35fc259f5bb00d26a5bc51617", + "input": "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", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "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", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T11:01:17.380183Z", + "updated_at": "2024-03-18T11:12:20.214561Z", + "edges": {} + } + ] + } + }, + { + "id": "19a4ee71-6aac-436a-b481-cdc4d03105b6", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0xc39570607d11a6d0c0c67e64027b08cc3c975ecac8fbc3cbd26248a8ca1c49c3" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T10:55:13.426979Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "1ef063b8-316b-4910-90d4-cc8280c28fdd", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "dS/iwilOs9It8+X1+m0+i3xD7LIIaQQi/B/N6PZJdZg=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "w5VwYH0RptDAxn5kAnsIzDyXXsrI+8PL0mJIqMocScM=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUcOVcGB9EabQwMZ+ZAJ7CMw8l17KyPvDy9JiSKjKHEnD", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T10:55:10.916607Z", + "updated_at": "2024-03-18T10:58:20.231629Z", + "edges": {} + } + ] + } + }, + { + "id": "3dcaeed9-b467-4d4f-bfb5-c22bac100527", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T10:26:49.285113Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "76688871-5262-4384-9891-0a68fe7a2efb", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "wIpFeizagIDMlDCHcE/PvPBU6jqZfzsBcamhVW3ZFug=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "Y7hxkP+6o219q1D5GP429wqyaRCg6deXFh4jVlYVmOM=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUWO4cZD/uqNtfatQ+Rj+NvcKsmkQoOnXlxYeI1ZWFZjj", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T10:26:47.211718Z", + "updated_at": "2024-03-18T10:30:20.026064Z", + "edges": {} + } + ] + } + }, + { + "id": "1fa7cd5e-5de8-41a3-a826-10eb6352897b", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "data": { + "input": "0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e301026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a49e07cc9add37cced107ee8f1c5d1724792925dd5ed24c912158b8c13d9d9b36465762d313730353330373933353634302d33333734353230323038363032332c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00265ebe9ff4f941a961e8ce217a32442fff9fc6ef24d78ed47fa060ade1bce1336465762d313730353330373933353635392d31313834353434333436323035342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0012b32ec03f69a4f9e60f6c5d37e66002806e75cdb53957101cc0890c90633cc3746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c48635b03ec4cf4c36e4def535ddfdb051d60f385789d7ce39fbee2982b77a0746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01723736dcce51f837993573433fdc6f913d909ffacca29d704901ba397b553b9d706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014c307efe3e8f4487959d8e370fa6d48bd8783dff3b89a8b9851a73ce6a537bd075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009cf222fb550321ce78b68222bee7a2981d39824f475514c402c0f31f205234ad76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c225fa4ce35677204c899a0865c6a6a0f476a9d442a79eb0f94c52866cc7f0ea7931726966746533713962642e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ebb6c77273f31466c5f9a15fbe562c77e44b89b480d1e9757574fc66b959d4a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00344b2392c64731ff2ec8caae467f87309671b9546710a85e6c3598eee9f716ff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eb5e2e11de5b6367f922a9858781b28b083193dacf785142593d233565db64b76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c010c7f2373b7082fb1bd515a261e3f0d0727db493538d94660f7990ae76cbedf916f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e5756d2be638d13ee2ba79928a5ad23d52dbe9643e8fa9b7f915be2e687a91db6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00040374be2ed1932ed9daa32bab4b5bb4c00470ca00694c50472f8c334c96862561737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b47e9c92be55286eb6af4df92bd4aa3aee6322fff4646ddfe01b958dd2f4095d686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0086b171fc9678bf982345a8987a046c7fa0c43aae3bfd15d1b34a79cb4d03d71661737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00197a69c790d14a4bde0f6f3b1e454176726f932a62558608d0914586521d2e0f61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003931d08de61711eb2dfb48ad6ba8ecd3c21306f525a61c73c7f9d698696c3e816f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e61e10746bd3a4d24f74c1feca4fb86c5ebb437e4d127c9875ca5f35ba6fe20f77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090a9b640e45c3e817d0441fd69fc23b08f478ed0bc9d50990c0e58a2f4c35cd26f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e11a6147076ae83cd3387d8eb283a4c712dd4d354bae417455491507667a87f56f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f0f0f7aba1fa1f039740decb8f4c6e3367a4ed9a87810abfda6ca0d456dd0f35706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014b2fa42d3e913c40d6de6535426b27f106d81c29e05b50d62f935ae7228f1c84746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0167c562d961d17b291f13ac6a7f8cc0f2e8fd0ba9e8613ab876346027b5c587e7746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00089bed4c328a6a7da6808d5a3ecbd8b9aa34218b5118cd6310e0775f3341b40c686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c606cf6b2c7a75ebabc673a2f0d9f7888e4e73cad62f6b22761b9856e49ef4d76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0068e4ef9d310be1fdd2d39acaf3763739ddbd3e2f47b460ac2c185b08822bfc7c6465762d313730353330373935313134342d33393738343531303336313532312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005f875f84b40f7d33e6ea1f9be6f1cb4b46c8426bf203ff0371988197a916bf126465762d313730353330373935313135372d34363239353633303039393932312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c427f737e7de0edb3003eee28c0ed631882ca0b77daa43cd77ac847873f634aa706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00fd991da49a08b4defb4404350eccd92c1b103ed1f5cbfae8ac6f546f3178a0a4746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f733369a9ee8d964a2b0114698cebe555828ee568320db535a1b868d3cf3807e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "created_at": "2024-03-13T17:53:42.273362Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + } + } + }, + { + "id": "dbe0d3ed-e865-4156-ad46-e411e393158d", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "data": { + "input": "0xdaf909af5b24b30011f952baccbdab560b1e16bd2d16efabb9f2ee3ffee398fa009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0024e2d4f8d3394fabea1a8ac255ec3ef9c6e14cc90e8e45c1d185f9a858d484107a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000a594de1c36eca52f15d9f7d4177515570f3a6966e5ac51da1ce4abb7e496c6a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00311fa837e07749c47b2825d06dd14d3aa6f438e2e1cc69857b737d0104ac080576325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f454878ba125cc5f380439ee3c3e6510e8d66e7adcb70e59951bcf51c2916d5686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0156b47c3c713180318844195b0e0e29810c5f099fe19411eaf116d55b3f6d1f96706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0027d1be4cbf7826333bb3a66339314d6b23088907bc03abe8e1f0402f6b8e99fb6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d6c0e7346e597949cf4ef07e57b029426cac6d2a0e80761b07aaa83e5622fe16f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f4bf0c2de11327648a0b56a170029f349308fc88d64badffaf4b1575a0444056f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ae58764b2108d1e23de28591a61e52e6fdeb49f0985ab6bf5f332e338db742f877616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000e7d92ca3c2fbd087783533f3e3c493881189b9e95829763ee2222d5ef50524361737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0010478412784e05112c2ab987ce3d691a1f8d284f5e80d71d573229b6d643563b61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009eac5b84d08bbf7716b595fc0d10686ead30355e5b7a8c9305ac02240823513961737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0124e495308164a0a97925a27e59fadec0c6fc59de23c5ffaef3ff30a2c513d51a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133fb9d5f75d87a3cf8eca81ad16c669a686aac61fc514a6cf1159e739618c2e86f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d6c2a78d92595947756cc38ad2fb077984f691ebbba0d1db03c2cbed071d16ef6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133f6198c994c4ca12b360abc226c232f1dd46bef6c5be02c39278b8de8ea04696f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003d268ee173d6cbe5f0c0efa3833fe6590950938cb7b24b15957587fd0380729375736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008be60e1ba421b4c0cf104749bd2f322f6d985763053b347bf68c6000908aa693796b616a753261386a6366672e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002aa060c38662a90fa07a34b800cd3c84360d894dc4bec1c81a7b41d3eb282092706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006674894d631ca3e373a87b27ea614f16468fa9ddaf401f079d93359f14f29f6e72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bc656c82f3aed97695b555e49b55e584f960197f092a53ac9bcc3f872125436476325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a988b23956e4e5ab00dd3d16decdd0714554562ae9fbfae9053acca1a91f37cc75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00883c8876a557200a3b14ad46b0646af75750403ab3cb5ff04ef6a72f4f71b7786175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d916068721ec0d451382e00bebd8f4f713321e3bde850c36463517d6c50115c5706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01bf4b51df07bf9819b996b720eadafc5323ec7a2ad7fc0555190771faaa582d3272656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1e6131d4648085ea2f1e23ba516e6d03a05c6448c30639b1b082c8650544506686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00956fff9f472d68ff61b7c3e88b678738f5082e44ca40277cb394501a86d8b42177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005ef99fadc671ee47c6015c92351d2c172995832ac01ecd1e8b8ceae3722ccc296f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "created_at": "2024-03-12T11:46:05.705302Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + } + } + }, + { + "id": "c3f9a7ad-b9d1-44d6-83fb-55894f56f2e6", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "data": { + "input": "0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0024e2d4f8d3394fabea1a8ac255ec3ef9c6e14cc90e8e45c1d185f9a858d484107a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000a594de1c36eca52f15d9f7d4177515570f3a6966e5ac51da1ce4abb7e496c6a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00311fa837e07749c47b2825d06dd14d3aa6f438e2e1cc69857b737d0104ac080576325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f454878ba125cc5f380439ee3c3e6510e8d66e7adcb70e59951bcf51c2916d5686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0156b47c3c713180318844195b0e0e29810c5f099fe19411eaf116d55b3f6d1f96706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0027d1be4cbf7826333bb3a66339314d6b23088907bc03abe8e1f0402f6b8e99fb6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d6c0e7346e597949cf4ef07e57b029426cac6d2a0e80761b07aaa83e5622fe16f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f4bf0c2de11327648a0b56a170029f349308fc88d64badffaf4b1575a0444056f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ae58764b2108d1e23de28591a61e52e6fdeb49f0985ab6bf5f332e338db742f877616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000e7d92ca3c2fbd087783533f3e3c493881189b9e95829763ee2222d5ef50524361737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0010478412784e05112c2ab987ce3d691a1f8d284f5e80d71d573229b6d643563b61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009eac5b84d08bbf7716b595fc0d10686ead30355e5b7a8c9305ac02240823513961737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0124e495308164a0a97925a27e59fadec0c6fc59de23c5ffaef3ff30a2c513d51a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133fb9d5f75d87a3cf8eca81ad16c669a686aac61fc514a6cf1159e739618c2e86f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d6c2a78d92595947756cc38ad2fb077984f691ebbba0d1db03c2cbed071d16ef6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133f6198c994c4ca12b360abc226c232f1dd46bef6c5be02c39278b8de8ea04696f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003d268ee173d6cbe5f0c0efa3833fe6590950938cb7b24b15957587fd0380729375736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008be60e1ba421b4c0cf104749bd2f322f6d985763053b347bf68c6000908aa693796b616a753261386a6366672e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002aa060c38662a90fa07a34b800cd3c84360d894dc4bec1c81a7b41d3eb282092706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006674894d631ca3e373a87b27ea614f16468fa9ddaf401f079d93359f14f29f6e72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bc656c82f3aed97695b555e49b55e584f960197f092a53ac9bcc3f872125436476325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a988b23956e4e5ab00dd3d16decdd0714554562ae9fbfae9053acca1a91f37cc75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00883c8876a557200a3b14ad46b0646af75750403ab3cb5ff04ef6a72f4f71b7786175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d916068721ec0d451382e00bebd8f4f713321e3bde850c36463517d6c50115c5706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01bf4b51df07bf9819b996b720eadafc5323ec7a2ad7fc0555190771faaa582d3272656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1e6131d4648085ea2f1e23ba516e6d03a05c6448c30639b1b082c8650544506686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00956fff9f472d68ff61b7c3e88b678738f5082e44ca40277cb394501a86d8b42177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005ef99fadc671ee47c6015c92351d2c172995832ac01ecd1e8b8ceae3722ccc296f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "created_at": "2024-03-11T10:10:06.37889Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + } + } + }, + { + "id": "3ad14ac2-da9d-4c4f-87fd-7023860d3dcc", + "status": "failure", + "proof_request": { + "type": "req_bytes", + "releaseId": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "data": { + "input": "0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0024e2d4f8d3394fabea1a8ac255ec3ef9c6e14cc90e8e45c1d185f9a858d484107a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000a594de1c36eca52f15d9f7d4177515570f3a6966e5ac51da1ce4abb7e496c6a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00311fa837e07749c47b2825d06dd14d3aa6f438e2e1cc69857b737d0104ac080576325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f454878ba125cc5f380439ee3c3e6510e8d66e7adcb70e59951bcf51c2916d5686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0156b47c3c713180318844195b0e0e29810c5f099fe19411eaf116d55b3f6d1f96706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0027d1be4cbf7826333bb3a66339314d6b23088907bc03abe8e1f0402f6b8e99fb6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d6c0e7346e597949cf4ef07e57b029426cac6d2a0e80761b07aaa83e5622fe16f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f4bf0c2de11327648a0b56a170029f349308fc88d64badffaf4b1575a0444056f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ae58764b2108d1e23de28591a61e52e6fdeb49f0985ab6bf5f332e338db742f877616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000e7d92ca3c2fbd087783533f3e3c493881189b9e95829763ee2222d5ef50524361737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0010478412784e05112c2ab987ce3d691a1f8d284f5e80d71d573229b6d643563b61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009eac5b84d08bbf7716b595fc0d10686ead30355e5b7a8c9305ac02240823513961737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0124e495308164a0a97925a27e59fadec0c6fc59de23c5ffaef3ff30a2c513d51a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133fb9d5f75d87a3cf8eca81ad16c669a686aac61fc514a6cf1159e739618c2e86f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d6c2a78d92595947756cc38ad2fb077984f691ebbba0d1db03c2cbed071d16ef6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133f6198c994c4ca12b360abc226c232f1dd46bef6c5be02c39278b8de8ea04696f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003d268ee173d6cbe5f0c0efa3833fe6590950938cb7b24b15957587fd0380729375736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008be60e1ba421b4c0cf104749bd2f322f6d985763053b347bf68c6000908aa693796b616a753261386a6366672e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002aa060c38662a90fa07a34b800cd3c84360d894dc4bec1c81a7b41d3eb282092706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006674894d631ca3e373a87b27ea614f16468fa9ddaf401f079d93359f14f29f6e72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bc656c82f3aed97695b555e49b55e584f960197f092a53ac9bcc3f872125436476325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a988b23956e4e5ab00dd3d16decdd0714554562ae9fbfae9053acca1a91f37cc75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00883c8876a557200a3b14ad46b0646af75750403ab3cb5ff04ef6a72f4f71b7786175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d916068721ec0d451382e00bebd8f4f713321e3bde850c36463517d6c50115c5706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01bf4b51df07bf9819b996b720eadafc5323ec7a2ad7fc0555190771faaa582d3272656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1e6131d4648085ea2f1e23ba516e6d03a05c6448c30639b1b082c8650544506686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00956fff9f472d68ff61b7c3e88b678738f5082e44ca40277cb394501a86d8b42177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005ef99fadc671ee47c6015c92351d2c172995832ac01ecd1e8b8ceae3722ccc296f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "created_at": "2024-03-08T17:11:55.470501Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + } + } + }, + { + "id": "f99c86b4-d9b9-4ecb-a6b1-05ea7b7373a7", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "data": { + "input": "0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a49e07cc9add37cced107ee8f1c5d1724792925dd5ed24c912158b8c13d9d9b36465762d313730353330373933353634302d33333734353230323038363032332c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00265ebe9ff4f941a961e8ce217a32442fff9fc6ef24d78ed47fa060ade1bce1336465762d313730353330373933353635392d31313834353434333436323035342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0012b32ec03f69a4f9e60f6c5d37e66002806e75cdb53957101cc0890c90633cc3746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c48635b03ec4cf4c36e4def535ddfdb051d60f385789d7ce39fbee2982b77a0746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01723736dcce51f837993573433fdc6f913d909ffacca29d704901ba397b553b9d706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014c307efe3e8f4487959d8e370fa6d48bd8783dff3b89a8b9851a73ce6a537bd075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009cf222fb550321ce78b68222bee7a2981d39824f475514c402c0f31f205234ad76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c225fa4ce35677204c899a0865c6a6a0f476a9d442a79eb0f94c52866cc7f0ea7931726966746533713962642e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ebb6c77273f31466c5f9a15fbe562c77e44b89b480d1e9757574fc66b959d4a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00344b2392c64731ff2ec8caae467f87309671b9546710a85e6c3598eee9f716ff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eb5e2e11de5b6367f922a9858781b28b083193dacf785142593d233565db64b76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c010c7f2373b7082fb1bd515a261e3f0d0727db493538d94660f7990ae76cbedf916f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e5756d2be638d13ee2ba79928a5ad23d52dbe9643e8fa9b7f915be2e687a91db6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00040374be2ed1932ed9daa32bab4b5bb4c00470ca00694c50472f8c334c96862561737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b47e9c92be55286eb6af4df92bd4aa3aee6322fff4646ddfe01b958dd2f4095d686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0086b171fc9678bf982345a8987a046c7fa0c43aae3bfd15d1b34a79cb4d03d71661737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00197a69c790d14a4bde0f6f3b1e454176726f932a62558608d0914586521d2e0f61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003931d08de61711eb2dfb48ad6ba8ecd3c21306f525a61c73c7f9d698696c3e816f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e61e10746bd3a4d24f74c1feca4fb86c5ebb437e4d127c9875ca5f35ba6fe20f77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090a9b640e45c3e817d0441fd69fc23b08f478ed0bc9d50990c0e58a2f4c35cd26f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e11a6147076ae83cd3387d8eb283a4c712dd4d354bae417455491507667a87f56f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f0f0f7aba1fa1f039740decb8f4c6e3367a4ed9a87810abfda6ca0d456dd0f35706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014b2fa42d3e913c40d6de6535426b27f106d81c29e05b50d62f935ae7228f1c84746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0167c562d961d17b291f13ac6a7f8cc0f2e8fd0ba9e8613ab876346027b5c587e7746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00089bed4c328a6a7da6808d5a3ecbd8b9aa34218b5118cd6310e0775f3341b40c686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c606cf6b2c7a75ebabc673a2f0d9f7888e4e73cad62f6b22761b9856e49ef4d76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0068e4ef9d310be1fdd2d39acaf3763739ddbd3e2f47b460ac2c185b08822bfc7c6465762d313730353330373935313134342d33393738343531303336313532312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005f875f84b40f7d33e6ea1f9be6f1cb4b46c8426bf203ff0371988197a916bf126465762d313730353330373935313135372d34363239353633303039393932312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c427f737e7de0edb3003eee28c0ed631882ca0b77daa43cd77ac847873f634aa706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00fd991da49a08b4defb4404350eccd92c1b103ed1f5cbfae8ac6f546f3178a0a4746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f733369a9ee8d964a2b0114698cebe555828ee568320db535a1b868d3cf3807e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "created_at": "2024-03-08T16:32:07.229816Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + } + } + }, + { + "id": "c2f5090e-8f32-4fad-9fde-84019591d68e", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "data": { + "input": "0xdaf909af5b24b30011f952baccbdab560b1e16bd2d16efabb9f2ee3ffee398fa01428712dd9c1fad26e1856920aa47d4d7be1cafdea43222b63058020b97c6ddf26f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01030bcfbc47f9d4ac7f87101a1ed436f49a74294cfdaa8cc88a667f7c5d6067ef686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00792e52b85fb9ba2137525f5aa701eb1039bc2f1b455dc289ef287278b9be9bac746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01938fd77fac6ad3b9c941943e5d229be6c10406c183e30ad5768b9d8f998fb1106f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009eac5b84d08bbf7716b595fc0d10686ead30355e5b7a8c9305ac02240823513961737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0010478412784e05112c2ab987ce3d691a1f8d284f5e80d71d573229b6d643563b61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000a594de1c36eca52f15d9f7d4177515570f3a6966e5ac51da1ce4abb7e496c6a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f454878ba125cc5f380439ee3c3e6510e8d66e7adcb70e59951bcf51c2916d5686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1e6131d4648085ea2f1e23ba516e6d03a05c6448c30639b1b082c8650544506686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01bf4b51df07bf9819b996b720eadafc5323ec7a2ad7fc0555190771faaa582d3272656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d916068721ec0d451382e00bebd8f4f713321e3bde850c36463517d6c50115c5706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00883c8876a557200a3b14ad46b0646af75750403ab3cb5ff04ef6a72f4f71b7786175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a988b23956e4e5ab00dd3d16decdd0714554562ae9fbfae9053acca1a91f37cc75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bc656c82f3aed97695b555e49b55e584f960197f092a53ac9bcc3f872125436476325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006674894d631ca3e373a87b27ea614f16468fa9ddaf401f079d93359f14f29f6e72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002aa060c38662a90fa07a34b800cd3c84360d894dc4bec1c81a7b41d3eb282092706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008be60e1ba421b4c0cf104749bd2f322f6d985763053b347bf68c6000908aa693796b616a753261386a6366672e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003d268ee173d6cbe5f0c0efa3833fe6590950938cb7b24b15957587fd0380729375736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133f6198c994c4ca12b360abc226c232f1dd46bef6c5be02c39278b8de8ea04696f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d6c2a78d92595947756cc38ad2fb077984f691ebbba0d1db03c2cbed071d16ef6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133fb9d5f75d87a3cf8eca81ad16c669a686aac61fc514a6cf1159e739618c2e86f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0124e495308164a0a97925a27e59fadec0c6fc59de23c5ffaef3ff30a2c513d51a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0024e2d4f8d3394fabea1a8ac255ec3ef9c6e14cc90e8e45c1d185f9a858d484107a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000e7d92ca3c2fbd087783533f3e3c493881189b9e95829763ee2222d5ef50524361737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ae58764b2108d1e23de28591a61e52e6fdeb49f0985ab6bf5f332e338db742f877616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f4bf0c2de11327648a0b56a170029f349308fc88d64badffaf4b1575a0444056f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d6c0e7346e597949cf4ef07e57b029426cac6d2a0e80761b07aaa83e5622fe16f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0027d1be4cbf7826333bb3a66339314d6b23088907bc03abe8e1f0402f6b8e99fb6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0156b47c3c713180318844195b0e0e29810c5f099fe19411eaf116d55b3f6d1f96706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00311fa837e07749c47b2825d06dd14d3aa6f438e2e1cc69857b737d0104ac080576325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005ef99fadc671ee47c6015c92351d2c172995832ac01ecd1e8b8ceae3722ccc296f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00956fff9f472d68ff61b7c3e88b678738f5082e44ca40277cb394501a86d8b42177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "created_at": "2024-03-06T16:10:32.852826Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + } + } + }, + { + "id": "09a41338-8e36-4bae-ba8c-6ad828c667e9", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "data": { + "input": "0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3009dbbc777884bc0ccc05fc9177bd442e19a9b82608f7ae6c8b81cbadee2320e1c77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0024e2d4f8d3394fabea1a8ac255ec3ef9c6e14cc90e8e45c1d185f9a858d484107a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000a594de1c36eca52f15d9f7d4177515570f3a6966e5ac51da1ce4abb7e496c6a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007ff581f8517ec58459099a5af2465d5232fdcdd7c4da9c3d42a887bf6bd5457e70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00311fa837e07749c47b2825d06dd14d3aa6f438e2e1cc69857b737d0104ac080576325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f454878ba125cc5f380439ee3c3e6510e8d66e7adcb70e59951bcf51c2916d5686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c012c53bcfe871da28decc45c3437f5864568d91af6d990dbc2662f11ce44c18d797a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0156b47c3c713180318844195b0e0e29810c5f099fe19411eaf116d55b3f6d1f96706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0027d1be4cbf7826333bb3a66339314d6b23088907bc03abe8e1f0402f6b8e99fb6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d6c0e7346e597949cf4ef07e57b029426cac6d2a0e80761b07aaa83e5622fe16f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007f4bf0c2de11327648a0b56a170029f349308fc88d64badffaf4b1575a0444056f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ae58764b2108d1e23de28591a61e52e6fdeb49f0985ab6bf5f332e338db742f877616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000e7d92ca3c2fbd087783533f3e3c493881189b9e95829763ee2222d5ef50524361737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0010478412784e05112c2ab987ce3d691a1f8d284f5e80d71d573229b6d643563b61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009eac5b84d08bbf7716b595fc0d10686ead30355e5b7a8c9305ac02240823513961737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0124e495308164a0a97925a27e59fadec0c6fc59de23c5ffaef3ff30a2c513d51a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133fb9d5f75d87a3cf8eca81ad16c669a686aac61fc514a6cf1159e739618c2e86f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d6c2a78d92595947756cc38ad2fb077984f691ebbba0d1db03c2cbed071d16ef6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0133f6198c994c4ca12b360abc226c232f1dd46bef6c5be02c39278b8de8ea04696f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003d268ee173d6cbe5f0c0efa3833fe6590950938cb7b24b15957587fd0380729375736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008be60e1ba421b4c0cf104749bd2f322f6d985763053b347bf68c6000908aa693796b616a753261386a6366672e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002aa060c38662a90fa07a34b800cd3c84360d894dc4bec1c81a7b41d3eb282092706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006674894d631ca3e373a87b27ea614f16468fa9ddaf401f079d93359f14f29f6e72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bc656c82f3aed97695b555e49b55e584f960197f092a53ac9bcc3f872125436476325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a988b23956e4e5ab00dd3d16decdd0714554562ae9fbfae9053acca1a91f37cc75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00883c8876a557200a3b14ad46b0646af75750403ab3cb5ff04ef6a72f4f71b7786175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d916068721ec0d451382e00bebd8f4f713321e3bde850c36463517d6c50115c5706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01bf4b51df07bf9819b996b720eadafc5323ec7a2ad7fc0555190771faaa582d3272656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1e6131d4648085ea2f1e23ba516e6d03a05c6448c30639b1b082c8650544506686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00956fff9f472d68ff61b7c3e88b678738f5082e44ca40277cb394501a86d8b42177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005ef99fadc671ee47c6015c92351d2c172995832ac01ecd1e8b8ceae3722ccc296f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "created_at": "2024-03-04T15:53:49.669317Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "c35d498e-f283-4b14-a42f-3a35807d3a70", + "number": 10, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + } + } + } +] diff --git a/fixtures/sync_proof.json b/fixtures/sync_proof.json new file mode 100644 index 00000000..088e7c4e --- /dev/null +++ b/fixtures/sync_proof.json @@ -0,0 +1,62 @@ +{ + "id": "cde59ba0-a60b-4721-b96c-61401ff28852", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "data": { + "input": "0x6a6441abfaefab6d9d6a57d331bb3f2e6dbfdc9650a3abfb400963a3a1a4109f" + } + }, + "proof_release": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "created_at": "2024-03-18T14:39:11.718599Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "ffdaea89-d458-4f96-8edc-5e833cb149ef", + "number": 11, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "64bb0a1e-2695-42c8-aee3-9d8c1b17b379", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "pPNrmpyIUhHNKj+UckoAdtCHwPE2zKPP4LDBGOALXWM=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0x679aa6fa6b74d2b90ce639ae173cd2cded1e42eb2236531025551bee74becd5e", + "input": "amRBq/rvq22dalfTMbs/Lm2/3JZQo6v7QAljo6GkEJ8=", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "rkslUWpkQav676ttnWpX0zG7Py5tv9yWUKOr+0AJY6OhpBCf", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T14:39:11.214569Z", + "updated_at": "2024-03-18T14:42:50.112555Z", + "edges": {} + } + ] + } + } diff --git a/fixtures/verify_proof.json b/fixtures/verify_proof.json new file mode 100644 index 00000000..edf234cd --- /dev/null +++ b/fixtures/verify_proof.json @@ -0,0 +1,62 @@ +{ + "id": "582276cc-62f0-4728-9a20-86f260c09874", + "status": "success", + "proof_request": { + "type": "req_bytes", + "releaseId": "2e6ac09f-585a-4a41-847e-c13c42860526", + "data": { + "input": "0xa2fd5655ff2f74c0fae7843653a731f1ab91c10c082a9ead01a18af02d79908d01026d02a778ce47a4a670e343cebf90a67309157b2a3a54079c13b8962908b080686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a49e07cc9add37cced107ee8f1c5d1724792925dd5ed24c912158b8c13d9d9b36465762d313730353330373933353634302d33333734353230323038363032332c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00265ebe9ff4f941a961e8ce217a32442fff9fc6ef24d78ed47fa060ade1bce1336465762d313730353330373933353635392d31313834353434333436323035342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0012b32ec03f69a4f9e60f6c5d37e66002806e75cdb53957101cc0890c90633cc3746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c48635b03ec4cf4c36e4def535ddfdb051d60f385789d7ce39fbee2982b77a0746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01723736dcce51f837993573433fdc6f913d909ffacca29d704901ba397b553b9d706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014c307efe3e8f4487959d8e370fa6d48bd8783dff3b89a8b9851a73ce6a537bd075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009cf222fb550321ce78b68222bee7a2981d39824f475514c402c0f31f205234ad76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c225fa4ce35677204c899a0865c6a6a0f476a9d442a79eb0f94c52866cc7f0ea7931726966746533713962642e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ebb6c77273f31466c5f9a15fbe562c77e44b89b480d1e9757574fc66b959d4a706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00344b2392c64731ff2ec8caae467f87309671b9546710a85e6c3598eee9f716ff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eb5e2e11de5b6367f922a9858781b28b083193dacf785142593d233565db64b76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c010c7f2373b7082fb1bd515a261e3f0d0727db493538d94660f7990ae76cbedf916f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e5756d2be638d13ee2ba79928a5ad23d52dbe9643e8fa9b7f915be2e687a91db6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00040374be2ed1932ed9daa32bab4b5bb4c00470ca00694c50472f8c334c96862561737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b47e9c92be55286eb6af4df92bd4aa3aee6322fff4646ddfe01b958dd2f4095d686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0086b171fc9678bf982345a8987a046c7fa0c43aae3bfd15d1b34a79cb4d03d71661737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00197a69c790d14a4bde0f6f3b1e454176726f932a62558608d0914586521d2e0f61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003931d08de61711eb2dfb48ad6ba8ecd3c21306f525a61c73c7f9d698696c3e816f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e61e10746bd3a4d24f74c1feca4fb86c5ebb437e4d127c9875ca5f35ba6fe20f77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090a9b640e45c3e817d0441fd69fc23b08f478ed0bc9d50990c0e58a2f4c35cd26f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e11a6147076ae83cd3387d8eb283a4c712dd4d354bae417455491507667a87f56f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f0f0f7aba1fa1f039740decb8f4c6e3367a4ed9a87810abfda6ca0d456dd0f35706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c014b2fa42d3e913c40d6de6535426b27f106d81c29e05b50d62f935ae7228f1c84746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0167c562d961d17b291f13ac6a7f8cc0f2e8fd0ba9e8613ab876346027b5c587e7746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00089bed4c328a6a7da6808d5a3ecbd8b9aa34218b5118cd6310e0775f3341b40c686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c606cf6b2c7a75ebabc673a2f0d9f7888e4e73cad62f6b22761b9856e49ef4d76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0068e4ef9d310be1fdd2d39acaf3763739ddbd3e2f47b460ac2c185b08822bfc7c6465762d313730353330373935313134342d33393738343531303336313532312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005f875f84b40f7d33e6ea1f9be6f1cb4b46c8426bf203ff0371988197a916bf126465762d313730353330373935313135372d34363239353633303039393932312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c427f737e7de0edb3003eee28c0ed631882ca0b77daa43cd77ac847873f634aa706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00fd991da49a08b4defb4404350eccd92c1b103ed1f5cbfae8ac6f546f3178a0a4746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f733369a9ee8d964a2b0114698cebe555828ee568320db535a1b868d3cf3807e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013b6dcc41f7c0df9e45c1aa2602488a5075f2b7f73013d9e3096622c3cfdd1dff75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00203ca6c4a7c5e60fe8fa95adf12682dbf891c7cf164ea52e4e177516889c21b57676746a716868666e726c322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0070ff84e558f127c26d63ca4e7d26fe62d490b71c9187bae3b3fee13c6ca7f55075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c013192067f557baa41444430c749bb7dc241d238dae5be85bcd4615f86ae13ae26746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c019fc084d6c408f3369330354027e008ac5a83cc83606d99e200d0f4b14a74f8dc746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01afdca85f436fafadc675a42f9c6d9c1f1d6454eca062c83fc1e0690e5381ba8a72656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d1553da94dcee551b0834725f2ab762e936b332f24ac962fb3f4b73e99163a636465762d313730353330373935343731362d32363030353632313832303036312c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006ebce1b1a64ddb3849beabf354e62829bfcbdcaed484e17ca26b298bcab71e226465762d313730353330373935343733322d32333231323236313631323538342c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a96d55bf23fc006afdfd3ce4334fa0eb6969192b0b34e628fb64b12b2ae23f5f706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f2dac06800a69fa823fb11fb44cf520cd1c8475ec23cab10204dfb3e2e720bf0686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007a2c6c982ab354c4448948a2bef0f86d353dda983ae3dd810c81e8fd0dc53a2d6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ccf5eac51a1b6e57fd2605a80773c6a432769c8e142a2a3ef72462e131b76f48746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00882758a173b262a6c607e80a59ac1553dcc57c4cfdc63e9fa98d2344acbffa2f746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006d41ac0ddbbb3f4fef405ad78337ea1ed1745df288cfd8a0bde449a04beea7ba76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00314203fbdc85f52832e2b026322a23393adccf428d262c8d83cf495e2ad8d17077616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0076d6768b9a80c969e557e465ce259b7b3c40c8c6c0dfb33e26b07c1c0bbf541072656c61792e6175726f72612c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00032072129958d50ab29289651f84af960adc57cbd09afa6231466f50323d75d2686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f776278d1a804f9d9ed5b803f77720907b3b07af6eb47869aa26a884dcb95360706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018f31d24f72c4bb135ffdb56f022723cf284add497c5ec0e016c94830422d2086732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b4082a419e23b30b701aa1345b9de41ca0763a3a46e6839029cf51bc8ee92be76f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017a804a4b16015ea05f501a0eecb47777428beb383ad2fbe090e62d499c2e6a3675736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0183d42a5fe196260fc9a9ee3902030bdd443b6417fdf3772312ea73fe64cc56986f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016d6b45b053655e9e9cc076cda1c36a678276de517fbdddc0b38664d4c8abc7f96f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0026cfd72efde1617a80c0e1150a4dd9e1d1a4649b5135413c2ae0dcfb699a224870726963652d6f7261636c652d76312e6e6561726c656e642d6f6666696369616c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008ca8cfea66a0d9c8620fda8254dcab2939f2e35f1516032e6a86d1fa5937fd60732d6c616d312e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e9af93fb98c6eb6eeb6c3488626c7c879454d84ec8b3ca773431d606fc705ae961737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e7ff3a76008fba50478f67a8632fcd210a925ca93916ead39ef2f24df9f04c9336386672647269613439766d2e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0044cb39b104c68014193ab25802fe3bd6193ca6fa27b978975244a092e9ddd00261737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0078a53eab5a1761e01aefba7655d437a386a96c603efb2bc55d15c67effc5f8b761737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e3227be1fff28d7f6a8e2f60550060b522edd9fa2525e6d38fb772cc62181a7f6f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000d71a4926cfa09f4209c5733b9930b2487d6153cd442b53867c0b914069cf8d075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00398683f803de41db53ba1fb3ce05f1b16ce00acd3b63a13ed8848a4b472375c16f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00108e67bad908a8d93ad2ad11237b14a7213ba72dd94fd12cfd7634cccec030376f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01eac41dbd9e4ac61e6563807449cf6c24373a0a9d936d4c0460d434e9e5686e56706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b1397b648ffbe568f0948c663de51478ee59ea7f9650ddc66385ec82d999332f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d2977d006dc76464f3fff3c0d79ee8e272cff2ede29ce5435abf20e434b981c776325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0030ae7beef7ef03cb7a8e7272f31caa776a811ea14baf2f88166e153a091eea9177616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c009c917c130c06c09904bb4fa785134c6620540b3e514c0eb6dc46d0d2eb4d0c1c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c000bab00c39618436abebd736b23681eee010d8698d76e674a4b74774a9340ad5f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b5e9920a135036cfd2af5b8959b91eec0010e60fe6161551517a7babd941436b7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018359b2a6712f088e072ad798f7c09bedfe82f79963a31a1b4258553107d67bd575736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0074d2fd7d043d81e094fb01cccc56b1e65490a890eb32c78c0bb7dc60dff76abc70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00d166b618dce48f4a119a14abca9f85181a67016596916a22063530537f01ce5e313266626831676c636761742e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0153fc02f4e7ccb921d3416493d27b55624b320a2d38c5b9f61a6048451e0206a9706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e2d28a4d3a035cb1ac7860c98c9727361995622667df5199fec7be4288932b4e7a61766f64696c2e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007235081eba3164d3a3079bf54dca800270b8f8f7f2ac4b8b7b23b3bc199de22c75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00dba102a52675cc53f8176ea91727afcbcfdbe9d0ea1a595a34f869357086e2db76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e40d099c2e6883cd319aaf52b3b29d43305d069484017f8dbe6d1e6dfb0945a6686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0090ef5aefc01261767eb94d1a3cb59dd73b20c01e5ff9f55e4b463f07247e8d3c706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007d0eec60dded5c4f117c27cf63139ab6c19e918736acc0c52be3edfb6a65b0ce77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a59b1ab3a8038c1185fffdab48360c18011c6b334767abaf573aa8976edac890686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c017bddbe92024918efcc2187f0f1cf02d5f08c1410131742965b1618dca217dd376f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01f6eb39a6fff73ba199ce13195d9b61461239d32217941ed26e45c74a651b93876f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b875da1c575c2e1254103f3633918084fe49012d2e528e2cc0061e1e30bd3d286f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006420a00089b6c26f96f900f1422e95a1b5dca6b4664e8c8057a8ce49e7c2dc6f61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a5fb923fa82b73f48c911ebff4595c0a86f4cb7f7ca3d54387da724f0d6e316d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0092ac8da13b7eb470beb940aefe3113cb1691ea11699fffc0a90e34dfb5ba02ae61737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c018debe92ce04dae79f833258017ee1ecac7d32b7772c3489db3f382a9fdf0dc5275736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ba78aeb2fefc974b28b920d55d2272067e520ef9c7bda33d190be43f8e5331d96f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c005e6cdecba3c18cd8df4504fcce70585d95224e8cb9536584bce3de584f6af6116f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00f6f1bc126b85da0b9413c839d94cf0753e933ee94e59112b3755769ab15091866f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003c2ef2b1d44fc0f6a8952dd90894737519c9ae1687b9641c43cc3c7e69eae62c6474617a7a317336777465322e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bcb5dba2c2640610b8d0189cd7a545c1082261aac92bfef5ed36771f16cb925075736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01d9ce54d510d4c9c42931dcd9e46ff5c8253ad86e3e0a8aa2803d7698f2f123c06f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01b2bd890c05c3af200de1cd245cff4156daf7109813703e9642423b3e5c721967686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0051d453f91d122400d4ffea377689f251447437e4e870a159be8d3e9604b21e9c70726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c006970f24b1c8d919325a5bf853410ed55ce3ebd1c7d209b7f44a4125ac9192b4a77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00ada0187c6e035b3726b80677a4dfe0b580ec9bf6fbea5ad9ddc5334377e4bd0f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a51296de1fa4bdb501f5e22e70bd7357c311eb96c480c7b5a83b0c73cac3a3a56f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01450b4cd2c1041e86dd7131ff0d0565112eb9a6eddf472ab0e40f117fae2e9e1b75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01fbbdfc15d6cc230ad33560005bd260d319c55b740e974f2670556660bcb1b569706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c1f41e50f9b71459d5e937ab570c7ff6eff9c1ca59c58512fb4442de7435160637337576793879366b7872382e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c67d9883f54fdbe34cb4eca5ebea3bd11eb1c643759bfd68312fe30a5538860876325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0025effa5cf9769e5e4ee9ea894e96e5fa7f8d2d3e02779afb093c71bfd191c0b175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00bb801a7742b42c0a63572de86a669f4278cbfd2ad83890a78aca8927c5c559a8706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01376545409c923b585549e2775ea44f17cf666c8a96b7f46000470ce8215cc29f686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00e1d64d332912d157d409dd7b2cd15922d1458c9f89db1a6aaec788722c8c9feb77616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01c743450fa747831ab768ff6b81769b99fdf4dd7a96d77b11b4b134746994b2e06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c016f7c2658d5db3ad5c21b8cd74b67e3cd88583efbb0990c866eada559459f15296f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01178da8f0216f3935a7b18792f2f524aaa3e0ce04878be5e88e7374a22588187b6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0045989ff55b321cf17042336002143923eaeb1f7aca1890d06b8661beb5469f4a686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00a2dcd933e13734be2cf545f6f4150a2911041bc4840cd8df25b2e4cfaf84ac4b61737365742d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c008dc95d832842725b8e2dd1752ed1ecbebe0354d7a8b384f6036267433bf8f4f861737365742d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c007366f9850730663c25ad58c7d0b2c92887d5b3521c36627a3f5b0f1cafc23e3d61737365742d6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00caeed0384fc2e3d27b729993601365870abdeac789239a155b2d2c7c86921ee06f70657261746f722d6d616e616765722e6f726465726c792d6465762e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c004c55453e68e24a730befcedf4dbf17dcb4522774ebdcdc959bbb8881216f095d6f70657261746f722d6d616e616765722e6f726465726c792d71612e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c0049fcac1e1358c141f432296c655a7f37ad6f799e676b864741e017fa48e1619d6f70657261746f725f6d616e616765722e6f726465726c792e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01e99199a0ee36379f8ec381be29fb5429950d7ea2a4e661f9a352d7c2e3f087a6706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01a25c13eeab4dbb89d8308e148b34c7d52fbb32044c0552da9be982c9b480f22175736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00af6aecb8c18aeed12c89e10024d7848732c1edc39ac0b47d421c92807d14835c76325f312e706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c003f185492791bff0827767b40925d34beb5530e55ea6a18cc559a513c96598431706572702e7370696e2d66692e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00c21d9dab00ab7481de442b9d8273dfe151799c66cdf52346a6d9c44c418824306c776a64766c767a666f37392e75736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c00094532de95f1fa7fa1ae18fdbe8e09bb98c4e3fbb5033a6b5ae990594569b27775736572732e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01dcfc4f30c70a7da653f1166a1e4abd70865b0042773485674804591a2d1f001b6f7261636c652d322e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c01796847ad9c2cbe2a5006a89dafe3e7838846085f4cd240b97c29d1253a9476c1686f7477616c6c65742e6465762d6b61696368696e672e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c002c0d2c9385d28114166aee120e40fdf5f713f07477e0abd4eb63c7a39da10ac770726963656f7261636c652e746573746e65742c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c" + } + }, + "proof_release": "2e6ac09f-585a-4a41-847e-c13c42860526", + "created_at": "2024-03-18T11:01:19.287592Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "release": { + "id": "2e6ac09f-585a-4a41-847e-c13c42860526", + "number": 12, + "project_id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "project": { + "id": "ab97d00b-e1de-497d-b7eb-a575124169ad", + "name": "near-light-client", + "git_account_name": "near", + "organization_id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": { + "organization": { + "id": "ee26eb20-7a06-4b71-8386-928719afdedd", + "org_name": "near", + "created_at": "0001-01-01T00:00:00Z", + "updated_at": "0001-01-01T00:00:00Z", + "edges": {} + } + } + } + } + }, + "requests": [ + { + "id": "533a983c-ec21-456c-a1dc-79965df9de5f", + "chain_id": 421614, + "gateway_address": "0x6c7a05e0ae641c6559fd76ac56641778b6ecd776", + "relay_tx": "uLPS5EZ1OhcY7YQ4vGRgsMjsbVGSyeglqdntENWP3ic=", + "sender": "0x0000000000000000000000000000000000000000", + "origin": "0x0000000000000000000000000000000000000000", + "function_id": "0xfb248286ff8fea7e389e439fbcddbe3fb216a1f35fc259f5bb00d26a5bc51617", + "input": "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", + "callback_address": "0x87b3bc64ce8dd482c2ccdb9d47a98bdf45c7f5d5", + "callback_data": "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", + "callback_gas_limit": 1000000, + "request_type": "off_chain_call", + "status": "relayed", + "created_at": "2024-03-18T11:01:17.380183Z", + "updated_at": "2024-03-18T11:12:20.214561Z", + "edges": {} + } + ] + } + } diff --git a/flake.nix b/flake.nix index 4125dd69..47ab6c95 100644 --- a/flake.nix +++ b/flake.nix @@ -28,6 +28,7 @@ nativeBuildInputs = with pkgs; [ bashInteractive taplo + just clang cmake openssl @@ -41,6 +42,15 @@ solc slither-analyzer + vscode-extensions.vadimcn.vscode-lldb.adapter + rust-analyzer + + (google-cloud-sdk.withExtraComponents ([ + pkgs.google-cloud-sdk.components.cloud-run-proxy + pkgs.google-cloud-sdk.components.gke-gcloud-auth-plugin + ])) + kubectl + ]; buildInputs = with pkgs; [ (rustVersion.override { extensions = [ "rust-src" ]; }) diff --git a/justfile b/justfile new file mode 100644 index 00000000..18e1fb39 --- /dev/null +++ b/justfile @@ -0,0 +1,152 @@ +#set export +#set dotenv-filename := ".env" +set dotenv-load + +ETH_RPC_URL := env('ETH_RPC_URL', 'https://rpc.sepolia.eth.gateway.fm') +CHAIN_ID := env('CHAIN_ID', '11155111') +ETH_PRIVATE_KEY := env_var('ETH_PRIVATE_KEY') +ETH_PUBLIC_KEY := env_var('ETH_PUBLIC_KEY') + +BROADCAST := if env("BROADCAST", "") != "n" {"--broadcast "} else {""} +LEGACY := if env('LEGACY', "") != "" {"--legacy "} else {""} +VERIFIER := env('VERIFIER', 'etherscan') +VERIFY := if env('VERIFY', "") != "n" {"--verify " + VERIFIER} else {""} + +forge-script SCRIPT TAIL *ARGS: + cd ./nearx/contract && \ + forge script {{SCRIPT}} \ + --ffi \ + --sender {{ETH_PUBLIC_KEY}} \ + --rpc-url {{ETH_RPC_URL}} \ + --private-key {{ETH_PRIVATE_KEY}} \ + {{TAIL}} {{ARGS}} -vvvv --json + +# Deploy the NEARX contract +deploy-contract: (forge-script "Deploy" BROADCAST + VERIFY + LEGACY) + +# Initialise the NEARX contract with any parameters such as owner +init-contract: init + forge-script Initialise + +# Update the ids for the verifier +update-params: (forge-script "UpdateParams" BROADCAST + LEGACY) + +# Upgrade the NEARX contract +upgrade: (forge-script "Upgrade" BROADCAST + VERIFY + LEGACY) + +# Request a sync on-chain +request-sync: (forge-script "RequestSync" BROADCAST + LEGACY) + +# Request a verify on-chain +request-verify: (forge-script "RequestVerify" BROADCAST + LEGACY) + +brunoc := "npx -y @usebruno/cli run" + +# Fetch the current active deployments +fetch-deployments OUTPUT: + {{brunoc}} "api/succinct/Get Deployments.bru" --env testnet -o {{OUTPUT}} + +# Filter deployments for the specified chain id +filter-chain DEPLOYMENTS CHAIN_ID: + @cat {{DEPLOYMENTS}} | jq -r ".results[0].response.data" | jq -r "[.[] | select(.chain_id == {{CHAIN_ID}})]" + +# Filter the deployments for the entrypoint +filter-version VERSION: + jq -r "[.[] | select((.edges.release.name | contains(\"{{VERSION}}\")))]" + +# Filter the deployments for the entrypoint +filter-entrypoint ENTRYPOINT: + jq -r "[.[] | select((.edges.release.entrypoint | contains(\"{{ENTRYPOINT}}\")))]" + +filter-all OUTPUT $ENTRYPOINT: + #!/usr/bin/env bash + set -euxo pipefail + filtered=`just filter-chain {{OUTPUT}} $CHAIN_ID` + filtered=`just filter-entrypoint $ENTRYPOINT <<< "$filtered"` + just filter-version $VERSION <<< "$filtered" + +init: (fetch-deployments "/tmp/deployments.json") + #!/usr/bin/env bash + set -euxo pipefail + S_INFO=$(just filter-all /tmp/deployments.json sync) + + echo $S_INFO | jq -r .gateway + echo $S_INFO | jq -r .function_id + + just filter-all /tmp/deployments.json verify | jq -r .function_id + +call-brunoc REQUEST: + {{brunoc}} "api/succinct/deploy/{{REQUEST}}.bru" --env testnet -o /tmp/{{REQUEST}}.json + +check $CHECK_RELEASE_NUM: + {{brunoc}} "api/succinct/deploy/check.bru" --env testnet -o /tmp/check.json + +wait-for-success RELEASE_NUM: + #!/usr/bin/env bash + + for ((count=0; count<10; count++)); do + just check {{RELEASE_NUM}} + if [ $? -ne 0 ]; then + echo "non zero exit code: $?, trying in 30s" + sleep 60s + else + echo "success" + break + fi + done + +extract-release-id: + cat /tmp/new-deployment.json | jq -r ".results[0].response.data.release_id" + +extract-release-num: + cat /tmp/new-deployment.json | jq -r ".results[0].response.data.release_number" + +current-release ENTRYPOINT: + just filter-all /tmp/deployments.json {{ENTRYPOINT}} | jq -r .edges.release + +update-name $RELEASE_ID $VERSION: + npx -y @usebruno/cli run "api/succinct/deploy/update-name.bru" --env-var VERSION={{VERSION}} --env-var RELEASE_ID={{RELEASE_ID}} --env testnet -o /tmp/update-release-name.json + +update-current-name ENTRYPOINT: + #!/usr/bin/env bash + + ID=$(cat /tmp/{{ENTRYPOINT}}-release.json | jq -r .id) + VERSION=$(cat /tmp/{{ENTRYPOINT}}-release.json | jq -r .git_ref) + just update-name $ID $VERSION || exit 0 + +get-verifier OUTPUT: + cat {{OUTPUT}} | jq -r '.bytecode' + +release-dev $ENTRYPOINT $VERSION: + #!/usr/bin/env bash + set -euxo pipefail + + # just call-brunoc "new-deployment" + {{brunoc}} "api/succinct/deploy/new-deployment.bru" --env testnet -o /tmp/new-deployment.json + # + RELEASE_ID=`just extract-release-id` + RELEASE_NUM=`just extract-release-num` + just wait-for-success $RELEASE_NUM + + just update-current-name $ENTRYPOINT + cat /tmp/check.json | jq -r ".results[0].response.data" > /tmp/{{ENTRYPOINT}}-release.json + just update-name $RELEASE_ID $VERSION + + export CREATE2_SALT=`cast th "$RANDOM$RANDOM$RANDOM$RANDOM" | cast to-uint256| cast tb` + export FUNCTION_VERIFIER=`just get-verifier /tmp/{{ENTRYPOINT}}-release.json` + + export DEPLOYOUTPUT=`just forge-script "DeployAndRegisterFunction" {{BROADCAST}} | jq -R 'fromjson?'` + export RETURN=$(jq '.returns' <<< $DEPLOYOUTPUT) + export FUNCTION_ID=$(echo $RETURN | jq -r '."0".value') + export VERIFIER_ADDRESS=$(echo $RETURN | jq -r '."1".value') + export TX_HASH=`cat ./nearx/contract/broadcast/DeployAndRegisterVerifier.sol/{{CHAIN_ID}}/run-latest.json | jq '.receipts[0].transactionHash'` + npx -y @usebruno/cli run "api/succinct/deploy/notify-deployment.bru" \ + --env-var RELEASE_ID=$RELEASE_ID \ + --env-var VERIFIER_ADDRESS=$VERIFIER_ADDRESS \ + --env-var CHAIN_ID={{CHAIN_ID}} \ + --env-var FUNCTION_ID=$FUNCTION_ID \ + --env-var CREATE2_SALT=$CREATE2_SALT \ + --env-var TX_HASH=$TX_HASH \ + --env testnet -o /tmp/notify-deployment.json + + diff --git a/nearx/Cargo.lock b/nearx/Cargo.lock deleted file mode 100644 index 2663cd28..00000000 --- a/nearx/Cargo.lock +++ /dev/null @@ -1,4581 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addchain" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" -dependencies = [ - "num-bigint 0.3.3", - "num-integer", - "num-traits", -] - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" -dependencies = [ - "cfg-if", - "const-random", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" - -[[package]] -name = "array-macro" -version = "2.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "220a2c618ab466efe41d0eace94dfeff1c35e3aa47891bdb95e1c0fefffd3c99" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "async-trait" -version = "0.1.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "auto_impl" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[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 = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "borsh" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d4d6dafc1a3bb54687538972158f07b2c948bc57d5890df22c0739098b3028" -dependencies = [ - "cfg_aliases", -] - -[[package]] -name = "bs58" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" -dependencies = [ - "sha2", - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" -dependencies = [ - "serde", -] - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "chrono" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets 0.48.5", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clap" -version = "4.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52bdc885e4cacc7f7c9eedc1ef6da641603180c783c41a15c264944deeaab642" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "clap_lex" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" - -[[package]] -name = "coins-bip32" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" -dependencies = [ - "bs58", - "coins-core", - "digest", - "hmac", - "k256", - "serde", - "sha2", - "thiserror", -] - -[[package]] -name = "coins-bip39" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac", - "once_cell", - "pbkdf2 0.12.2", - "rand", - "sha2", - "thiserror", -] - -[[package]] -name = "coins-core" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" -dependencies = [ - "base64 0.21.5", - "bech32", - "bs58", - "digest", - "generic-array", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2", - "sha3", - "thiserror", -] - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "const-hex" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-random" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "curta" -version = "0.1.0" -source = "git+https://github.com/succinctlabs/curta.git#59e489d21622a92b25a2e4a5b710ce322f309b87" -dependencies = [ - "anyhow", - "bincode", - "curve25519-dalek", - "env_logger 0.9.3", - "hex", - "itertools 0.10.5", - "log", - "num", - "plonky2", - "plonky2_maybe_rayon 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand", - "serde", - "subtle-encoding", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest", - "fiat-crypto", - "platforms", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "darling" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.48", -] - -[[package]] -name = "darling_macro" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "data-encoding" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" -dependencies = [ - "curve25519-dalek", - "ed25519", - "rand_core", - "serde", - "sha2", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "ena" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" -dependencies = [ - "log", -] - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" -dependencies = [ - "base64 0.21.5", - "bytes", - "hex", - "k256", - "log", - "rand", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "env_logger" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest", - "hex", - "hmac", - "pbkdf2 0.11.0", - "rand", - "scrypt", - "serde", - "serde_json", - "sha2", - "sha3", - "thiserror", - "uuid 0.8.2", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash 0.8.0", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash 0.8.0", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types 0.12.2", - "scale-info", - "uint", -] - -[[package]] -name = "ethers" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5344eea9b20effb5efeaad29418215c4d27017639fd1f908260f59cbbd226e" -dependencies = [ - "ethers-addressbook", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-middleware", - "ethers-providers", - "ethers-signers", - "ethers-solc", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" -dependencies = [ - "ethers-core", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-contract" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" -dependencies = [ - "const-hex", - "ethers-contract-abigen", - "ethers-contract-derive", - "ethers-core", - "ethers-providers", - "futures-util", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" -dependencies = [ - "Inflector", - "const-hex", - "dunce", - "ethers-core", - "ethers-etherscan", - "eyre", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "reqwest", - "serde", - "serde_json", - "syn 2.0.48", - "toml", - "walkdir", -] - -[[package]] -name = "ethers-contract-derive" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" -dependencies = [ - "Inflector", - "const-hex", - "ethers-contract-abigen", - "ethers-core", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.48", -] - -[[package]] -name = "ethers-core" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" -dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "once_cell", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum", - "syn 2.0.48", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-etherscan" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" -dependencies = [ - "chrono", - "ethers-core", - "reqwest", - "semver", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "ethers-middleware" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract", - "ethers-core", - "ethers-etherscan", - "ethers-providers", - "ethers-signers", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", -] - -[[package]] -name = "ethers-providers" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.5", - "bytes", - "const-hex", - "enr", - "ethers-core", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "http", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "ethers-signers" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "const-hex", - "elliptic-curve", - "eth-keystore", - "ethers-core", - "rand", - "sha2", - "thiserror", - "tracing", -] - -[[package]] -name = "ethers-solc" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64f710586d147864cff66540a6d64518b9ff37d73ef827fee430538265b595f" -dependencies = [ - "cfg-if", - "const-hex", - "dirs", - "dunce", - "ethers-core", - "glob", - "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver", - "serde", - "serde_json", - "solang-parser", - "svm-rs", - "thiserror", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", -] - -[[package]] -name = "eyre" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "byteorder", - "ff_derive", - "rand_core", - "subtle", -] - -[[package]] -name = "ff_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" -dependencies = [ - "addchain", - "cfg-if", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" - -[[package]] -name = "fixed-hash" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" -dependencies = [ - "static_assertions", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -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 = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.1.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash", - "rayon", - "serde", -] - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "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", - "hyper", - "rustls", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", - "serde", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is-terminal" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" -dependencies = [ - "hermit-abi 0.3.3", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "jobserver" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.5", - "pem", - "ring 0.16.20", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "k256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2bd4c29270e724d3eaadf7bdc8700af4221fc0ed771b855eadcd1b98d52851" -dependencies = [ - "primitive-types 0.10.1", - "tiny-keccak", -] - -[[package]] -name = "lalrpop" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" -dependencies = [ - "ascii-canvas", - "bit-set", - "diff", - "ena", - "is-terminal", - "itertools 0.10.5", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax 0.7.5", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "lalrpop-util" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libredox" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" -dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" - -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest", -] - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "near-light-client-circuits" -version = "0.1.0" -dependencies = [ - "borsh", - "plonky2", - "plonky2x", - "serde", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" - -[[package]] -name = "num" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" -dependencies = [ - "num-bigint 0.4.4", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", - "rand", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", - "rand", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint 0.4.4", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.3", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" -dependencies = [ - "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[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" -version = "0.10.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" -dependencies = [ - "bitflags 2.4.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "parity-scale-codec" -version = "3.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" -dependencies = [ - "proc-macro-crate 2.0.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.48.5", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core", - "subtle", -] - -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest", - "hmac", - "password-hash", - "sha2", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", - "hmac", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "petgraph" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" -dependencies = [ - "fixedbitset", - "indexmap 2.1.0", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" - -[[package]] -name = "platforms" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" - -[[package]] -name = "plonky2" -version = "0.1.4" -source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" -dependencies = [ - "ahash", - "anyhow", - "getrandom", - "hashbrown 0.14.3", - "itertools 0.11.0", - "keccak-hash", - "log", - "num", - "plonky2_field", - "plonky2_maybe_rayon 0.1.1 (git+https://github.com/mir-protocol/plonky2.git)", - "plonky2_util", - "rand", - "rand_chacha", - "serde", - "serde_json", - "static_assertions", - "unroll", -] - -[[package]] -name = "plonky2_field" -version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" -dependencies = [ - "anyhow", - "itertools 0.11.0", - "num", - "plonky2_util", - "rand", - "serde", - "static_assertions", - "unroll", -] - -[[package]] -name = "plonky2_maybe_rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194db0cbdd974e92d897cd92b74adb3968dc1b967315eb280357c49a7637994e" -dependencies = [ - "rayon", -] - -[[package]] -name = "plonky2_maybe_rayon" -version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" -dependencies = [ - "rayon", -] - -[[package]] -name = "plonky2_util" -version = "0.1.1" -source = "git+https://github.com/mir-protocol/plonky2.git#3e61f06a1d2012785c65f1708620cf399857ac8d" - -[[package]] -name = "plonky2x" -version = "0.1.0" -source = "git+https://github.com/succinctlabs/succinctx.git#abd43565ef519da40d73240557cec95d962aa257" -dependencies = [ - "anyhow", - "array-macro", - "async-trait", - "backtrace", - "base64 0.13.1", - "bincode", - "clap", - "curta", - "curve25519-dalek", - "digest", - "dotenv", - "ed25519-dalek", - "env_logger 0.10.1", - "ethers", - "ff", - "futures", - "hex", - "itertools 0.10.5", - "lazy_static", - "log", - "num", - "num-bigint 0.4.4", - "plonky2", - "plonky2x-derive", - "rand", - "reqwest", - "serde", - "serde_json", - "serde_plain", - "serde_with", - "sha2", - "sha256", - "tokio", - "tracing", - "uuid 1.6.1", -] - -[[package]] -name = "plonky2x-derive" -version = "0.1.0" -source = "git+https://github.com/succinctlabs/succinctx.git#abd43565ef519da40d73240557cec95d962aa257" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" -dependencies = [ - "proc-macro2", - "syn 2.0.48", -] - -[[package]] -name = "primitive-types" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373" -dependencies = [ - "fixed-hash 0.7.0", - "uint", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash 0.8.0", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" -dependencies = [ - "toml_edit 0.20.7", -] - -[[package]] -name = "proc-macro-crate" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b2685dd208a3771337d8d386a89840f0f43cd68be8dae90a5f8c2384effc9cd" -dependencies = [ - "toml_edit 0.21.0", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" -dependencies = [ - "bitflags 2.4.1", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.8.2", - "unarray", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "reqwest" -version = "0.11.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" -dependencies = [ - "base64 0.21.5", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "system-configuration", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" -dependencies = [ - "cc", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.48.0", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" -dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls" -version = "0.21.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" -dependencies = [ - "log", - "ring 0.17.7", - "rustls-webpki", - "sct", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.5", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.7", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scale-info" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "pbkdf2 0.11.0", - "salsa20", - "sha2", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.7", - "untrusted 0.9.0", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" -dependencies = [ - "serde", -] - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.195" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.195" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "serde_json" -version = "1.0.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_plain" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1fc6db65a611022b23a0dec6975d63fb80a302cb3388835ff02c097258d50" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" -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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" -dependencies = [ - "base64 0.21.5", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.1.0", - "serde", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha256" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18278f6a914fa3070aa316493f7d2ddfb9ac86ebc06fa3b83bffda487e9065b0" -dependencies = [ - "async-trait", - "bytes", - "hex", - "sha2", - "tokio", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint 0.4.4", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "solang-parser" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" -dependencies = [ - "itertools 0.11.0", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror", - "unicode-xid", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" -dependencies = [ - "new_debug_unreachable", - "once_cell", - "parking_lot", - "phf_shared 0.10.0", - "precomputed-hash", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.48", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "subtle-encoding" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcb1ed7b8330c5eed5441052651dd7a12c75e2ed88f2ec024ae1fa3a5e59945" -dependencies = [ - "zeroize", -] - -[[package]] -name = "svm-rs" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20689c7d03b6461b502d0b95d6c24874c7d24dea2688af80486a130a06af3b07" -dependencies = [ - "dirs", - "fs2", - "hex", - "once_cell", - "reqwest", - "semver", - "serde", - "serde_json", - "sha2", - "thiserror", - "url", - "zip", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "time" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" -dependencies = [ - "deranged", - "itoa", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" -dependencies = [ - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[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]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "rustls", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.21.0", -] - -[[package]] -name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" -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.1.0", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap 2.1.0", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" -dependencies = [ - "indexmap 2.1.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "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.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "unroll" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad948c1cb799b1a70f836077721a92a35ac177d4daddf4c20a633786d4cf618" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", - "serde", -] - -[[package]] -name = "uuid" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" -dependencies = [ - "serde", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.48", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" - -[[package]] -name = "web-sys" -version = "0.3.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[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.0", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" -dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" - -[[package]] -name = "winnow" -version = "0.5.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7520bbdec7211caa7c4e682eb1fbe07abe20cee6756b6e00f537c82c11816aa" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version", - "send_wrapper 0.6.0", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - -[[package]] -name = "zerocopy" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/nearx/Cargo.toml b/nearx/Cargo.toml index 39b5d104..eef246a1 100644 --- a/nearx/Cargo.toml +++ b/nearx/Cargo.toml @@ -7,10 +7,9 @@ version.workspace = true [dependencies] async-trait.workspace = true -borsh.workspace = true cfg-if = "1.0.0" -ethers = "2.0.11" -hex.workspace = true +clap = "4.4.6" +ethers = "2.0" log.workspace = true pretty_assertions = "1.4.0" serde.workspace = true @@ -19,8 +18,9 @@ serde.workspace = true plonky2 = { git = "https://github.com/mir-protocol/plonky2.git" } plonky2x = { git = "https://github.com/succinctlabs/succinctx.git" } -near-light-client-protocol.workspace = true -near-light-client-rpc.workspace = true +near-light-client-primitives.workspace = true +near-light-client-protocol.workspace = true +near-light-client-rpc.workspace = true [dev-dependencies] borsh.workspace = true diff --git a/nearx/contract/abi.json b/nearx/contract/abi.json new file mode 100644 index 00000000..9dc4f69a --- /dev/null +++ b/nearx/contract/abi.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"payable"},{"type":"function","name":"DEFAULT_GAS_LIMIT","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"SYNC_GAS_LIMIT","inputs":[],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"decodeResults","inputs":[{"name":"_output","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct ProofVerificationResult[]","components":[{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"result","type":"bool","internalType":"bool"}]}],"stateMutability":"pure"},{"type":"function","name":"gateway","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"handleSync","inputs":[{"name":"_output","type":"bytes","internalType":"bytes"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"handleVerify","inputs":[{"name":"_output","type":"bytes","internalType":"bytes"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[{"name":"initialOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"latestHeader","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"requestSync","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"requestVerify","inputs":[{"name":"ids","type":"tuple[]","internalType":"struct TransactionOrReceiptId[]","components":[{"name":"isTransaction","type":"bool","internalType":"bool"},{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"setCheckpointHeader","inputs":[{"name":"_header","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"sync","inputs":[{"name":"trustedHeader","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"syncFunctionId","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateGateway","inputs":[{"name":"_gateway","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateSyncId","inputs":[{"name":"_functionId","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateVerifyId","inputs":[{"name":"_functionId","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"verify","inputs":[{"name":"trustedHeader","type":"bytes32","internalType":"bytes32"},{"name":"_ids","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"verifyFunctionId","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"event","name":"HeadUpdate","inputs":[{"name":"headerHash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SyncRequested","inputs":[{"name":"trustedHeader","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"VerifyRequested","inputs":[{"name":"trustedHeader","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"ids","type":"tuple[]","indexed":true,"internalType":"struct TransactionOrReceiptId[]","components":[{"name":"isTransaction","type":"bool","internalType":"bool"},{"name":"id","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"bytes","internalType":"bytes"}]}],"anonymous":false},{"type":"event","name":"VerifyResult","inputs":[{"name":"results","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedInnerCall","inputs":[]},{"type":"error","name":"FunctionIdsNotInitialised","inputs":[]},{"type":"error","name":"GatewayNotInitialised","inputs":[]},{"type":"error","name":"HeaderNotInitialised","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotFromSuccinctGateway","inputs":[{"name":"","type":"address","internalType":"address"}]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"TrustedHeaderNotFound","inputs":[]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}],"bytecode":{"object":"0x60a060405230608052610010610015565b6100c7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100655760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100c45780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051611fde6100f060003960008181610e8d01528181610eb601526110390152611fde6000f3fe60806040526004361061018b5760003560e01c80638d363ad0116100d6578063c0346b201161007f578063d7c908fc11610059578063d7c908fc14610467578063f2fde38b1461047a578063fd4f593d1461049a57600080fd5b8063c0346b2014610410578063c4d66de814610430578063d6be695a1461045057600080fd5b8063ae4b2551116100b0578063ae4b2551146103ba578063b291c2d7146103da578063bba3fe8e146103fa57600080fd5b80638d363ad0146103075780638da5cb5b14610327578063ad3cb1cc1461036457600080fd5b806352d1902d11610138578063694e6f6911610112578063694e6f69146102d4578063715018a6146102ea5780637a03780a146102ff57600080fd5b806352d1902d1461026e5780635629df5b1461029157806356e484e1146102a757600080fd5b80632bdd271f116101695780632bdd271f1461021b5780632ebfd37f1461023b5780634f1ef2861461025b57600080fd5b8063116191b614610190578063258ae582146101cd57806328db958e146101ef575b600080fd5b34801561019c57600080fd5b506000546101b0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d957600080fd5b506101ed6101e83660046117b4565b6104ba565b005b3480156101fb57600080fd5b5061020662061a8081565b60405163ffffffff90911681526020016101c4565b34801561022757600080fd5b506101ed610236366004611800565b610573565b34801561024757600080fd5b506101ed610256366004611819565b610580565b6101ed61026936600461198f565b610670565b34801561027a57600080fd5b5061028361068f565b6040519081526020016101c4565b34801561029d57600080fd5b5061028360025481565b3480156102b357600080fd5b506102c76102c23660046119dd565b6106be565b6040516101c49190611a1f565b3480156102e057600080fd5b5061028360015481565b3480156102f657600080fd5b506101ed610708565b6101ed61071c565b34801561031357600080fd5b506101ed610322366004611819565b610832565b34801561033357600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101b0565b34801561037057600080fd5b506103ad6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101c49190611ac0565b3480156103c657600080fd5b506101ed6103d5366004611800565b61091d565b3480156103e657600080fd5b506101ed6103f5366004611800565b6109dd565b34801561040657600080fd5b5061028360035481565b34801561041c57600080fd5b506101ed61042b366004611ad3565b6109ea565b34801561043c57600080fd5b506101ed61044b366004611ad3565b610a21565b34801561045c57600080fd5b50610206620f424081565b6101ed610475366004611aee565b610b66565b34801561048657600080fd5b506101ed610495366004611ad3565b610caf565b3480156104a657600080fd5b506101ed6104b5366004611800565b610d06565b6104c2610d13565b600080546002546040516001600160a01b039092169163176e62fd91906104f190889088908890602001611b63565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161051d929190611b7d565b600060405180830381865afa15801561053a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105629190810190611b9e565b905061056d81610dd4565b50505050565b61057b610e0e565b600255565b6000546001600160a01b03163314158061060c575060008054906101000a90046001600160a01b03166001600160a01b03166305d7c1cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060a9190611c1a565b155b156106315760405163e74f74d560e01b81523360048201526024015b60405180910390fd5b61056d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dd492505050565b610678610e82565b61068182610f39565b61068b8282610f41565b5050565b600061069961102e565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60606106ff83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061107792505050565b90505b92915050565b610710610e0e565b61071a600061114b565b565b610724610d13565b6000546001546003546040805160208101929092526060936001600160a01b03169263b3f04fdf9234920160408051601f19818403018152908290527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1682526107bf929187907f8d363ad0000000000000000000000000000000000000000000000000000000009062061a8090600401611c37565b60206040518083038185885af11580156107dd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108029190611ca3565b506003546040517fbc7802dd01d060a46b393cebd91b8a39c249a47db8f922fd5f42099dadd4996c90600090a250565b6000546001600160a01b0316331415806108be575060008054906101000a90046001600160a01b03166001600160a01b03166305d7c1cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc9190611c1a565b155b156108de5760405163e74f74d560e01b8152336004820152602401610628565b61056d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111c992505050565b610925610d13565b6000805460015460408051602080820187905282518083039091018152818301928390527f176e62fd000000000000000000000000000000000000000000000000000000009092526001600160a01b039093169263176e62fd9261098d929091604401611b7d565b600060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d29190810190611b9e565b905061068b816111c9565b6109e5610e0e565b600155565b6109f2610e0e565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610a6c5750825b905060008267ffffffffffffffff166001148015610a895750303b155b905081158015610a97575080155b15610ace576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b0257845468ff00000000000000001916680100000000000000001785555b610b0b8661121e565b610b1361122f565b8315610b5e57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b610b6e610d13565b600354606090600090610b89610b848587611cbc565b611237565b604051602001610b9a929190611d8d565b60408051601f19818403018152908290526000546002547fb3f04fdf0000000000000000000000000000000000000000000000000000000084529193506001600160a01b03169163b3f04fdf913491610c219190869088907f2ebfd37f0000000000000000000000000000000000000000000000000000000090620f424090600401611c37565b60206040518083038185885af1158015610c3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c649190611ca3565b508383604051610c75929190611db3565b60405190819003812060035490917fa4dd48505d62b0b473f0d1ab4fff5474d7b864f5f8b0ac9bd0e4ff184097b05b90600090a350505050565b610cb7610e0e565b6001600160a01b038116610cfa576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610628565b610d038161114b565b50565b610d0e610e0e565b600355565b6000546001600160a01b0316610d55576040517f516f125900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001541580610d645750600254155b15610d9b576040517fc85781e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035461071a576040517f40a70d0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f5311e4917ade30f8717c536ae671c9ef3321b1ec3158a9978c939f1d59ec284281604051610e039190611ac0565b60405180910390a150565b33610e407f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461071a576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610628565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f1b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f0f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b1561071a5760405163703e46dd60e11b815260040160405180910390fd5b610d03610e0e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f9b575060408051601f3d908101601f19168201909252610f9891810190611ca3565b60015b610fc357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610628565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461101f576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610628565b611029838361135d565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071a5760405163703e46dd60e11b815260040160405180910390fd5b6060600060219050600081845161108e9190611e6b565b905060008167ffffffffffffffff8111156110ab576110ab6118a1565b6040519080825280602002602001820160405280156110f057816020015b60408051808201909152600080825260208201528152602001906001900390816110c95790505b50905060606000805b8481101561113f5761110c8883886113b3565b909350915061111a836114a4565b84828151811061112c5761112c611e8d565b60209081029190910101526001016110f9565b50919695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000818060200190518101906111df9190611ca3565b60038190556040518181529091507fcbd408984914065fc31971bedb3cfb58a26f657e00781d55dad5dac5d0ff50c99060200160405180910390a15050565b611226611510565b610d0381611577565b61071a611510565b60608060005b83518110156113565780156112d0578184828151811061125f5761125f611e8d565b60200260200101516000015185838151811061127d5761127d611e8d565b60200260200101516020015186848151811061129b5761129b611e8d565b6020026020010151604001516040516020016112ba9493929190611ea3565b604051602081830303815290604052915061134e565b8381815181106112e2576112e2611e8d565b60200260200101516000015184828151811061130057611300611e8d565b60200260200101516020015185838151811061131e5761131e611e8d565b60200260200101516040015160405160200161133c93929190611ee9565b60405160208183030381529060405291505b60010161123d565b5092915050565b6113668261157f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156113ab576110298282611603565b61068b611679565b606060006113c18385611f1b565b9050845181111561142e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42797465733a204f7574206f662072616e6765000000000000000000000000006044820152606401610628565b8267ffffffffffffffff811115611447576114476118a1565b6040519080825280601f01601f191660200182016040528015611471576020820181803683370190505b5091508360208601016020830160005b85811015611499578281015182820152602001611481565b505050935093915050565b6040805180820190915260008082526020820152606060006114c8848260206113b3565b815191935091506114e29083016020908101908401611ca3565b83526114f0848260016113b3565b90925090506114fe82611f3c565b60f81c15156020840152509092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661071a576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb7611510565b806001600160a01b03163b6000036115b557604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610628565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516116209190611f8c565b600060405180830381855af49150503d806000811461165b576040519150601f19603f3d011682016040523d82523d6000602084013e611660565b606091505b50915091506116708583836116b1565b95945050505050565b341561071a576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826116c6576116c182611729565b611722565b81511580156116dd57506001600160a01b0384163b155b1561171f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610628565b50805b9392505050565b8051156117395780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008083601f84011261177d57600080fd5b50813567ffffffffffffffff81111561179557600080fd5b6020830191508360208285010111156117ad57600080fd5b9250929050565b6000806000604084860312156117c957600080fd5b83359250602084013567ffffffffffffffff8111156117e757600080fd5b6117f38682870161176b565b9497909650939450505050565b60006020828403121561181257600080fd5b5035919050565b6000806000806040858703121561182f57600080fd5b843567ffffffffffffffff8082111561184757600080fd5b6118538883890161176b565b9096509450602087013591508082111561186c57600080fd5b506118798782880161176b565b95989497509550505050565b80356001600160a01b038116811461189c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118da576118da6118a1565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611909576119096118a1565b604052919050565b600067ffffffffffffffff82111561192b5761192b6118a1565b50601f01601f191660200190565b600082601f83011261194a57600080fd5b813561195d61195882611911565b6118e0565b81815284602083860101111561197257600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156119a257600080fd5b6119ab83611885565b9150602083013567ffffffffffffffff8111156119c757600080fd5b6119d385828601611939565b9150509250929050565b600080602083850312156119f057600080fd5b823567ffffffffffffffff811115611a0757600080fd5b611a138582860161176b565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015611a63578151805185528601511515868501529284019290850190600101611a3c565b5091979650505050505050565b60005b83811015611a8b578181015183820152602001611a73565b50506000910152565b60008151808452611aac816020860160208601611a70565b601f01601f19169290920160200192915050565b6020815260006106ff6020830184611a94565b600060208284031215611ae557600080fd5b6106ff82611885565b60008060208385031215611b0157600080fd5b823567ffffffffffffffff80821115611b1957600080fd5b818501915085601f830112611b2d57600080fd5b813581811115611b3c57600080fd5b8660208260051b8501011115611b5157600080fd5b60209290920196919550909350505050565b838152818360208301376000910160200190815292915050565b828152604060208201526000611b966040830184611a94565b949350505050565b600060208284031215611bb057600080fd5b815167ffffffffffffffff811115611bc757600080fd5b8201601f81018413611bd857600080fd5b8051611be661195882611911565b818152856020838501011115611bfb57600080fd5b611670826020830160208601611a70565b8015158114610d0357600080fd5b600060208284031215611c2c57600080fd5b815161172281611c0c565b85815260a060208201526000611c5060a0830187611a94565b8281036040840152611c628187611a94565b9150507fffffffff000000000000000000000000000000000000000000000000000000008416606083015263ffffffff831660808301529695505050505050565b600060208284031215611cb557600080fd5b5051919050565b600067ffffffffffffffff80841115611cd757611cd76118a1565b8360051b6020611ce88183016118e0565b868152918501918181019036841115611d0057600080fd5b865b84811015611d8157803586811115611d1a5760008081fd5b88016060368290031215611d2e5760008081fd5b611d366118b7565b8135611d4181611c0c565b8152818601358682015260408083013589811115611d5f5760008081fd5b611d6b36828601611939565b9183019190915250845250918301918301611d02565b50979650505050505050565b82815260008251611da5816020850160208701611a70565b919091016020019392505050565b60008184825b85811015611e60578135605e19883603018112611dd557600080fd5b87018035611de281611c0c565b151584526020818101358186015260408083013536849003601e19018112611e0957600080fd5b90920181810192903567ffffffffffffffff811115611e2757600080fd5b803603841315611e3657600080fd5b8084838901376000878201830152601f01601f191690950190940193929092019150600101611db9565b509095945050505050565b600082611e8857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60008551611eb5818460208a01611a70565b808301905085151560f81b81528460018201528351611edb816021840160208801611a70565b016021019695505050505050565b83151560f81b815282600182015260008251611f0c816021850160208701611a70565b91909101602101949350505050565b8082018082111561070257634e487b7160e01b600052601160045260246000fd5b6000815160208301517fff0000000000000000000000000000000000000000000000000000000000000080821693506001831015611f845780818460010360031b1b83161693505b505050919050565b60008251611f9e818460208701611a70565b919091019291505056fea2646970667358221220a4763880f4f565a8ed3ff206e679c83c223c1a392b125999a54c0edf7469ab5564736f6c63430008180033","sourceMap":"638:4675:58:-:0;;;1171:4:25;1128:48;;806:22:58;:20;:22::i;:::-;638:4675;;7711:422:24;8870:21;7900:15;;;;;;;7896:76;;;7938:23;;-1:-1:-1;;;7938:23:24;;;;;;;;;;;7896:76;7985:14;;-1:-1:-1;;;;;7985:14:24;;;:34;7981:146;;8035:33;;-1:-1:-1;;;;;;8035:33:24;-1:-1:-1;;;;;8035:33:24;;;;;8087:29;;158:50:63;;;8087:29:24;;146:2:63;131:18;8087:29:24;;;;;;;7981:146;7760:373;7711:422::o;14:200:63:-;638:4675:58;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061018b5760003560e01c80638d363ad0116100d6578063c0346b201161007f578063d7c908fc11610059578063d7c908fc14610467578063f2fde38b1461047a578063fd4f593d1461049a57600080fd5b8063c0346b2014610410578063c4d66de814610430578063d6be695a1461045057600080fd5b8063ae4b2551116100b0578063ae4b2551146103ba578063b291c2d7146103da578063bba3fe8e146103fa57600080fd5b80638d363ad0146103075780638da5cb5b14610327578063ad3cb1cc1461036457600080fd5b806352d1902d11610138578063694e6f6911610112578063694e6f69146102d4578063715018a6146102ea5780637a03780a146102ff57600080fd5b806352d1902d1461026e5780635629df5b1461029157806356e484e1146102a757600080fd5b80632bdd271f116101695780632bdd271f1461021b5780632ebfd37f1461023b5780634f1ef2861461025b57600080fd5b8063116191b614610190578063258ae582146101cd57806328db958e146101ef575b600080fd5b34801561019c57600080fd5b506000546101b0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d957600080fd5b506101ed6101e83660046117b4565b6104ba565b005b3480156101fb57600080fd5b5061020662061a8081565b60405163ffffffff90911681526020016101c4565b34801561022757600080fd5b506101ed610236366004611800565b610573565b34801561024757600080fd5b506101ed610256366004611819565b610580565b6101ed61026936600461198f565b610670565b34801561027a57600080fd5b5061028361068f565b6040519081526020016101c4565b34801561029d57600080fd5b5061028360025481565b3480156102b357600080fd5b506102c76102c23660046119dd565b6106be565b6040516101c49190611a1f565b3480156102e057600080fd5b5061028360015481565b3480156102f657600080fd5b506101ed610708565b6101ed61071c565b34801561031357600080fd5b506101ed610322366004611819565b610832565b34801561033357600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101b0565b34801561037057600080fd5b506103ad6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101c49190611ac0565b3480156103c657600080fd5b506101ed6103d5366004611800565b61091d565b3480156103e657600080fd5b506101ed6103f5366004611800565b6109dd565b34801561040657600080fd5b5061028360035481565b34801561041c57600080fd5b506101ed61042b366004611ad3565b6109ea565b34801561043c57600080fd5b506101ed61044b366004611ad3565b610a21565b34801561045c57600080fd5b50610206620f424081565b6101ed610475366004611aee565b610b66565b34801561048657600080fd5b506101ed610495366004611ad3565b610caf565b3480156104a657600080fd5b506101ed6104b5366004611800565b610d06565b6104c2610d13565b600080546002546040516001600160a01b039092169163176e62fd91906104f190889088908890602001611b63565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161051d929190611b7d565b600060405180830381865afa15801561053a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105629190810190611b9e565b905061056d81610dd4565b50505050565b61057b610e0e565b600255565b6000546001600160a01b03163314158061060c575060008054906101000a90046001600160a01b03166001600160a01b03166305d7c1cf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060a9190611c1a565b155b156106315760405163e74f74d560e01b81523360048201526024015b60405180910390fd5b61056d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610dd492505050565b610678610e82565b61068182610f39565b61068b8282610f41565b5050565b600061069961102e565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b60606106ff83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061107792505050565b90505b92915050565b610710610e0e565b61071a600061114b565b565b610724610d13565b6000546001546003546040805160208101929092526060936001600160a01b03169263b3f04fdf9234920160408051601f19818403018152908290527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1682526107bf929187907f8d363ad0000000000000000000000000000000000000000000000000000000009062061a8090600401611c37565b60206040518083038185885af11580156107dd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108029190611ca3565b506003546040517fbc7802dd01d060a46b393cebd91b8a39c249a47db8f922fd5f42099dadd4996c90600090a250565b6000546001600160a01b0316331415806108be575060008054906101000a90046001600160a01b03166001600160a01b03166305d7c1cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc9190611c1a565b155b156108de5760405163e74f74d560e01b8152336004820152602401610628565b61056d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506111c992505050565b610925610d13565b6000805460015460408051602080820187905282518083039091018152818301928390527f176e62fd000000000000000000000000000000000000000000000000000000009092526001600160a01b039093169263176e62fd9261098d929091604401611b7d565b600060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109d29190810190611b9e565b905061068b816111c9565b6109e5610e0e565b600155565b6109f2610e0e565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610a6c5750825b905060008267ffffffffffffffff166001148015610a895750303b155b905081158015610a97575080155b15610ace576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b0257845468ff00000000000000001916680100000000000000001785555b610b0b8661121e565b610b1361122f565b8315610b5e57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b610b6e610d13565b600354606090600090610b89610b848587611cbc565b611237565b604051602001610b9a929190611d8d565b60408051601f19818403018152908290526000546002547fb3f04fdf0000000000000000000000000000000000000000000000000000000084529193506001600160a01b03169163b3f04fdf913491610c219190869088907f2ebfd37f0000000000000000000000000000000000000000000000000000000090620f424090600401611c37565b60206040518083038185885af1158015610c3f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c649190611ca3565b508383604051610c75929190611db3565b60405190819003812060035490917fa4dd48505d62b0b473f0d1ab4fff5474d7b864f5f8b0ac9bd0e4ff184097b05b90600090a350505050565b610cb7610e0e565b6001600160a01b038116610cfa576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610628565b610d038161114b565b50565b610d0e610e0e565b600355565b6000546001600160a01b0316610d55576040517f516f125900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001541580610d645750600254155b15610d9b576040517fc85781e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035461071a576040517f40a70d0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f5311e4917ade30f8717c536ae671c9ef3321b1ec3158a9978c939f1d59ec284281604051610e039190611ac0565b60405180910390a150565b33610e407f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461071a576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610628565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f1b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f0f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b1561071a5760405163703e46dd60e11b815260040160405180910390fd5b610d03610e0e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f9b575060408051601f3d908101601f19168201909252610f9891810190611ca3565b60015b610fc357604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610628565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461101f576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610628565b611029838361135d565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071a5760405163703e46dd60e11b815260040160405180910390fd5b6060600060219050600081845161108e9190611e6b565b905060008167ffffffffffffffff8111156110ab576110ab6118a1565b6040519080825280602002602001820160405280156110f057816020015b60408051808201909152600080825260208201528152602001906001900390816110c95790505b50905060606000805b8481101561113f5761110c8883886113b3565b909350915061111a836114a4565b84828151811061112c5761112c611e8d565b60209081029190910101526001016110f9565b50919695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000818060200190518101906111df9190611ca3565b60038190556040518181529091507fcbd408984914065fc31971bedb3cfb58a26f657e00781d55dad5dac5d0ff50c99060200160405180910390a15050565b611226611510565b610d0381611577565b61071a611510565b60608060005b83518110156113565780156112d0578184828151811061125f5761125f611e8d565b60200260200101516000015185838151811061127d5761127d611e8d565b60200260200101516020015186848151811061129b5761129b611e8d565b6020026020010151604001516040516020016112ba9493929190611ea3565b604051602081830303815290604052915061134e565b8381815181106112e2576112e2611e8d565b60200260200101516000015184828151811061130057611300611e8d565b60200260200101516020015185838151811061131e5761131e611e8d565b60200260200101516040015160405160200161133c93929190611ee9565b60405160208183030381529060405291505b60010161123d565b5092915050565b6113668261157f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156113ab576110298282611603565b61068b611679565b606060006113c18385611f1b565b9050845181111561142e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42797465733a204f7574206f662072616e6765000000000000000000000000006044820152606401610628565b8267ffffffffffffffff811115611447576114476118a1565b6040519080825280601f01601f191660200182016040528015611471576020820181803683370190505b5091508360208601016020830160005b85811015611499578281015182820152602001611481565b505050935093915050565b6040805180820190915260008082526020820152606060006114c8848260206113b3565b815191935091506114e29083016020908101908401611ca3565b83526114f0848260016113b3565b90925090506114fe82611f3c565b60f81c15156020840152509092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661071a576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb7611510565b806001600160a01b03163b6000036115b557604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610628565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516116209190611f8c565b600060405180830381855af49150503d806000811461165b576040519150601f19603f3d011682016040523d82523d6000602084013e611660565b606091505b50915091506116708583836116b1565b95945050505050565b341561071a576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826116c6576116c182611729565b611722565b81511580156116dd57506001600160a01b0384163b155b1561171f576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610628565b50805b9392505050565b8051156117395780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008083601f84011261177d57600080fd5b50813567ffffffffffffffff81111561179557600080fd5b6020830191508360208285010111156117ad57600080fd5b9250929050565b6000806000604084860312156117c957600080fd5b83359250602084013567ffffffffffffffff8111156117e757600080fd5b6117f38682870161176b565b9497909650939450505050565b60006020828403121561181257600080fd5b5035919050565b6000806000806040858703121561182f57600080fd5b843567ffffffffffffffff8082111561184757600080fd5b6118538883890161176b565b9096509450602087013591508082111561186c57600080fd5b506118798782880161176b565b95989497509550505050565b80356001600160a01b038116811461189c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156118da576118da6118a1565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611909576119096118a1565b604052919050565b600067ffffffffffffffff82111561192b5761192b6118a1565b50601f01601f191660200190565b600082601f83011261194a57600080fd5b813561195d61195882611911565b6118e0565b81815284602083860101111561197257600080fd5b816020850160208301376000918101602001919091529392505050565b600080604083850312156119a257600080fd5b6119ab83611885565b9150602083013567ffffffffffffffff8111156119c757600080fd5b6119d385828601611939565b9150509250929050565b600080602083850312156119f057600080fd5b823567ffffffffffffffff811115611a0757600080fd5b611a138582860161176b565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015611a63578151805185528601511515868501529284019290850190600101611a3c565b5091979650505050505050565b60005b83811015611a8b578181015183820152602001611a73565b50506000910152565b60008151808452611aac816020860160208601611a70565b601f01601f19169290920160200192915050565b6020815260006106ff6020830184611a94565b600060208284031215611ae557600080fd5b6106ff82611885565b60008060208385031215611b0157600080fd5b823567ffffffffffffffff80821115611b1957600080fd5b818501915085601f830112611b2d57600080fd5b813581811115611b3c57600080fd5b8660208260051b8501011115611b5157600080fd5b60209290920196919550909350505050565b838152818360208301376000910160200190815292915050565b828152604060208201526000611b966040830184611a94565b949350505050565b600060208284031215611bb057600080fd5b815167ffffffffffffffff811115611bc757600080fd5b8201601f81018413611bd857600080fd5b8051611be661195882611911565b818152856020838501011115611bfb57600080fd5b611670826020830160208601611a70565b8015158114610d0357600080fd5b600060208284031215611c2c57600080fd5b815161172281611c0c565b85815260a060208201526000611c5060a0830187611a94565b8281036040840152611c628187611a94565b9150507fffffffff000000000000000000000000000000000000000000000000000000008416606083015263ffffffff831660808301529695505050505050565b600060208284031215611cb557600080fd5b5051919050565b600067ffffffffffffffff80841115611cd757611cd76118a1565b8360051b6020611ce88183016118e0565b868152918501918181019036841115611d0057600080fd5b865b84811015611d8157803586811115611d1a5760008081fd5b88016060368290031215611d2e5760008081fd5b611d366118b7565b8135611d4181611c0c565b8152818601358682015260408083013589811115611d5f5760008081fd5b611d6b36828601611939565b9183019190915250845250918301918301611d02565b50979650505050505050565b82815260008251611da5816020850160208701611a70565b919091016020019392505050565b60008184825b85811015611e60578135605e19883603018112611dd557600080fd5b87018035611de281611c0c565b151584526020818101358186015260408083013536849003601e19018112611e0957600080fd5b90920181810192903567ffffffffffffffff811115611e2757600080fd5b803603841315611e3657600080fd5b8084838901376000878201830152601f01601f191690950190940193929092019150600101611db9565b509095945050505050565b600082611e8857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b60008551611eb5818460208a01611a70565b808301905085151560f81b81528460018201528351611edb816021840160208801611a70565b016021019695505050505050565b83151560f81b815282600182015260008251611f0c816021850160208701611a70565b91909101602101949350505050565b8082018082111561070257634e487b7160e01b600052601160045260246000fd5b6000815160208301517fff0000000000000000000000000000000000000000000000000000000000000080821693506001831015611f845780818460010360031b1b83161693505b505050919050565b60008251611f9e818460208701611a70565b919091019291505056fea2646970667358221220a4763880f4f565a8ed3ff206e679c83c223c1a392b125999a54c0edf7469ab5564736f6c63430008180033","sourceMap":"638:4675:58:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1267:22;;;;;;;;;;-1:-1:-1;1267:22:58;;;;-1:-1:-1;;;;;1267:22:58;;;;;;-1:-1:-1;;;;;178:55:63;;;160:74;;148:2;133:18;1267:22:58;;;;;;;;4711:302;;;;;;;;;;-1:-1:-1;4711:302:58;;;;;:::i;:::-;;:::i;:::-;;1161:46;;;;;;;;;;;;1201:6;1161:46;;;;;1253:10:63;1241:23;;;1223:42;;1211:2;1196:18;1161:46:58;1079:192:63;1747:111:58;;;;;;;;;;-1:-1:-1;1747:111:58;;;;;:::i;:::-;;:::i;4445:260::-;;;;;;;;;;-1:-1:-1;4445:260:58;;;;;:::i;:::-;;:::i;4158:214:25:-;;;;;;:::i;:::-;;:::i;3705:134::-;;;;;;;;;;;;;:::i;:::-;;;4314:25:63;;;4302:2;4287:18;3705:134:25;4168:177:63;1402:31:58;;;;;;;;;;;;;;;;5127:184;;;;;;;;;;-1:-1:-1;5127:184:58;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1330:29::-;;;;;;;;;;;;;;;;3155:101:23;;;;;;;;;;;;;:::i;2491:389:58:-;;;:::i;2886:383::-;;;;;;;;;;-1:-1:-1;2886:383:58;;;;;:::i;:::-;;:::i;2441:144:23:-;;;;;;;;;;-1:-1:-1;1313:22:23;2570:8;-1:-1:-1;;;;;2570:8:23;2441:144;;1819:58:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3346:322:58:-;;;;;;;;;;-1:-1:-1;3346:322:58;;;;;:::i;:::-;;:::i;1634:107::-;;;;;;;;;;-1:-1:-1;1634:107:58;;;;;:::i;:::-;;:::i;1499:27::-;;;;;;;;;;;;;;;;1533:95;;;;;;;;;;-1:-1:-1;1533:95:58;;;;;:::i;:::-;;:::i;841:140::-;;;;;;;;;;-1:-1:-1;841:140:58;;;;;:::i;:::-;;:::i;1105:50::-;;;;;;;;;;;;1148:7;1105:50;;3885:554;;;;;;:::i;:::-;;:::i;3405:215:23:-;;;;;;;;;;-1:-1:-1;3405:215:23;;;;;:::i;:::-;;:::i;1961:104:58:-;;;;;;;;;;-1:-1:-1;1961:104:58;;;;;:::i;:::-;;:::i;4711:302::-;4790:19;:17;:19::i;:::-;4819;4858:7;;4893:16;;4923:37;;-1:-1:-1;;;;;4858:7:58;;;;4841:38;;4893:16;4923:37;;4940:13;;4955:4;;;;4923:37;;;:::i;:::-;;;;;;;;;;;;;4841:129;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4841:129:58;;;;;;;;;;;;:::i;:::-;4819:151;;4980:26;4999:6;4980:18;:26::i;:::-;4780:233;4711:302;;;:::o;1747:111::-;2334:13:23;:11;:13::i;:::-;1821:16:58::1;:30:::0;1747:111::o;4445:260::-;4544:7;;-1:-1:-1;;;;;4544:7:58;4530:10;:21;;;:64;;;4573:7;;;;;;;;-1:-1:-1;;;;;4573:7:58;-1:-1:-1;;;;;4556:36:58;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4555:39;4530:64;4526:136;;;4617:34;;-1:-1:-1;;;4617:34:58;;4640:10;4617:34;;;160:74:63;133:18;;4617:34:58;;;;;;;;4526:136;4671:27;4690:7;;4671:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4671:18:58;;-1:-1:-1;;;4671:27:58:i;4158:214:25:-;2653:13;:11;:13::i;:::-;4273:36:::1;4291:17;4273;:36::i;:::-;4319:46;4341:17;4360:4;4319:21;:46::i;:::-;4158:214:::0;;:::o;3705:134::-;3774:7;2924:20;:18;:20::i;:::-;-1:-1:-1;1327:66:31::1;3705:134:25::0;:::o;5127:184:58:-;5221:32;5276:28;5296:7;;5276:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5276:19:58;;-1:-1:-1;;;5276:28:58:i;:::-;5269:35;;5127:184;;;;;:::o;3155:101:23:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;2491:389:58:-;2541:19;:17;:19::i;:::-;2618:7;;;2674:14;2719:12;;2702:30;;;;;;9015:19:63;;;;2570:20:58;;-1:-1:-1;;;;;2618:7:58;;2601:41;;2650:9;;9050:12:63;2702:30:58;;;-1:-1:-1;;2702:30:58;;;;;;;;;;2601:229;2767:25;2601:229;;;;;;;;;2746:7;;2767:25;;1201:6;;2601:229;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;2860:12:58;;2846:27;;;;;;;2531:349;2491:389::o;2886:383::-;2983:7;;-1:-1:-1;;;;;2983:7:58;2969:10;:21;;;:64;;;3012:7;;;;;;;;-1:-1:-1;;;;;3012:7:58;-1:-1:-1;;;;;2995:36:58;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2994:39;2969:64;2965:136;;;3056:34;;-1:-1:-1;;;3056:34:58;;3079:10;3056:34;;;160:74:63;133:18;;3056:34:58;14:226:63;2965:136:58;3237:25;3254:7;;3237:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3237:16:58;;-1:-1:-1;;;3237:25:58:i;3346:322::-;3454:19;:17;:19::i;:::-;3484;3523:7;;;3558:14;3586:31;;;;;;;9015:19:63;;;3586:31:58;;;;;;;;;;9050:12:63;;;3586:31:58;;;;3506:121;;;;-1:-1:-1;;;;;3523:7:58;;;;3506:38;;:121;;3558:14;;3506:121;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3506:121:58;;;;;;;;;;;;:::i;:::-;3484:143;;3637:24;3654:6;3637:16;:24::i;1634:107::-;2334:13:23;:11;:13::i;:::-;1706:14:58::1;:28:::0;1634:107::o;1533:95::-;2334:13:23;:11;:13::i;:::-;1603:7:58::1;:18:::0;;-1:-1:-1;;1603:18:58::1;-1:-1:-1::0;;;;;1603:18:58;;;::::1;::::0;;;::::1;::::0;;1533:95::o;841:140::-;8870:21:24;4302:15;;;;;;;4301:16;;4348:14;;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;:16;;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:24;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;;;;;;;;;;;;;4851:91;4951:18;;-1:-1:-1;;4951:18:24;4968:1;4951:18;;;4979:67;;;;5013:22;;-1:-1:-1;;5013:22:24;;;;;4979:67;912:28:58::1;927:12;912:14;:28::i;:::-;950:24;:22;:24::i;:::-;5070:14:24::0;5066:101;;;5100:23;;-1:-1:-1;;5100:23:24;;;5142:14;;-1:-1:-1;10101:50:63;;5142:14:24;;10089:2:63;10074:18;5142:14:24;;;;;;;5066:101;4092:1081;;;;;841:140:58;:::o;3885:554::-;3994:19;:17;:19::i;:::-;4104:12;;4023:20;;4053:18;;4130:20;;4146:3;;4130:20;:::i;:::-;:15;:20::i;:::-;4074:86;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4074:86:58;;;;;;;;;;4188:7;;4244:16;;4171:211;;;4074:86;;-1:-1:-1;;;;;;4188:7:58;;4171:41;;4220:9;;4171:211;;4244:16;4074:86;;4293:7;;4314:27;;1148:7;;4171:211;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4428:3;;4398:34;;;;;;;:::i;:::-;;;;;;;;;4414:12;;4398:34;;;;;;;3984:455;;3885:554;;:::o;3405:215:23:-;2334:13;:11;:13::i;:::-;-1:-1:-1;;;;;3489:22:23;::::1;3485:91;;3534:31;::::0;::::1;::::0;;3562:1:::1;3534:31;::::0;::::1;160:74:63::0;133:18;;3534:31:23::1;14:226:63::0;3485:91:23::1;3585:28;3604:8;3585:18;:28::i;:::-;3405:215:::0;:::o;1961:104:58:-;2334:13:23;:11;:13::i;:::-;2036:12:58::1;:22:::0;1961:104::o;2071:372::-;2147:1;2128:7;-1:-1:-1;;;;;2128:7:58;2124:82;;2172:23;;;;;;;;;;;;;;2124:82;2219:14;;:28;;:62;;-1:-1:-1;2251:16:58;;:30;2219:62;2215:127;;;2304:27;;;;;;;;;;;;;;2215:127;2355:12;;2351:86;;2404:22;;;;;;;;;;;;;;5019:102;5093:21;5106:7;5093:21;;;;;;:::i;:::-;;;;;;;;5019:102;:::o;2658:162:23:-;966:10:26;2717:7:23;1313:22;2570:8;-1:-1:-1;;;;;2570:8:23;;2441:144;2717:7;-1:-1:-1;;;;;2717:23:23;;2713:101;;2763:40;;;;;966:10:26;2763:40:23;;;160:74:63;133:18;;2763:40:23;14:226:63;4599:312:25;4679:4;-1:-1:-1;;;;;4688:6:25;4671:23;;;:120;;;4785:6;-1:-1:-1;;;;;4749:42:25;:32;1327:66:31;2035:53;-1:-1:-1;;;;;2035:53:31;;1957:138;4749:32:25;-1:-1:-1;;;;;4749:42:25;;;4671:120;4654:251;;;4865:29;;-1:-1:-1;;;4865:29:25;;;;;;;;;;;987:112:58;2334:13:23;:11;:13::i;6052:538:25:-;6169:17;-1:-1:-1;;;;;6151:50:25;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6151:52:25;;;;;;;;-1:-1:-1;;6151:52:25;;;;;;;;;;;;:::i;:::-;;;6147:437;;6513:60;;-1:-1:-1;;;6513:60:25;;-1:-1:-1;;;;;178:55:63;;6513:60:25;;;160:74:63;133:18;;6513:60:25;14:226:63;6147:437:25;1327:66:31;6245:40:25;;6241:120;;6312:34;;;;;;;;4314:25:63;;;4287:18;;6312:34:25;4168:177:63;6241:120:25;6374:54;6404:17;6423:4;6374:29;:54::i;:::-;6204:235;6052:538;;:::o;5028:213::-;5102:4;-1:-1:-1;;;;;5111:6:25;5094:23;;5090:145;;5195:29;;-1:-1:-1;;;5195:29:25;;;;;;;;;;;2897:575:60;2969:32;3009:23;3035:6;3009:32;;3047:17;3083:15;3067:6;:13;:31;;;;:::i;:::-;3047:51;;3104:40;3186:9;3147:54;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;3147:54:60;;;;;;;;;;;;;;;;3104:97;;3208:22;3236:14;3265:9;3260:190;3284:9;3280:1;:13;3260:190;;;3332:48;3348:6;3356;3364:15;3332;:48::i;:::-;3310:70;;-1:-1:-1;3310:70:60;-1:-1:-1;3403:40:60;3310:70;3403:29;:40::i;:::-;3390:7;3398:1;3390:10;;;;;;;;:::i;:::-;;;;;;;;;;:53;3295:3;;3260:190;;;-1:-1:-1;3462:7:60;;2897:575;-1:-1:-1;;;;;;2897:575:60:o;3774:248:23:-;1313:22;3923:8;;-1:-1:-1;;3941:19:23;;-1:-1:-1;;;;;3941:19:23;;;;;;;;3975:40;;3923:8;;;;;3975:40;;3847:24;;3975:40;3837:185;;3774:248;:::o;3674:205:58:-;3741:20;3775:7;3764:30;;;;;;;;;;;;:::i;:::-;3805:12;:27;;;3848:24;;4314:25:63;;;3741:53:58;;-1:-1:-1;3848:24:58;;4302:2:63;4287:18;3848:24:58;;;;;;;3731:148;3674:205;:::o;1847:127:23:-;6931:20:24;:18;:20::i;:::-;1929:38:23::1;1954:12;1929:24;:38::i;2968:67:25:-:0;6931:20:24;:18;:20::i;1193:570:60:-;1277:12;1297:19;1327:9;1322:420;1346:3;:10;1342:1;:14;1322:420;;;1377:5;;1373:363;;1441:6;1465:3;1469:1;1465:6;;;;;;;;:::i;:::-;;;;;;;:20;;;1503:3;1507:1;1503:6;;;;;;;;:::i;:::-;;;;;;;:9;;;1530:3;1534:1;1530:6;;;;;;;;:::i;:::-;;;;;;;:14;;;1407:151;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1398:160;;1373:363;;;1632:3;1636:1;1632:6;;;;;;;;:::i;:::-;;;;;;;:20;;;1670:3;1674:1;1670:6;;;;;;;;:::i;:::-;;;;;;;:9;;;1697:3;1701:1;1697:6;;;;;;;;:::i;:::-;;;;;;;:14;;;1598:127;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1589:136;;1373:363;1358:3;;1322:420;;;-1:-1:-1;1754:6:60;1193:570;-1:-1:-1;;1193:570:60:o;2779:335:31:-;2870:37;2889:17;2870:18;:37::i;:::-;2922:27;;-1:-1:-1;;;;;2922:27:31;;;;;;;;2964:11;;:15;2960:148;;2995:53;3024:17;3043:4;2995:28;:53::i;2960:148::-;3079:18;:16;:18::i;1721:710:59:-;1845:19;1866:18;1909:15;1918:6;1909;:15;:::i;:::-;1896:28;;1956:5;:12;1942:10;:26;;1934:58;;;;;;;16093:2:63;1934:58:59;;;16075:21:63;16132:2;16112:18;;;16105:30;16171:21;16151:18;;;16144:49;16210:18;;1934:58:59;15891:343:63;1934:58:59;2021:6;2011:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2011:17:59;;2002:26;;2152:6;2145:4;2138:5;2134:16;2130:29;2204:4;2196:6;2192:17;2254:1;2223:192;2276:6;2273:1;2270:13;2223:192;;;2387:12;;;2381:19;2359:20;;;2352:49;2314:4;2307:12;2223:192;;;2227:42;;;1721:710;;;;;;:::o;3474:403:60:-;-1:-1:-1;;;;;;;;;;;;;;;;;3601:22:60;3629:14;3675:35;3691:6;3699;3707:2;3675:15;:35::i;:::-;3728:32;;3653:57;;-1:-1:-1;3653:57:60;-1:-1:-1;3728:32:60;;;;;;;;;;;;:::i;:::-;3716:44;;3789:34;3805:6;3813;3821:1;3789:15;:34::i;:::-;3767:56;;-1:-1:-1;3767:56:60;-1:-1:-1;3851:17:60;3767:56;3851:17;:::i;:::-;3845:24;;:29;;3829:13;;;:45;-1:-1:-1;3829:6:60;;3474:403;-1:-1:-1;;3474:403:60:o;7084:141:24:-;8870:21;8560:40;;;;;;7146:73;;7191:17;;;;;;;;;;;;;;1980:235:23;6931:20:24;:18;:20::i;2186:281:31:-;2263:17;-1:-1:-1;;;;;2263:29:31;;2296:1;2263:34;2259:119;;2320:47;;-1:-1:-1;;;2320:47:31;;-1:-1:-1;;;;;178:55:63;;2320:47:31;;;160:74:63;133:18;;2320:47:31;14:226:63;2259:119:31;1327:66;2387:73;;-1:-1:-1;;2387:73:31;-1:-1:-1;;;;;2387:73:31;;;;;;;;;;2186:281::o;4106:253:38:-;4189:12;4214;4228:23;4255:6;-1:-1:-1;;;;;4255:19:38;4275:4;4255:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4213:67;;;;4297:55;4324:6;4332:7;4341:10;4297:26;:55::i;:::-;4290:62;4106:253;-1:-1:-1;;;;;4106:253:38:o;6598:122:31:-;6648:9;:13;6644:70;;6684:19;;;;;;;;;;;;;;4625:582:38;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:38;;;:23;5045:49;5041:119;;;5121:24;;;;;-1:-1:-1;;;;;178:55:63;;5121:24:38;;;160:74:63;133:18;;5121:24:38;14:226:63;5041:119:38;-1:-1:-1;5180:10:38;4793:408;4625:582;;;;;:::o;5743:516::-;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;;;;;;;;;;;;;245:347:63;296:8;306:6;360:3;353:4;345:6;341:17;337:27;327:55;;378:1;375;368:12;327:55;-1:-1:-1;401:20:63;;444:18;433:30;;430:50;;;476:1;473;466:12;430:50;513:4;505:6;501:17;489:29;;565:3;558:4;549:6;541;537:19;533:30;530:39;527:59;;;582:1;579;572:12;527:59;245:347;;;;;:::o;597:477::-;676:6;684;692;745:2;733:9;724:7;720:23;716:32;713:52;;;761:1;758;751:12;713:52;797:9;784:23;774:33;;858:2;847:9;843:18;830:32;885:18;877:6;874:30;871:50;;;917:1;914;907:12;871:50;956:58;1006:7;997:6;986:9;982:22;956:58;:::i;:::-;597:477;;1033:8;;-1:-1:-1;930:84:63;;-1:-1:-1;;;;597:477:63:o;1276:180::-;1335:6;1388:2;1376:9;1367:7;1363:23;1359:32;1356:52;;;1404:1;1401;1394:12;1356:52;-1:-1:-1;1427:23:63;;1276:180;-1:-1:-1;1276:180:63:o;1461:717::-;1551:6;1559;1567;1575;1628:2;1616:9;1607:7;1603:23;1599:32;1596:52;;;1644:1;1641;1634:12;1596:52;1684:9;1671:23;1713:18;1754:2;1746:6;1743:14;1740:34;;;1770:1;1767;1760:12;1740:34;1809:58;1859:7;1850:6;1839:9;1835:22;1809:58;:::i;:::-;1886:8;;-1:-1:-1;1783:84:63;-1:-1:-1;1974:2:63;1959:18;;1946:32;;-1:-1:-1;1990:16:63;;;1987:36;;;2019:1;2016;2009:12;1987:36;;2058:60;2110:7;2099:8;2088:9;2084:24;2058:60;:::i;:::-;1461:717;;;;-1:-1:-1;2137:8:63;-1:-1:-1;;;;1461:717:63:o;2183:196::-;2251:20;;-1:-1:-1;;;;;2300:54:63;;2290:65;;2280:93;;2369:1;2366;2359:12;2280:93;2183:196;;;:::o;2384:184::-;-1:-1:-1;;;2433:1:63;2426:88;2533:4;2530:1;2523:15;2557:4;2554:1;2547:15;2573:253;2645:2;2639:9;2687:4;2675:17;;2722:18;2707:34;;2743:22;;;2704:62;2701:88;;;2769:18;;:::i;:::-;2805:2;2798:22;2573:253;:::o;2831:275::-;2902:2;2896:9;2967:2;2948:13;;-1:-1:-1;;2944:27:63;2932:40;;3002:18;2987:34;;3023:22;;;2984:62;2981:88;;;3049:18;;:::i;:::-;3085:2;3078:22;2831:275;;-1:-1:-1;2831:275:63:o;3111:186::-;3159:4;3192:18;3184:6;3181:30;3178:56;;;3214:18;;:::i;:::-;-1:-1:-1;3280:2:63;3259:15;-1:-1:-1;;3255:29:63;3286:4;3251:40;;3111:186::o;3302:462::-;3344:5;3397:3;3390:4;3382:6;3378:17;3374:27;3364:55;;3415:1;3412;3405:12;3364:55;3451:6;3438:20;3482:48;3498:31;3526:2;3498:31;:::i;:::-;3482:48;:::i;:::-;3555:2;3546:7;3539:19;3601:3;3594:4;3589:2;3581:6;3577:15;3573:26;3570:35;3567:55;;;3618:1;3615;3608:12;3567:55;3683:2;3676:4;3668:6;3664:17;3657:4;3648:7;3644:18;3631:55;3731:1;3706:16;;;3724:4;3702:27;3695:38;;;;3710:7;3302:462;-1:-1:-1;;;3302:462:63:o;3769:394::-;3846:6;3854;3907:2;3895:9;3886:7;3882:23;3878:32;3875:52;;;3923:1;3920;3913:12;3875:52;3946:29;3965:9;3946:29;:::i;:::-;3936:39;;4026:2;4015:9;4011:18;3998:32;4053:18;4045:6;4042:30;4039:50;;;4085:1;4082;4075:12;4039:50;4108:49;4149:7;4140:6;4129:9;4125:22;4108:49;:::i;:::-;4098:59;;;3769:394;;;;;:::o;4350:409::-;4420:6;4428;4481:2;4469:9;4460:7;4456:23;4452:32;4449:52;;;4497:1;4494;4487:12;4449:52;4537:9;4524:23;4570:18;4562:6;4559:30;4556:50;;;4602:1;4599;4592:12;4556:50;4641:58;4691:7;4682:6;4671:9;4667:22;4641:58;:::i;:::-;4718:8;;4615:84;;-1:-1:-1;4350:409:63;-1:-1:-1;;;;4350:409:63:o;4764:838::-;5019:2;5071:21;;;5141:13;;5044:18;;;5163:22;;;4990:4;;5019:2;5204;;5222:18;;;;5263:15;;;4990:4;5306:270;5320:6;5317:1;5314:13;5306:270;;;5379:13;;5417:9;;5405:22;;5481:11;;5475:18;5468:26;5461:34;5447:12;;;5440:56;5516:12;;;;5551:15;;;;5342:1;5335:9;5306:270;;;-1:-1:-1;5593:3:63;;4764:838;-1:-1:-1;;;;;;;4764:838:63:o;5607:250::-;5692:1;5702:113;5716:6;5713:1;5710:13;5702:113;;;5792:11;;;5786:18;5773:11;;;5766:39;5738:2;5731:10;5702:113;;;-1:-1:-1;;5849:1:63;5831:16;;5824:27;5607:250::o;5862:271::-;5904:3;5942:5;5936:12;5969:6;5964:3;5957:19;5985:76;6054:6;6047:4;6042:3;6038:14;6031:4;6024:5;6020:16;5985:76;:::i;:::-;6115:2;6094:15;-1:-1:-1;;6090:29:63;6081:39;;;;6122:4;6077:50;;5862:271;-1:-1:-1;;5862:271:63:o;6138:220::-;6287:2;6276:9;6269:21;6250:4;6307:45;6348:2;6337:9;6333:18;6325:6;6307:45;:::i;6363:186::-;6422:6;6475:2;6463:9;6454:7;6450:23;6446:32;6443:52;;;6491:1;6488;6481:12;6443:52;6514:29;6533:9;6514:29;:::i;6554:658::-;6683:6;6691;6744:2;6732:9;6723:7;6719:23;6715:32;6712:52;;;6760:1;6757;6750:12;6712:52;6800:9;6787:23;6829:18;6870:2;6862:6;6859:14;6856:34;;;6886:1;6883;6876:12;6856:34;6924:6;6913:9;6909:22;6899:32;;6969:7;6962:4;6958:2;6954:13;6950:27;6940:55;;6991:1;6988;6981:12;6940:55;7031:2;7018:16;7057:2;7049:6;7046:14;7043:34;;;7073:1;7070;7063:12;7043:34;7126:7;7121:2;7111:6;7108:1;7104:14;7100:2;7096:23;7092:32;7089:45;7086:65;;;7147:1;7144;7137:12;7086:65;7178:2;7170:11;;;;;7200:6;;-1:-1:-1;6554:658:63;;-1:-1:-1;;;;6554:658:63:o;7217:345::-;7414:6;7409:3;7402:19;7465:6;7457;7452:2;7447:3;7443:12;7430:42;7384:3;7495:16;;7513:2;7491:25;7525:13;;;7491:25;7217:345;-1:-1:-1;;7217:345:63:o;7567:289::-;7742:6;7731:9;7724:25;7785:2;7780;7769:9;7765:18;7758:30;7705:4;7805:45;7846:2;7835:9;7831:18;7823:6;7805:45;:::i;:::-;7797:53;7567:289;-1:-1:-1;;;;7567:289:63:o;7861:647::-;7940:6;7993:2;7981:9;7972:7;7968:23;7964:32;7961:52;;;8009:1;8006;7999:12;7961:52;8042:9;8036:16;8075:18;8067:6;8064:30;8061:50;;;8107:1;8104;8097:12;8061:50;8130:22;;8183:4;8175:13;;8171:27;-1:-1:-1;8161:55:63;;8212:1;8209;8202:12;8161:55;8241:2;8235:9;8266:48;8282:31;8310:2;8282:31;:::i;8266:48::-;8337:2;8330:5;8323:17;8377:7;8372:2;8367;8363;8359:11;8355:20;8352:33;8349:53;;;8398:1;8395;8388:12;8349:53;8411:67;8475:2;8470;8463:5;8459:14;8454:2;8450;8446:11;8411:67;:::i;8513:118::-;8599:5;8592:13;8585:21;8578:5;8575:32;8565:60;;8621:1;8618;8611:12;8636:245;8703:6;8756:2;8744:9;8735:7;8731:23;8727:32;8724:52;;;8772:1;8769;8762:12;8724:52;8804:9;8798:16;8823:28;8845:5;8823:28;:::i;9073:681::-;9346:6;9335:9;9328:25;9389:3;9384:2;9373:9;9369:18;9362:31;9309:4;9416:46;9457:3;9446:9;9442:19;9434:6;9416:46;:::i;:::-;9510:9;9502:6;9498:22;9493:2;9482:9;9478:18;9471:50;9538:33;9564:6;9556;9538:33;:::i;:::-;9530:41;;;9619:66;9611:6;9607:79;9602:2;9591:9;9587:18;9580:107;9736:10;9728:6;9724:23;9718:3;9707:9;9703:19;9696:52;9073:681;;;;;;;;:::o;9759:184::-;9829:6;9882:2;9870:9;9861:7;9857:23;9853:32;9850:52;;;9898:1;9895;9888:12;9850:52;-1:-1:-1;9921:16:63;;9759:184;-1:-1:-1;9759:184:63:o;10162:1651::-;10362:9;10396:18;10437:2;10429:6;10426:14;10423:40;;;10443:18;;:::i;:::-;10489:6;10486:1;10482:14;10515:4;10539:28;10563:2;10559;10555:11;10539:28;:::i;:::-;10601:19;;;10671:14;;;;10636:12;;;;10708:14;10697:26;;10694:46;;;10736:1;10733;10726:12;10694:46;10760:5;10774:1006;10790:6;10785:3;10782:15;10774:1006;;;10876:3;10863:17;10912:2;10899:11;10896:19;10893:109;;;10956:1;10985:2;10981;10974:14;10893:109;11025:23;;11093:4;11072:14;11068:23;;;11064:34;11061:124;;;11139:1;11168:2;11164;11157:14;11061:124;11213:22;;:::i;:::-;11276:2;11263:16;11292:30;11314:7;11292:30;:::i;:::-;11335:24;;11410:11;;;11397:25;11379:16;;;11372:51;11446:2;11488:11;;;11475:25;11516:14;;;11513:104;;;11571:1;11600:2;11596;11589:14;11513:104;11655:49;11689:14;11680:6;11676:2;11672:15;11655:49;:::i;:::-;11637:16;;;11630:75;;;;-1:-1:-1;11718:20:63;;-1:-1:-1;11758:12:63;;;;10807;;10774:1006;;;-1:-1:-1;11802:5:63;10162:1651;-1:-1:-1;;;;;;;10162:1651:63:o;11818:359::-;12005:6;12000:3;11993:19;11975:3;12041:6;12035:13;12057:73;12123:6;12118:2;12113:3;12109:12;12104:2;12096:6;12092:15;12057:73;:::i;:::-;12150:16;;;;12168:2;12146:25;;11818:359;-1:-1:-1;;;11818:359:63:o;12182:1620::-;12437:3;12468;12515:6;12437:3;12549:1226;12563:6;12560:1;12557:13;12549:1226;;;12651:6;12638:20;12742:2;12738:7;12729:6;12713:14;12709:27;12705:41;12685:18;12681:66;12671:94;;12761:1;12758;12751:12;12671:94;12791:31;;12850:19;;12882:30;12850:19;12882:30;:::i;:::-;12946:15;12939:23;12925:38;;12986:4;13039:14;;;13026:28;13010:14;;;13003:52;13078:2;13134:14;;;13121:28;13206:14;13202:26;;;-1:-1:-1;;13198:40:63;13172:67;;13162:95;;13253:1;13250;13243:12;13162:95;13285:32;;;13393:16;;;;-1:-1:-1;13344:21:63;13436:18;13425:30;;13422:50;;;13468:1;13465;13458:12;13422:50;13521:6;13505:14;13501:27;13492:7;13488:41;13485:61;;;13542:1;13539;13532:12;13485:61;13597:6;13588:7;13583:2;13576:5;13572:14;13559:45;13653:1;13628:18;;;13624:27;;13617:38;13717:2;13696:15;-1:-1:-1;;13692:29:63;13681:41;;;13677:50;;;;13750:15;;;;;-1:-1:-1;12585:1:63;12578:9;12549:1226;;;-1:-1:-1;13791:5:63;;12182:1620;-1:-1:-1;;;;;12182:1620:63:o;14030:274::-;14070:1;14096;14086:189;;-1:-1:-1;;;14128:1:63;14121:88;14232:4;14229:1;14222:15;14260:4;14257:1;14250:15;14086:189;-1:-1:-1;14289:9:63;;14030:274::o;14309:184::-;-1:-1:-1;;;14358:1:63;14351:88;14458:4;14455:1;14448:15;14482:4;14479:1;14472:15;14498:654;14723:3;14761:6;14755:13;14777:66;14836:6;14831:3;14824:4;14816:6;14812:17;14777:66;:::i;:::-;14874:6;14869:3;14865:16;14852:29;;14927:6;14920:14;14913:22;14908:3;14904:32;14897:5;14890:47;14968:6;14964:1;14957:5;14953:13;14946:29;15006:6;15000:13;15022:79;15092:8;15087:2;15080:5;15076:14;15069:4;15061:6;15057:17;15022:79;:::i;:::-;15121:20;15143:2;15117:29;;14498:654;-1:-1:-1;;;;;;14498:654:63:o;15157:445::-;15389:6;15382:14;15375:22;15370:3;15366:32;15361:3;15354:45;15428:6;15424:1;15419:3;15415:11;15408:27;15336:3;15464:6;15458:13;15480:75;15548:6;15543:2;15538:3;15534:12;15527:4;15519:6;15515:17;15480:75;:::i;:::-;15575:16;;;;15593:2;15571:25;;15157:445;-1:-1:-1;;;;15157:445:63:o;15607:279::-;15672:9;;;15693:10;;;15690:190;;;-1:-1:-1;;;15733:1:63;15726:88;15837:4;15834:1;15827:15;15865:4;15862:1;15855:15;16239:407;16322:5;16362;16356:12;16404:4;16397:5;16393:16;16387:23;16429:66;16521:2;16517;16513:11;16504:20;;16547:1;16539:6;16536:13;16533:107;;;16627:2;16621;16611:6;16608:1;16604:14;16601:1;16597:22;16593:31;16589:2;16585:40;16581:49;16572:58;;16533:107;;;;16239:407;;;:::o;16651:287::-;16780:3;16818:6;16812:13;16834:66;16893:6;16888:3;16881:4;16873:6;16869:17;16834:66;:::i;:::-;16916:16;;;;;16651:287;-1:-1:-1;;16651:287:63:o","linkReferences":{},"immutableReferences":{"45826":[{"start":3725,"length":32},{"start":3766,"length":32},{"start":4153,"length":32}]}},"methodIdentifiers":{"DEFAULT_GAS_LIMIT()":"d6be695a","SYNC_GAS_LIMIT()":"28db958e","UPGRADE_INTERFACE_VERSION()":"ad3cb1cc","decodeResults(bytes)":"56e484e1","gateway()":"116191b6","handleSync(bytes,bytes)":"8d363ad0","handleVerify(bytes,bytes)":"2ebfd37f","initialize(address)":"c4d66de8","latestHeader()":"bba3fe8e","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","renounceOwnership()":"715018a6","requestSync()":"7a03780a","requestVerify((bool,bytes32,bytes)[])":"d7c908fc","setCheckpointHeader(bytes32)":"fd4f593d","sync(bytes32)":"ae4b2551","syncFunctionId()":"694e6f69","transferOwnership(address)":"f2fde38b","updateGateway(address)":"c0346b20","updateSyncId(bytes32)":"b291c2d7","updateVerifyId(bytes32)":"2bdd271f","upgradeToAndCall(address,bytes)":"4f1ef286","verify(bytes32,bytes)":"258ae582","verifyFunctionId()":"5629df5b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FunctionIdsNotInitialised\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GatewayNotInitialised\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"HeaderNotInitialised\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"NotFromSuccinctGateway\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TrustedHeaderNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"headerHash\",\"type\":\"bytes32\"}],\"name\":\"HeadUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"trustedHeader\",\"type\":\"bytes32\"}],\"name\":\"SyncRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"trustedHeader\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isTransaction\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"account\",\"type\":\"bytes\"}],\"indexed\":true,\"internalType\":\"struct TransactionOrReceiptId[]\",\"name\":\"ids\",\"type\":\"tuple[]\"}],\"name\":\"VerifyRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"results\",\"type\":\"bytes\"}],\"name\":\"VerifyResult\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SYNC_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_output\",\"type\":\"bytes\"}],\"name\":\"decodeResults\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"result\",\"type\":\"bool\"}],\"internalType\":\"struct ProofVerificationResult[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_output\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"handleSync\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_output\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"handleVerify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestSync\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isTransaction\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"id\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"account\",\"type\":\"bytes\"}],\"internalType\":\"struct TransactionOrReceiptId[]\",\"name\":\"ids\",\"type\":\"tuple[]\"}],\"name\":\"requestVerify\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_header\",\"type\":\"bytes32\"}],\"name\":\"setCheckpointHeader\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"trustedHeader\",\"type\":\"bytes32\"}],\"name\":\"sync\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"syncFunctionId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_gateway\",\"type\":\"address\"}],\"name\":\"updateGateway\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_functionId\",\"type\":\"bytes32\"}],\"name\":\"updateSyncId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_functionId\",\"type\":\"bytes32\"}],\"name\":\"updateVerifyId\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"trustedHeader\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_ids\",\"type\":\"bytes\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyFunctionId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedInnerCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"SyncRequested(bytes32)\":{\"params\":{\"trustedHeader\":\"The header hash of the trusted block.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"},\"VerifyRequested(bytes32,(bool,bytes32,bytes)[])\":{\"params\":{\"ids\":\"The transaction or receipt ids to verify.\",\"trustedHeader\":\"The header hash of the trusted block.\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"version\":1},\"userdoc\":{\"errors\":{\"HeaderNotInitialised()\":[{\"notice\":\"Header not Initialised.\"}],\"NotFromSuccinctGateway(address)\":[{\"notice\":\"Not from Succinct Gateway.\"}],\"TrustedHeaderNotFound()\":[{\"notice\":\"Trusted header not found.\"}]},\"events\":{\"HeadUpdate(bytes32)\":{\"notice\":\"Emits event with the new head update.\"},\"SyncRequested(bytes32)\":{\"notice\":\"Inputs of a sync request.\"},\"VerifyRequested(bytes32,(bool,bytes32,bytes)[])\":{\"notice\":\"Inputs of a verify request.\"},\"VerifyResult(bytes)\":{\"notice\":\"The result of the verification request\"}},\"kind\":\"user\",\"methods\":{\"gateway()\":{\"notice\":\"The address of the gateway contract.\"},\"latestHeader()\":{\"notice\":\"The latest header that has been committed.\"},\"requestSync()\":{\"notice\":\"Inputs of a sync request.\"},\"setCheckpointHeader(bytes32)\":{\"notice\":\"Note: Only for testnet. The genesis header should be set when initializing the contract.\"},\"sync(bytes32)\":{\"notice\":\"Fetches the proof result from the gateway and updates our head\"},\"syncFunctionId()\":{\"notice\":\"Sync function id.\"},\"verifyFunctionId()\":{\"notice\":\"Verify function id.\"}},\"notice\":\"The NearX contract is a light client for Near.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/NearX.sol\":\"NearX\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":@openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":foundry-devops/=lib/foundry-devops/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/\",\":openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/\",\":solidity-bytes-utils/=lib/solidity-bytes-utils/contracts/\",\":solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930\",\"dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9\",\"dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a\",\"dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245\",\"dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c\",\"dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR\"]},\"src/NearX.sol\":{\"keccak256\":\"0x39d96df73ec09f0ff8bfee8e6998aa1f3d409f76a755a91bc54a2810f79baaa5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c7819ad04768880589591d215231387bbcf4f47a0576b3bb79504f7a6317c2ef\",\"dweb:/ipfs/QmXpnExbCvVa2fnZxbDCQ2aYSoeBGKsmpPiBMiDGgMbPZY\"]},\"src/interfaces/Bytes.sol\":{\"keccak256\":\"0xf309d47f6bdb801abbeba69832fbc8091968212dbe61af10ea0cc09362188b4d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1813d5161df84a1a494fbb2f19c8a484ffdaa4d152570b3866327ccf50e9f420\",\"dweb:/ipfs/QmdNpJF3k5SxaGH2WfWp254DMvfZ1PQkA8AawZqrwroTvT\"]},\"src/interfaces/INearX.sol\":{\"keccak256\":\"0x2fa7d19155e60fbed3dd1144640710d7807015e6c8c975177749babc2be661e5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://90e2bede7484631e5b70d385d6d952e9be59e927eb2725b0b4341d029875df38\",\"dweb:/ipfs/QmUeTptSTGq4n2NajZszuWGYAUkMbj5ir6gK842JbEZmcu\"]},\"src/interfaces/ISuccinctGateway.sol\":{\"keccak256\":\"0x18c8d71122787da60a1a24e718b8ae9b0249c5e872ae43ea12740e3820d7e9d1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a5588faaf6a0b20633266feba4806223b7670861edc01d1464d0a26b387e6be8\",\"dweb:/ipfs/QmWFmJDWCLTxZU8LWBEpiCEAhyg9DCJvDmMNEGJHmotuRW\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"type":"error","name":"AddressEmptyCode"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"type":"error","name":"ERC1967InvalidImplementation"},{"inputs":[],"type":"error","name":"ERC1967NonPayable"},{"inputs":[],"type":"error","name":"FailedInnerCall"},{"inputs":[],"type":"error","name":"FunctionIdsNotInitialised"},{"inputs":[],"type":"error","name":"GatewayNotInitialised"},{"inputs":[],"type":"error","name":"HeaderNotInitialised"},{"inputs":[],"type":"error","name":"InvalidInitialization"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"type":"error","name":"NotFromSuccinctGateway"},{"inputs":[],"type":"error","name":"NotInitializing"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"type":"error","name":"OwnableInvalidOwner"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"type":"error","name":"OwnableUnauthorizedAccount"},{"inputs":[],"type":"error","name":"TrustedHeaderNotFound"},{"inputs":[],"type":"error","name":"UUPSUnauthorizedCallContext"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"type":"error","name":"UUPSUnsupportedProxiableUUID"},{"inputs":[{"internalType":"bytes32","name":"headerHash","type":"bytes32","indexed":false}],"type":"event","name":"HeadUpdate","anonymous":false},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"trustedHeader","type":"bytes32","indexed":true}],"type":"event","name":"SyncRequested","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"trustedHeader","type":"bytes32","indexed":true},{"internalType":"struct TransactionOrReceiptId[]","name":"ids","type":"tuple[]","components":[{"internalType":"bool","name":"isTransaction","type":"bool"},{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes","name":"account","type":"bytes"}],"indexed":true}],"type":"event","name":"VerifyRequested","anonymous":false},{"inputs":[{"internalType":"bytes","name":"results","type":"bytes","indexed":false}],"type":"event","name":"VerifyResult","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEFAULT_GAS_LIMIT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SYNC_GAS_LIMIT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"bytes","name":"_output","type":"bytes"}],"stateMutability":"pure","type":"function","name":"decodeResults","outputs":[{"internalType":"struct ProofVerificationResult[]","name":"","type":"tuple[]","components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bool","name":"result","type":"bool"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"gateway","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes","name":"_output","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"handleSync"},{"inputs":[{"internalType":"bytes","name":"_output","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"handleVerify"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"latestHeader","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[],"stateMutability":"payable","type":"function","name":"requestSync"},{"inputs":[{"internalType":"struct TransactionOrReceiptId[]","name":"ids","type":"tuple[]","components":[{"internalType":"bool","name":"isTransaction","type":"bool"},{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes","name":"account","type":"bytes"}]}],"stateMutability":"payable","type":"function","name":"requestVerify"},{"inputs":[{"internalType":"bytes32","name":"_header","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"setCheckpointHeader"},{"inputs":[{"internalType":"bytes32","name":"trustedHeader","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"sync"},{"inputs":[],"stateMutability":"view","type":"function","name":"syncFunctionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"_gateway","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"updateGateway"},{"inputs":[{"internalType":"bytes32","name":"_functionId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"updateSyncId"},{"inputs":[{"internalType":"bytes32","name":"_functionId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"updateVerifyId"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"},{"inputs":[{"internalType":"bytes32","name":"trustedHeader","type":"bytes32"},{"internalType":"bytes","name":"_ids","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"verify"},{"inputs":[],"stateMutability":"view","type":"function","name":"verifyFunctionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]}],"devdoc":{"kind":"dev","methods":{"constructor":{"custom:oz-upgrades-unsafe-allow":"constructor"},"owner()":{"details":"Returns the address of the current owner."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"gateway()":{"notice":"The address of the gateway contract."},"latestHeader()":{"notice":"The latest header that has been committed."},"requestSync()":{"notice":"Inputs of a sync request."},"setCheckpointHeader(bytes32)":{"notice":"Note: Only for testnet. The genesis header should be set when initializing the contract."},"sync(bytes32)":{"notice":"Fetches the proof result from the gateway and updates our head"},"syncFunctionId()":{"notice":"Sync function id."},"verifyFunctionId()":{"notice":"Verify function id."}},"version":1}},"settings":{"remappings":["@openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","foundry-devops/=lib/foundry-devops/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/","openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/","solidity-bytes-utils/=lib/solidity-bytes-utils/contracts/","solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/"],"optimizer":{"enabled":true,"runs":1000},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/NearX.sol":"NearX"},"evmVersion":"paris","libraries":{}},"sources":{"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a","urls":["bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6","dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b","urls":["bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609","dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x3f13b947637c4969c0644cab4ef399cdc4b67f101463b8775c5a43b118558e53","urls":["bzz-raw://c6683e6ade6985d394d32baaef5eea0d8b9ff0b3eca86ae413d6cdde114a9930","dweb:/ipfs/QmdBE8T1BTddZxpdECMsb3KiCFyjNWmxcCddYrWFTXmWPj"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x2a1f9944df2015c081d89cd41ba22ffaf10aa6285969f0dc612b235cc448999c","urls":["bzz-raw://ef381843676aec64421200ee85eaa0b1356a35f28b9fc67e746a6bbb832077d9","dweb:/ipfs/QmY8aorMYA2TeTCnu6ejDjzb4rW4t7TCtW4GZ6LoxTFm7v"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol":{"keccak256":"0x06a78f9b3ee3e6d0eb4e4cd635ba49960bea34cac1db8c0a27c75f2319f1fd65","urls":["bzz-raw://547d21aa17f4f3f1a1a7edf7167beff8dd9496a0348d5588f15cc8a4b29d052a","dweb:/ipfs/QmT16JtRQSWNpLo9W23jr6CzaMuTAcQcjJJcdRd8HLJ6cE"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c","urls":["bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa","dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xaf28a975a78550e45f65e559a3ad6a5ad43b9b8a37366999abd1b7084eb70721","urls":["bzz-raw://b7bd24e224f67f65bfadf85dc2929fa965456bb2415478bd0125471b5ce35245","dweb:/ipfs/QmRaydGr8BTHs1kvaZfsNU69pKzUAGFrvABn1KiRSbE51y"],"license":"MIT"},"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol":{"keccak256":"0x32ba59b4b7299237c8ba56319110989d7978a039faf754793064e967e5894418","urls":["bzz-raw://1ae50c8b562427df610cc4540c9bf104acca7ef8e2dcae567ae7e52272281e9c","dweb:/ipfs/QmTHiadFCSJUPpRjNegc5SahmeU8bAoY8i9Aq6tVscbcKR"],"license":"MIT"},"src/NearX.sol":{"keccak256":"0x39d96df73ec09f0ff8bfee8e6998aa1f3d409f76a755a91bc54a2810f79baaa5","urls":["bzz-raw://c7819ad04768880589591d215231387bbcf4f47a0576b3bb79504f7a6317c2ef","dweb:/ipfs/QmXpnExbCvVa2fnZxbDCQ2aYSoeBGKsmpPiBMiDGgMbPZY"],"license":"MIT"},"src/interfaces/Bytes.sol":{"keccak256":"0xf309d47f6bdb801abbeba69832fbc8091968212dbe61af10ea0cc09362188b4d","urls":["bzz-raw://1813d5161df84a1a494fbb2f19c8a484ffdaa4d152570b3866327ccf50e9f420","dweb:/ipfs/QmdNpJF3k5SxaGH2WfWp254DMvfZ1PQkA8AawZqrwroTvT"],"license":"MIT"},"src/interfaces/INearX.sol":{"keccak256":"0x2fa7d19155e60fbed3dd1144640710d7807015e6c8c975177749babc2be661e5","urls":["bzz-raw://90e2bede7484631e5b70d385d6d952e9be59e927eb2725b0b4341d029875df38","dweb:/ipfs/QmUeTptSTGq4n2NajZszuWGYAUkMbj5ir6gK842JbEZmcu"],"license":"MIT"},"src/interfaces/ISuccinctGateway.sol":{"keccak256":"0x18c8d71122787da60a1a24e718b8ae9b0249c5e872ae43ea12740e3820d7e9d1","urls":["bzz-raw://a5588faaf6a0b20633266feba4806223b7670861edc01d1464d0a26b387e6be8","dweb:/ipfs/QmWFmJDWCLTxZU8LWBEpiCEAhyg9DCJvDmMNEGJHmotuRW"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[{"astId":54358,"contract":"src/NearX.sol:NearX","label":"gateway","offset":0,"slot":"0","type":"t_address"},{"astId":54361,"contract":"src/NearX.sol:NearX","label":"syncFunctionId","offset":0,"slot":"1","type":"t_bytes32"},{"astId":54364,"contract":"src/NearX.sol:NearX","label":"verifyFunctionId","offset":0,"slot":"2","type":"t_bytes32"},{"astId":54367,"contract":"src/NearX.sol:NearX","label":"latestHeader","offset":0,"slot":"3","type":"t_bytes32"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"}}},"ast":{"absolutePath":"src/NearX.sol","id":54705,"exportedSymbols":{"INearX":[55012],"ISuccinctGateway":[55554],"Initializable":[45806],"NearX":[54704],"OwnableUpgradeable":[45552],"ProofVerificationResult":[55256],"TransactionOrReceiptId":[55022],"UUPSUpgradeable":[45988],"decodePackedIds":[55170],"decodePackedResults":[55331],"encodePackedIds":[55093]},"nodeType":"SourceUnit","src":"32:5282:58","nodes":[{"id":54293,"nodeType":"PragmaDirective","src":"32:24:58","nodes":[],"literals":["solidity","^","0.8",".20"]},{"id":54295,"nodeType":"ImportDirective","src":"58:101:58","nodes":[],"absolutePath":"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol","file":"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","nameLocation":"-1:-1:-1","scope":54705,"sourceUnit":45553,"symbolAliases":[{"foreign":{"id":54294,"name":"OwnableUpgradeable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45552,"src":"66:18:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":54297,"nodeType":"ImportDirective","src":"160:96:58","nodes":[],"absolutePath":"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol","file":"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","nameLocation":"-1:-1:-1","scope":54705,"sourceUnit":45807,"symbolAliases":[{"foreign":{"id":54296,"name":"Initializable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45806,"src":"168:13:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":54299,"nodeType":"ImportDirective","src":"257:100:58","nodes":[],"absolutePath":"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol","file":"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","nameLocation":"-1:-1:-1","scope":54705,"sourceUnit":45989,"symbolAliases":[{"foreign":{"id":54298,"name":"UUPSUpgradeable","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45988,"src":"265:15:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":54301,"nodeType":"ImportDirective","src":"358:67:58","nodes":[],"absolutePath":"src/interfaces/ISuccinctGateway.sol","file":"./interfaces/ISuccinctGateway.sol","nameLocation":"-1:-1:-1","scope":54705,"sourceUnit":55555,"symbolAliases":[{"foreign":{"id":54300,"name":"ISuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55554,"src":"366:16:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":54308,"nodeType":"ImportDirective","src":"426:151:58","nodes":[],"absolutePath":"src/interfaces/INearX.sol","file":"./interfaces/INearX.sol","nameLocation":"-1:-1:-1","scope":54705,"sourceUnit":55396,"symbolAliases":[{"foreign":{"id":54302,"name":"INearX","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55012,"src":"434:6:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":54303,"name":"TransactionOrReceiptId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55022,"src":"442:22:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":54304,"name":"ProofVerificationResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55256,"src":"466:23:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":54305,"name":"encodePackedIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55093,"src":"491:15:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":54306,"name":"decodePackedIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55170,"src":"508:15:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"},{"foreign":{"id":54307,"name":"decodePackedResults","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55331,"src":"525:19:58","typeDescriptions":{}},"nameLocation":"-1:-1:-1"}],"unitAlias":""},{"id":54704,"nodeType":"ContractDefinition","src":"638:4675:58","nodes":[{"id":54325,"nodeType":"FunctionDefinition","src":"774:61:58","nodes":[],"body":{"id":54324,"nodeType":"Block","src":"796:39:58","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":54321,"name":"_disableInitializers","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45774,"src":"806:20:58","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":54322,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"806:22:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54323,"nodeType":"ExpressionStatement","src":"806:22:58"}]},"documentation":{"id":54318,"nodeType":"StructuredDocumentation","src":"721:48:58","text":"@custom:oz-upgrades-unsafe-allow constructor"},"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","parameters":{"id":54319,"nodeType":"ParameterList","parameters":[],"src":"785:2:58"},"returnParameters":{"id":54320,"nodeType":"ParameterList","parameters":[],"src":"796:0:58"},"scope":54704,"stateMutability":"payable","virtual":false,"visibility":"public"},{"id":54340,"nodeType":"FunctionDefinition","src":"841:140:58","nodes":[],"body":{"id":54339,"nodeType":"Block","src":"902:79:58","nodes":[],"statements":[{"expression":{"arguments":[{"id":54333,"name":"initialOwner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54327,"src":"927:12:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54332,"name":"__Ownable_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45412,"src":"912:14:58","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":54334,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"912:28:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54335,"nodeType":"ExpressionStatement","src":"912:28:58"},{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":54336,"name":"__UUPSUpgradeable_init","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":45860,"src":"950:22:58","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":54337,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"950:24:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54338,"nodeType":"ExpressionStatement","src":"950:24:58"}]},"functionSelector":"c4d66de8","implemented":true,"kind":"function","modifiers":[{"id":54330,"kind":"modifierInvocation","modifierName":{"id":54329,"name":"initializer","nameLocations":["890:11:58"],"nodeType":"IdentifierPath","referencedDeclaration":45660,"src":"890:11:58"},"nodeType":"ModifierInvocation","src":"890:11:58"}],"name":"initialize","nameLocation":"850:10:58","parameters":{"id":54328,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54327,"mutability":"mutable","name":"initialOwner","nameLocation":"869:12:58","nodeType":"VariableDeclaration","scope":54340,"src":"861:20:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":54326,"name":"address","nodeType":"ElementaryTypeName","src":"861:7:58","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"860:22:58"},"returnParameters":{"id":54331,"nodeType":"ParameterList","parameters":[],"src":"902:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":54349,"nodeType":"FunctionDefinition","src":"987:112:58","nodes":[],"body":{"id":54348,"nodeType":"Block","src":"1097:2:58","nodes":[],"statements":[]},"baseFunctions":[45942],"implemented":true,"kind":"function","modifiers":[{"id":54346,"kind":"modifierInvocation","modifierName":{"id":54345,"name":"onlyOwner","nameLocations":["1083:9:58"],"nodeType":"IdentifierPath","referencedDeclaration":45447,"src":"1083:9:58"},"nodeType":"ModifierInvocation","src":"1083:9:58"}],"name":"_authorizeUpgrade","nameLocation":"996:17:58","overrides":{"id":54344,"nodeType":"OverrideSpecifier","overrides":[],"src":"1066:8:58"},"parameters":{"id":54343,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54342,"mutability":"mutable","name":"newImplementation","nameLocation":"1022:17:58","nodeType":"VariableDeclaration","scope":54349,"src":"1014:25:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":54341,"name":"address","nodeType":"ElementaryTypeName","src":"1014:7:58","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1013:27:58"},"returnParameters":{"id":54347,"nodeType":"ParameterList","parameters":[],"src":"1097:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":54352,"nodeType":"VariableDeclaration","src":"1105:50:58","nodes":[],"constant":true,"functionSelector":"d6be695a","mutability":"constant","name":"DEFAULT_GAS_LIMIT","nameLocation":"1128:17:58","scope":54704,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":54350,"name":"uint32","nodeType":"ElementaryTypeName","src":"1105:6:58","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"value":{"hexValue":"31303030303030","id":54351,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1148:7:58","typeDescriptions":{"typeIdentifier":"t_rational_1000000_by_1","typeString":"int_const 1000000"},"value":"1000000"},"visibility":"public"},{"id":54355,"nodeType":"VariableDeclaration","src":"1161:46:58","nodes":[],"constant":true,"functionSelector":"28db958e","mutability":"constant","name":"SYNC_GAS_LIMIT","nameLocation":"1184:14:58","scope":54704,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"},"typeName":{"id":54353,"name":"uint32","nodeType":"ElementaryTypeName","src":"1161:6:58","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"value":{"hexValue":"343030303030","id":54354,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1201:6:58","typeDescriptions":{"typeIdentifier":"t_rational_400000_by_1","typeString":"int_const 400000"},"value":"400000"},"visibility":"public"},{"id":54358,"nodeType":"VariableDeclaration","src":"1267:22:58","nodes":[],"constant":false,"documentation":{"id":54356,"nodeType":"StructuredDocumentation","src":"1214:48:58","text":"@notice The address of the gateway contract."},"functionSelector":"116191b6","mutability":"mutable","name":"gateway","nameLocation":"1282:7:58","scope":54704,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":54357,"name":"address","nodeType":"ElementaryTypeName","src":"1267:7:58","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"id":54361,"nodeType":"VariableDeclaration","src":"1330:29:58","nodes":[],"constant":false,"documentation":{"id":54359,"nodeType":"StructuredDocumentation","src":"1296:29:58","text":"@notice Sync function id."},"functionSelector":"694e6f69","mutability":"mutable","name":"syncFunctionId","nameLocation":"1345:14:58","scope":54704,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54360,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1330:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"id":54364,"nodeType":"VariableDeclaration","src":"1402:31:58","nodes":[],"constant":false,"documentation":{"id":54362,"nodeType":"StructuredDocumentation","src":"1366:31:58","text":"@notice Verify function id."},"functionSelector":"5629df5b","mutability":"mutable","name":"verifyFunctionId","nameLocation":"1417:16:58","scope":54704,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54363,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1402:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"id":54367,"nodeType":"VariableDeclaration","src":"1499:27:58","nodes":[],"constant":false,"documentation":{"id":54365,"nodeType":"StructuredDocumentation","src":"1440:54:58","text":"@notice The latest header that has been committed."},"functionSelector":"bba3fe8e","mutability":"mutable","name":"latestHeader","nameLocation":"1514:12:58","scope":54704,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54366,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1499:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"public"},{"id":54379,"nodeType":"FunctionDefinition","src":"1533:95:58","nodes":[],"body":{"id":54378,"nodeType":"Block","src":"1593:35:58","nodes":[],"statements":[{"expression":{"id":54376,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":54374,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"1603:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":54375,"name":"_gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54369,"src":"1613:8:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1603:18:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":54377,"nodeType":"ExpressionStatement","src":"1603:18:58"}]},"functionSelector":"c0346b20","implemented":true,"kind":"function","modifiers":[{"id":54372,"kind":"modifierInvocation","modifierName":{"id":54371,"name":"onlyOwner","nameLocations":["1583:9:58"],"nodeType":"IdentifierPath","referencedDeclaration":45447,"src":"1583:9:58"},"nodeType":"ModifierInvocation","src":"1583:9:58"}],"name":"updateGateway","nameLocation":"1542:13:58","parameters":{"id":54370,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54369,"mutability":"mutable","name":"_gateway","nameLocation":"1564:8:58","nodeType":"VariableDeclaration","scope":54379,"src":"1556:16:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":54368,"name":"address","nodeType":"ElementaryTypeName","src":"1556:7:58","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1555:18:58"},"returnParameters":{"id":54373,"nodeType":"ParameterList","parameters":[],"src":"1593:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54391,"nodeType":"FunctionDefinition","src":"1634:107:58","nodes":[],"body":{"id":54390,"nodeType":"Block","src":"1696:45:58","nodes":[],"statements":[{"expression":{"id":54388,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":54386,"name":"syncFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54361,"src":"1706:14:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":54387,"name":"_functionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54381,"src":"1723:11:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"1706:28:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":54389,"nodeType":"ExpressionStatement","src":"1706:28:58"}]},"functionSelector":"b291c2d7","implemented":true,"kind":"function","modifiers":[{"id":54384,"kind":"modifierInvocation","modifierName":{"id":54383,"name":"onlyOwner","nameLocations":["1686:9:58"],"nodeType":"IdentifierPath","referencedDeclaration":45447,"src":"1686:9:58"},"nodeType":"ModifierInvocation","src":"1686:9:58"}],"name":"updateSyncId","nameLocation":"1643:12:58","parameters":{"id":54382,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54381,"mutability":"mutable","name":"_functionId","nameLocation":"1664:11:58","nodeType":"VariableDeclaration","scope":54391,"src":"1656:19:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54380,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1656:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1655:21:58"},"returnParameters":{"id":54385,"nodeType":"ParameterList","parameters":[],"src":"1696:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54403,"nodeType":"FunctionDefinition","src":"1747:111:58","nodes":[],"body":{"id":54402,"nodeType":"Block","src":"1811:47:58","nodes":[],"statements":[{"expression":{"id":54400,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":54398,"name":"verifyFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54364,"src":"1821:16:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":54399,"name":"_functionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54393,"src":"1840:11:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"1821:30:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":54401,"nodeType":"ExpressionStatement","src":"1821:30:58"}]},"functionSelector":"2bdd271f","implemented":true,"kind":"function","modifiers":[{"id":54396,"kind":"modifierInvocation","modifierName":{"id":54395,"name":"onlyOwner","nameLocations":["1801:9:58"],"nodeType":"IdentifierPath","referencedDeclaration":45447,"src":"1801:9:58"},"nodeType":"ModifierInvocation","src":"1801:9:58"}],"name":"updateVerifyId","nameLocation":"1756:14:58","parameters":{"id":54394,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54393,"mutability":"mutable","name":"_functionId","nameLocation":"1779:11:58","nodeType":"VariableDeclaration","scope":54403,"src":"1771:19:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54392,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1771:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1770:21:58"},"returnParameters":{"id":54397,"nodeType":"ParameterList","parameters":[],"src":"1811:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54416,"nodeType":"FunctionDefinition","src":"1961:104:58","nodes":[],"body":{"id":54415,"nodeType":"Block","src":"2026:39:58","nodes":[],"statements":[{"expression":{"id":54413,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":54411,"name":"latestHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54367,"src":"2036:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":54412,"name":"_header","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54406,"src":"2051:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2036:22:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":54414,"nodeType":"ExpressionStatement","src":"2036:22:58"}]},"documentation":{"id":54404,"nodeType":"StructuredDocumentation","src":"1864:92:58","text":"Note: Only for testnet. The genesis header should be set when initializing the contract."},"functionSelector":"fd4f593d","implemented":true,"kind":"function","modifiers":[{"id":54409,"kind":"modifierInvocation","modifierName":{"id":54408,"name":"onlyOwner","nameLocations":["2016:9:58"],"nodeType":"IdentifierPath","referencedDeclaration":45447,"src":"2016:9:58"},"nodeType":"ModifierInvocation","src":"2016:9:58"}],"name":"setCheckpointHeader","nameLocation":"1970:19:58","parameters":{"id":54407,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54406,"mutability":"mutable","name":"_header","nameLocation":"1998:7:58","nodeType":"VariableDeclaration","scope":54416,"src":"1990:15:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54405,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1990:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1989:17:58"},"returnParameters":{"id":54410,"nodeType":"ParameterList","parameters":[],"src":"2026:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54460,"nodeType":"FunctionDefinition","src":"2071:372:58","nodes":[],"body":{"id":54459,"nodeType":"Block","src":"2114:329:58","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":54424,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":54419,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"2128:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":54422,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2147:1:58","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":54421,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2139:7:58","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":54420,"name":"address","nodeType":"ElementaryTypeName","src":"2139:7:58","typeDescriptions":{}}},"id":54423,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2139:10:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2128:21:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":54429,"nodeType":"IfStatement","src":"2124:82:58","trueBody":{"id":54428,"nodeType":"Block","src":"2151:55:58","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":54425,"name":"GatewayNotInitialised","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55004,"src":"2172:21:58","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":54426,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2172:23:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54427,"nodeType":"RevertStatement","src":"2165:30:58"}]}},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":54442,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":54435,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":54430,"name":"syncFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54361,"src":"2219:14:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":54433,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2245:1:58","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":54432,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2237:7:58","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":54431,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2237:7:58","typeDescriptions":{}}},"id":54434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2237:10:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2219:28:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":54441,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":54436,"name":"verifyFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54364,"src":"2251:16:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":54439,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2279:1:58","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":54438,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2271:7:58","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":54437,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2271:7:58","typeDescriptions":{}}},"id":54440,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2271:10:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2251:30:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2219:62:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":54447,"nodeType":"IfStatement","src":"2215:127:58","trueBody":{"id":54446,"nodeType":"Block","src":"2283:59:58","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":54443,"name":"FunctionIdsNotInitialised","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55006,"src":"2304:25:58","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":54444,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2304:27:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54445,"nodeType":"RevertStatement","src":"2297:34:58"}]}},{"condition":{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":54453,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":54448,"name":"latestHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54367,"src":"2355:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"hexValue":"30","id":54451,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2379:1:58","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":54450,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2371:7:58","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":54449,"name":"bytes32","nodeType":"ElementaryTypeName","src":"2371:7:58","typeDescriptions":{}}},"id":54452,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2371:10:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"2355:26:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":54458,"nodeType":"IfStatement","src":"2351:86:58","trueBody":{"id":54457,"nodeType":"Block","src":"2383:54:58","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":54454,"name":"HeaderNotInitialised","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54997,"src":"2404:20:58","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":54455,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2404:22:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54456,"nodeType":"RevertStatement","src":"2397:29:58"}]}}]},"implemented":true,"kind":"function","modifiers":[],"name":"ensureInitialized","nameLocation":"2080:17:58","parameters":{"id":54417,"nodeType":"ParameterList","parameters":[],"src":"2097:2:58"},"returnParameters":{"id":54418,"nodeType":"ParameterList","parameters":[],"src":"2114:0:58"},"scope":54704,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":54494,"nodeType":"FunctionDefinition","src":"2491:389:58","nodes":[],"body":{"id":54493,"nodeType":"Block","src":"2531:349:58","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":54464,"name":"ensureInitialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54460,"src":"2541:17:58","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":54465,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2541:19:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54466,"nodeType":"ExpressionStatement","src":"2541:19:58"},{"assignments":[54468],"declarations":[{"constant":false,"id":54468,"mutability":"mutable","name":"context","nameLocation":"2583:7:58","nodeType":"VariableDeclaration","scope":54493,"src":"2570:20:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":54467,"name":"bytes","nodeType":"ElementaryTypeName","src":"2570:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":54469,"nodeType":"VariableDeclarationStatement","src":"2570:20:58"},{"expression":{"arguments":[{"id":54477,"name":"syncFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54361,"src":"2674:14:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":54480,"name":"latestHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54367,"src":"2719:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":54478,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"2702:3:58","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":54479,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2706:12:58","memberName":"encodePacked","nodeType":"MemberAccess","src":"2702:16:58","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":54481,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2702:30:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":54482,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54468,"src":"2746:7:58","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"expression":{"id":54483,"name":"NearX","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54704,"src":"2767:5:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_NearX_$54704_$","typeString":"type(contract NearX)"}},"id":54484,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2773:10:58","memberName":"handleSync","nodeType":"MemberAccess","referencedDeclaration":54524,"src":"2767:16:58","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function NearX.handleSync(bytes calldata,bytes calldata)"}},"id":54485,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"2784:8:58","memberName":"selector","nodeType":"MemberAccess","src":"2767:25:58","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":54486,"name":"SYNC_GAS_LIMIT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54355,"src":"2806:14:58","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"arguments":[{"id":54471,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"2618:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54470,"name":"ISuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55554,"src":"2601:16:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISuccinctGateway_$55554_$","typeString":"type(contract ISuccinctGateway)"}},"id":54472,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2601:25:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISuccinctGateway_$55554","typeString":"contract ISuccinctGateway"}},"id":54473,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2627:15:58","memberName":"requestCallback","nodeType":"MemberAccess","referencedDeclaration":55526,"src":"2601:41:58","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes4_$_t_uint32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes memory,bytes memory,bytes4,uint32) payable external returns (bytes32)"}},"id":54476,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":54474,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2650:3:58","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":54475,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2654:5:58","memberName":"value","nodeType":"MemberAccess","src":"2650:9:58","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"2601:59:58","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes4_$_t_uint32_$returns$_t_bytes32_$value","typeString":"function (bytes32,bytes memory,bytes memory,bytes4,uint32) payable external returns (bytes32)"}},"id":54487,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2601:229:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":54488,"nodeType":"ExpressionStatement","src":"2601:229:58"},{"eventCall":{"arguments":[{"id":54490,"name":"latestHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54367,"src":"2860:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":54489,"name":"SyncRequested","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54982,"src":"2846:13:58","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$returns$__$","typeString":"function (bytes32)"}},"id":54491,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2846:27:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54492,"nodeType":"EmitStatement","src":"2841:32:58"}]},"documentation":{"id":54461,"nodeType":"StructuredDocumentation","src":"2449:37:58","text":"@notice Inputs of a sync request."},"functionSelector":"7a03780a","implemented":true,"kind":"function","modifiers":[],"name":"requestSync","nameLocation":"2500:11:58","parameters":{"id":54462,"nodeType":"ParameterList","parameters":[],"src":"2511:2:58"},"returnParameters":{"id":54463,"nodeType":"ParameterList","parameters":[],"src":"2531:0:58"},"scope":54704,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":54524,"nodeType":"FunctionDefinition","src":"2886:383:58","nodes":[],"body":{"id":54523,"nodeType":"Block","src":"2955:314:58","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":54511,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":54504,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":54501,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"2969:3:58","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":54502,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2973:6:58","memberName":"sender","nodeType":"MemberAccess","src":"2969:10:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":54503,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"2983:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2969:21:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"id":54510,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"2994:39:58","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":54506,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"3012:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54505,"name":"ISuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55554,"src":"2995:16:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISuccinctGateway_$55554_$","typeString":"type(contract ISuccinctGateway)"}},"id":54507,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2995:25:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISuccinctGateway_$55554","typeString":"contract ISuccinctGateway"}},"id":54508,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3021:10:58","memberName":"isCallback","nodeType":"MemberAccess","referencedDeclaration":55553,"src":"2995:36:58","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bool_$","typeString":"function () view external returns (bool)"}},"id":54509,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2995:38:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"2969:64:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":54518,"nodeType":"IfStatement","src":"2965:136:58","trueBody":{"id":54517,"nodeType":"Block","src":"3035:66:58","statements":[{"errorCall":{"arguments":[{"expression":{"id":54513,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"3079:3:58","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":54514,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3083:6:58","memberName":"sender","nodeType":"MemberAccess","src":"3079:10:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54512,"name":"NotFromSuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55002,"src":"3056:22:58","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$__$","typeString":"function (address) pure"}},"id":54515,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3056:34:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54516,"nodeType":"RevertStatement","src":"3049:41:58"}]}},{"expression":{"arguments":[{"id":54520,"name":"_output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54496,"src":"3254:7:58","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":54519,"name":"handleSyncOutput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54575,"src":"3237:16:58","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":54521,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3237:25:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54522,"nodeType":"ExpressionStatement","src":"3237:25:58"}]},"functionSelector":"8d363ad0","implemented":true,"kind":"function","modifiers":[],"name":"handleSync","nameLocation":"2895:10:58","parameters":{"id":54499,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54496,"mutability":"mutable","name":"_output","nameLocation":"2921:7:58","nodeType":"VariableDeclaration","scope":54524,"src":"2906:22:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":54495,"name":"bytes","nodeType":"ElementaryTypeName","src":"2906:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":54498,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":54524,"src":"2930:14:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":54497,"name":"bytes","nodeType":"ElementaryTypeName","src":"2930:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2905:40:58"},"returnParameters":{"id":54500,"nodeType":"ParameterList","parameters":[],"src":"2955:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54551,"nodeType":"FunctionDefinition","src":"3346:322:58","nodes":[],"body":{"id":54550,"nodeType":"Block","src":"3392:276:58","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":54530,"name":"ensureInitialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54460,"src":"3454:17:58","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":54531,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3454:19:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54532,"nodeType":"ExpressionStatement","src":"3454:19:58"},{"assignments":[54534],"declarations":[{"constant":false,"id":54534,"mutability":"mutable","name":"output","nameLocation":"3497:6:58","nodeType":"VariableDeclaration","scope":54550,"src":"3484:19:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":54533,"name":"bytes","nodeType":"ElementaryTypeName","src":"3484:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":54545,"initialValue":{"arguments":[{"id":54539,"name":"syncFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54361,"src":"3558:14:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":54542,"name":"trustedHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54527,"src":"3603:13:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"expression":{"id":54540,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3586:3:58","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":54541,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3590:12:58","memberName":"encodePacked","nodeType":"MemberAccess","src":"3586:16:58","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":54543,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3586:31:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":54536,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"3523:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54535,"name":"ISuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55554,"src":"3506:16:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISuccinctGateway_$55554_$","typeString":"type(contract ISuccinctGateway)"}},"id":54537,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3506:25:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISuccinctGateway_$55554","typeString":"contract ISuccinctGateway"}},"id":54538,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3532:12:58","memberName":"verifiedCall","nodeType":"MemberAccess","referencedDeclaration":55548,"src":"3506:38:58","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes32,bytes memory) view external returns (bytes memory)"}},"id":54544,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3506:121:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"3484:143:58"},{"expression":{"arguments":[{"id":54547,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54534,"src":"3654:6:58","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":54546,"name":"handleSyncOutput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54575,"src":"3637:16:58","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":54548,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3637:24:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54549,"nodeType":"ExpressionStatement","src":"3637:24:58"}]},"documentation":{"id":54525,"nodeType":"StructuredDocumentation","src":"3275:66:58","text":"Fetches the proof result from the gateway and updates our head"},"functionSelector":"ae4b2551","implemented":true,"kind":"function","modifiers":[],"name":"sync","nameLocation":"3355:4:58","parameters":{"id":54528,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54527,"mutability":"mutable","name":"trustedHeader","nameLocation":"3368:13:58","nodeType":"VariableDeclaration","scope":54551,"src":"3360:21:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54526,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3360:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"3359:23:58"},"returnParameters":{"id":54529,"nodeType":"ParameterList","parameters":[],"src":"3392:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54575,"nodeType":"FunctionDefinition","src":"3674:205:58","nodes":[],"body":{"id":54574,"nodeType":"Block","src":"3731:148:58","nodes":[],"statements":[{"assignments":[54557],"declarations":[{"constant":false,"id":54557,"mutability":"mutable","name":"targetHeader","nameLocation":"3749:12:58","nodeType":"VariableDeclaration","scope":54574,"src":"3741:20:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54556,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3741:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"id":54565,"initialValue":{"arguments":[{"id":54560,"name":"_output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54553,"src":"3775:7:58","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"components":[{"id":54562,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3785:7:58","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"},"typeName":{"id":54561,"name":"bytes32","nodeType":"ElementaryTypeName","src":"3785:7:58","typeDescriptions":{}}}],"id":54563,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"3784:9:58","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_type$_t_bytes32_$","typeString":"type(bytes32)"}],"expression":{"id":54558,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3764:3:58","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":54559,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3768:6:58","memberName":"decode","nodeType":"MemberAccess","src":"3764:10:58","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":54564,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3764:30:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"VariableDeclarationStatement","src":"3741:53:58"},{"expression":{"id":54568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":54566,"name":"latestHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54367,"src":"3805:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":54567,"name":"targetHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54557,"src":"3820:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3805:27:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":54569,"nodeType":"ExpressionStatement","src":"3805:27:58"},{"eventCall":{"arguments":[{"id":54571,"name":"targetHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54557,"src":"3859:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":54570,"name":"HeadUpdate","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54977,"src":"3848:10:58","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$returns$__$","typeString":"function (bytes32)"}},"id":54572,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3848:24:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54573,"nodeType":"EmitStatement","src":"3843:29:58"}]},"implemented":true,"kind":"function","modifiers":[],"name":"handleSyncOutput","nameLocation":"3683:16:58","parameters":{"id":54554,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54553,"mutability":"mutable","name":"_output","nameLocation":"3713:7:58","nodeType":"VariableDeclaration","scope":54575,"src":"3700:20:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":54552,"name":"bytes","nodeType":"ElementaryTypeName","src":"3700:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"3699:22:58"},"returnParameters":{"id":54555,"nodeType":"ParameterList","parameters":[],"src":"3731:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":54620,"nodeType":"FunctionDefinition","src":"3885:554:58","nodes":[],"body":{"id":54619,"nodeType":"Block","src":"3984:455:58","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":54582,"name":"ensureInitialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54460,"src":"3994:17:58","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":54583,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3994:19:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54584,"nodeType":"ExpressionStatement","src":"3994:19:58"},{"assignments":[54586],"declarations":[{"constant":false,"id":54586,"mutability":"mutable","name":"context","nameLocation":"4036:7:58","nodeType":"VariableDeclaration","scope":54619,"src":"4023:20:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":54585,"name":"bytes","nodeType":"ElementaryTypeName","src":"4023:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":54587,"nodeType":"VariableDeclarationStatement","src":"4023:20:58"},{"assignments":[54589],"declarations":[{"constant":false,"id":54589,"mutability":"mutable","name":"input","nameLocation":"4066:5:58","nodeType":"VariableDeclaration","scope":54619,"src":"4053:18:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":54588,"name":"bytes","nodeType":"ElementaryTypeName","src":"4053:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":54597,"initialValue":{"arguments":[{"id":54592,"name":"latestHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54367,"src":"4104:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":54594,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54579,"src":"4146:3:58","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_TransactionOrReceiptId_$55022_calldata_ptr_$dyn_calldata_ptr","typeString":"struct TransactionOrReceiptId calldata[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_TransactionOrReceiptId_$55022_calldata_ptr_$dyn_calldata_ptr","typeString":"struct TransactionOrReceiptId calldata[] calldata"}],"id":54593,"name":"encodePackedIds","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55093,"src":"4130:15:58","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_array$_t_struct$_TransactionOrReceiptId_$55022_memory_ptr_$dyn_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (struct TransactionOrReceiptId memory[] memory) pure returns (bytes memory)"}},"id":54595,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4130:20:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"id":54590,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4074:3:58","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":54591,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4078:12:58","memberName":"encodePacked","nodeType":"MemberAccess","src":"4074:16:58","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":54596,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4074:86:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"4053:107:58"},{"expression":{"arguments":[{"id":54605,"name":"verifyFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54364,"src":"4244:16:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":54606,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54589,"src":"4274:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"id":54607,"name":"context","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54586,"src":"4293:7:58","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},{"expression":{"expression":{"id":54608,"name":"NearX","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54704,"src":"4314:5:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_NearX_$54704_$","typeString":"type(contract NearX)"}},"id":54609,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4320:12:58","memberName":"handleVerify","nodeType":"MemberAccess","referencedDeclaration":54650,"src":"4314:18:58","typeDescriptions":{"typeIdentifier":"t_function_declaration_nonpayable$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$","typeString":"function NearX.handleVerify(bytes calldata,bytes calldata)"}},"id":54610,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4333:8:58","memberName":"selector","nodeType":"MemberAccess","src":"4314:27:58","typeDescriptions":{"typeIdentifier":"t_bytes4","typeString":"bytes4"}},{"id":54611,"name":"DEFAULT_GAS_LIMIT","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54352,"src":"4355:17:58","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"},{"typeIdentifier":"t_bytes4","typeString":"bytes4"},{"typeIdentifier":"t_uint32","typeString":"uint32"}],"expression":{"arguments":[{"id":54599,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"4188:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54598,"name":"ISuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55554,"src":"4171:16:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISuccinctGateway_$55554_$","typeString":"type(contract ISuccinctGateway)"}},"id":54600,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4171:25:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISuccinctGateway_$55554","typeString":"contract ISuccinctGateway"}},"id":54601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4197:15:58","memberName":"requestCallback","nodeType":"MemberAccess","referencedDeclaration":55526,"src":"4171:41:58","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes4_$_t_uint32_$returns$_t_bytes32_$","typeString":"function (bytes32,bytes memory,bytes memory,bytes4,uint32) payable external returns (bytes32)"}},"id":54604,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"names":["value"],"nodeType":"FunctionCallOptions","options":[{"expression":{"id":54602,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4220:3:58","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":54603,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4224:5:58","memberName":"value","nodeType":"MemberAccess","src":"4220:9:58","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"src":"4171:59:58","typeDescriptions":{"typeIdentifier":"t_function_external_payable$_t_bytes32_$_t_bytes_memory_ptr_$_t_bytes_memory_ptr_$_t_bytes4_$_t_uint32_$returns$_t_bytes32_$value","typeString":"function (bytes32,bytes memory,bytes memory,bytes4,uint32) payable external returns (bytes32)"}},"id":54612,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4171:211:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":54613,"nodeType":"ExpressionStatement","src":"4171:211:58"},{"eventCall":{"arguments":[{"id":54615,"name":"latestHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54367,"src":"4414:12:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":54616,"name":"ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54579,"src":"4428:3:58","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_TransactionOrReceiptId_$55022_calldata_ptr_$dyn_calldata_ptr","typeString":"struct TransactionOrReceiptId calldata[] calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_array$_t_struct$_TransactionOrReceiptId_$55022_calldata_ptr_$dyn_calldata_ptr","typeString":"struct TransactionOrReceiptId calldata[] calldata"}],"id":54614,"name":"VerifyRequested","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54991,"src":"4398:15:58","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes32_$_t_array$_t_struct$_TransactionOrReceiptId_$55022_memory_ptr_$dyn_memory_ptr_$returns$__$","typeString":"function (bytes32,struct TransactionOrReceiptId memory[] memory)"}},"id":54617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4398:34:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54618,"nodeType":"EmitStatement","src":"4393:39:58"}]},"functionSelector":"d7c908fc","implemented":true,"kind":"function","modifiers":[],"name":"requestVerify","nameLocation":"3894:13:58","parameters":{"id":54580,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54579,"mutability":"mutable","name":"ids","nameLocation":"3942:3:58","nodeType":"VariableDeclaration","scope":54620,"src":"3908:37:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_TransactionOrReceiptId_$55022_calldata_ptr_$dyn_calldata_ptr","typeString":"struct TransactionOrReceiptId[]"},"typeName":{"baseType":{"id":54577,"nodeType":"UserDefinedTypeName","pathNode":{"id":54576,"name":"TransactionOrReceiptId","nameLocations":["3908:22:58"],"nodeType":"IdentifierPath","referencedDeclaration":55022,"src":"3908:22:58"},"referencedDeclaration":55022,"src":"3908:22:58","typeDescriptions":{"typeIdentifier":"t_struct$_TransactionOrReceiptId_$55022_storage_ptr","typeString":"struct TransactionOrReceiptId"}},"id":54578,"nodeType":"ArrayTypeName","src":"3908:24:58","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_TransactionOrReceiptId_$55022_storage_$dyn_storage_ptr","typeString":"struct TransactionOrReceiptId[]"}},"visibility":"internal"}],"src":"3907:39:58"},"returnParameters":{"id":54581,"nodeType":"ParameterList","parameters":[],"src":"3984:0:58"},"scope":54704,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":54650,"nodeType":"FunctionDefinition","src":"4445:260:58","nodes":[],"body":{"id":54649,"nodeType":"Block","src":"4516:189:58","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":54637,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":54630,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":54627,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4530:3:58","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":54628,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4534:6:58","memberName":"sender","nodeType":"MemberAccess","src":"4530:10:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":54629,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"4544:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"4530:21:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"id":54636,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"4555:39:58","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"expression":{"arguments":[{"id":54632,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"4573:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54631,"name":"ISuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55554,"src":"4556:16:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISuccinctGateway_$55554_$","typeString":"type(contract ISuccinctGateway)"}},"id":54633,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4556:25:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISuccinctGateway_$55554","typeString":"contract ISuccinctGateway"}},"id":54634,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4582:10:58","memberName":"isCallback","nodeType":"MemberAccess","referencedDeclaration":55553,"src":"4556:36:58","typeDescriptions":{"typeIdentifier":"t_function_external_view$__$returns$_t_bool_$","typeString":"function () view external returns (bool)"}},"id":54635,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4556:38:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"4530:64:58","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":54644,"nodeType":"IfStatement","src":"4526:136:58","trueBody":{"id":54643,"nodeType":"Block","src":"4596:66:58","statements":[{"errorCall":{"arguments":[{"expression":{"id":54639,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"4640:3:58","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":54640,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4644:6:58","memberName":"sender","nodeType":"MemberAccess","src":"4640:10:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54638,"name":"NotFromSuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55002,"src":"4617:22:58","typeDescriptions":{"typeIdentifier":"t_function_error_pure$_t_address_$returns$__$","typeString":"function (address) pure"}},"id":54641,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4617:34:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54642,"nodeType":"RevertStatement","src":"4610:41:58"}]}},{"expression":{"arguments":[{"id":54646,"name":"_output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54622,"src":"4690:7:58","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":54645,"name":"handleVerifyOutput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54689,"src":"4671:18:58","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":54647,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4671:27:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54648,"nodeType":"ExpressionStatement","src":"4671:27:58"}]},"functionSelector":"2ebfd37f","implemented":true,"kind":"function","modifiers":[],"name":"handleVerify","nameLocation":"4454:12:58","parameters":{"id":54625,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54622,"mutability":"mutable","name":"_output","nameLocation":"4482:7:58","nodeType":"VariableDeclaration","scope":54650,"src":"4467:22:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":54621,"name":"bytes","nodeType":"ElementaryTypeName","src":"4467:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":54624,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":54650,"src":"4491:14:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":54623,"name":"bytes","nodeType":"ElementaryTypeName","src":"4491:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4466:40:58"},"returnParameters":{"id":54626,"nodeType":"ParameterList","parameters":[],"src":"4516:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54679,"nodeType":"FunctionDefinition","src":"4711:302:58","nodes":[],"body":{"id":54678,"nodeType":"Block","src":"4780:233:58","nodes":[],"statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":54657,"name":"ensureInitialized","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54460,"src":"4790:17:58","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$__$","typeString":"function () view"}},"id":54658,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4790:19:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54659,"nodeType":"ExpressionStatement","src":"4790:19:58"},{"assignments":[54661],"declarations":[{"constant":false,"id":54661,"mutability":"mutable","name":"output","nameLocation":"4832:6:58","nodeType":"VariableDeclaration","scope":54678,"src":"4819:19:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":54660,"name":"bytes","nodeType":"ElementaryTypeName","src":"4819:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"id":54673,"initialValue":{"arguments":[{"id":54666,"name":"verifyFunctionId","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54364,"src":"4893:16:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"arguments":[{"id":54669,"name":"trustedHeader","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54652,"src":"4940:13:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},{"id":54670,"name":"_ids","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54654,"src":"4955:4:58","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"expression":{"id":54667,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"4923:3:58","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":54668,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"4927:12:58","memberName":"encodePacked","nodeType":"MemberAccess","src":"4923:16:58","typeDescriptions":{"typeIdentifier":"t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$","typeString":"function () pure returns (bytes memory)"}},"id":54671,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4923:37:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes32","typeString":"bytes32"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"expression":{"arguments":[{"id":54663,"name":"gateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54358,"src":"4858:7:58","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":54662,"name":"ISuccinctGateway","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55554,"src":"4841:16:58","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISuccinctGateway_$55554_$","typeString":"type(contract ISuccinctGateway)"}},"id":54664,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4841:25:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISuccinctGateway_$55554","typeString":"contract ISuccinctGateway"}},"id":54665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4867:12:58","memberName":"verifiedCall","nodeType":"MemberAccess","referencedDeclaration":55548,"src":"4841:38:58","typeDescriptions":{"typeIdentifier":"t_function_external_view$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bytes_memory_ptr_$","typeString":"function (bytes32,bytes memory) view external returns (bytes memory)"}},"id":54672,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4841:129:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"nodeType":"VariableDeclarationStatement","src":"4819:151:58"},{"expression":{"arguments":[{"id":54675,"name":"output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54661,"src":"4999:6:58","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":54674,"name":"handleVerifyOutput","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54689,"src":"4980:18:58","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":54676,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4980:26:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54677,"nodeType":"ExpressionStatement","src":"4980:26:58"}]},"functionSelector":"258ae582","implemented":true,"kind":"function","modifiers":[],"name":"verify","nameLocation":"4720:6:58","parameters":{"id":54655,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54652,"mutability":"mutable","name":"trustedHeader","nameLocation":"4735:13:58","nodeType":"VariableDeclaration","scope":54679,"src":"4727:21:58","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":54651,"name":"bytes32","nodeType":"ElementaryTypeName","src":"4727:7:58","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":54654,"mutability":"mutable","name":"_ids","nameLocation":"4765:4:58","nodeType":"VariableDeclaration","scope":54679,"src":"4750:19:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":54653,"name":"bytes","nodeType":"ElementaryTypeName","src":"4750:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"4726:44:58"},"returnParameters":{"id":54656,"nodeType":"ParameterList","parameters":[],"src":"4780:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":54689,"nodeType":"FunctionDefinition","src":"5019:102:58","nodes":[],"body":{"id":54688,"nodeType":"Block","src":"5078:43:58","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":54685,"name":"_output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54681,"src":"5106:7:58","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":54684,"name":"VerifyResult","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55011,"src":"5093:12:58","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":54686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5093:21:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":54687,"nodeType":"EmitStatement","src":"5088:26:58"}]},"implemented":true,"kind":"function","modifiers":[],"name":"handleVerifyOutput","nameLocation":"5028:18:58","parameters":{"id":54682,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54681,"mutability":"mutable","name":"_output","nameLocation":"5060:7:58","nodeType":"VariableDeclaration","scope":54689,"src":"5047:20:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":54680,"name":"bytes","nodeType":"ElementaryTypeName","src":"5047:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5046:22:58"},"returnParameters":{"id":54683,"nodeType":"ParameterList","parameters":[],"src":"5078:0:58"},"scope":54704,"stateMutability":"nonpayable","virtual":false,"visibility":"internal"},{"id":54703,"nodeType":"FunctionDefinition","src":"5127:184:58","nodes":[],"body":{"id":54702,"nodeType":"Block","src":"5259:52:58","nodes":[],"statements":[{"expression":{"arguments":[{"id":54699,"name":"_output","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":54691,"src":"5296:7:58","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":54698,"name":"decodePackedResults","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":55331,"src":"5276:19:58","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_bytes_memory_ptr_$returns$_t_array$_t_struct$_ProofVerificationResult_$55256_memory_ptr_$dyn_memory_ptr_$","typeString":"function (bytes memory) pure returns (struct ProofVerificationResult memory[] memory)"}},"id":54700,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"5276:28:58","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ProofVerificationResult_$55256_memory_ptr_$dyn_memory_ptr","typeString":"struct ProofVerificationResult memory[] memory"}},"functionReturnParameters":54697,"id":54701,"nodeType":"Return","src":"5269:35:58"}]},"functionSelector":"56e484e1","implemented":true,"kind":"function","modifiers":[],"name":"decodeResults","nameLocation":"5136:13:58","parameters":{"id":54692,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54691,"mutability":"mutable","name":"_output","nameLocation":"5165:7:58","nodeType":"VariableDeclaration","scope":54703,"src":"5150:22:58","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":54690,"name":"bytes","nodeType":"ElementaryTypeName","src":"5150:5:58","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"5149:24:58"},"returnParameters":{"id":54697,"nodeType":"ParameterList","parameters":[{"constant":false,"id":54696,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":54703,"src":"5221:32:58","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ProofVerificationResult_$55256_memory_ptr_$dyn_memory_ptr","typeString":"struct ProofVerificationResult[]"},"typeName":{"baseType":{"id":54694,"nodeType":"UserDefinedTypeName","pathNode":{"id":54693,"name":"ProofVerificationResult","nameLocations":["5221:23:58"],"nodeType":"IdentifierPath","referencedDeclaration":55256,"src":"5221:23:58"},"referencedDeclaration":55256,"src":"5221:23:58","typeDescriptions":{"typeIdentifier":"t_struct$_ProofVerificationResult_$55256_storage_ptr","typeString":"struct ProofVerificationResult"}},"id":54695,"nodeType":"ArrayTypeName","src":"5221:25:58","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_ProofVerificationResult_$55256_storage_$dyn_storage_ptr","typeString":"struct ProofVerificationResult[]"}},"visibility":"internal"}],"src":"5220:34:58"},"scope":54704,"stateMutability":"pure","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[{"baseName":{"id":54310,"name":"INearX","nameLocations":["656:6:58"],"nodeType":"IdentifierPath","referencedDeclaration":55012,"src":"656:6:58"},"id":54311,"nodeType":"InheritanceSpecifier","src":"656:6:58"},{"baseName":{"id":54312,"name":"Initializable","nameLocations":["664:13:58"],"nodeType":"IdentifierPath","referencedDeclaration":45806,"src":"664:13:58"},"id":54313,"nodeType":"InheritanceSpecifier","src":"664:13:58"},{"baseName":{"id":54314,"name":"OwnableUpgradeable","nameLocations":["679:18:58"],"nodeType":"IdentifierPath","referencedDeclaration":45552,"src":"679:18:58"},"id":54315,"nodeType":"InheritanceSpecifier","src":"679:18:58"},{"baseName":{"id":54316,"name":"UUPSUpgradeable","nameLocations":["699:15:58"],"nodeType":"IdentifierPath","referencedDeclaration":45988,"src":"699:15:58"},"id":54317,"nodeType":"InheritanceSpecifier","src":"699:15:58"}],"canonicalName":"NearX","contractDependencies":[],"contractKind":"contract","documentation":{"id":54309,"nodeType":"StructuredDocumentation","src":"579:59:58","text":"@notice The NearX contract is a light client for Near."},"fullyImplemented":true,"linearizedBaseContracts":[54704,45988,46213,45552,46034,45806,55012],"name":"NearX","nameLocation":"647:5:58","scope":54705,"usedErrors":[45388,45393,45569,45572,45833,45838,46286,46299,46942,46945,54994,54997,55002,55004,55006],"usedEvents":[45399,45577,46265,54977,54982,54991,55011]}],"license":"MIT"},"id":58} \ No newline at end of file diff --git a/nearx/contract/foundry.toml b/nearx/contract/foundry.toml index 63e94d9b..15733bc5 100644 --- a/nearx/contract/foundry.toml +++ b/nearx/contract/foundry.toml @@ -1,22 +1,31 @@ [profile.default] -fs_permissions = [ { access = "read", path = "./broadcast" } ] +build_info = true +extra_output = [ "storageLayout" ] +ffi = true gas_reports = [ "*" ] libs = [ "lib" ] optimizer = true # This was breaking verification for some reason optimizer-runs = 1000 # TODO: change when we properly release this out = "out" -solc_version = "0.8.19" +solc_version = "0.8.24" src = "src" remappings = [ "forge-std=lib/forge-std/src", - "@openzeppelin/contracts=lib/openzeppelin-contracts/contracts", - "@openzeppelin/contracts-upgradeable=lib/openzeppelin-contracts-upgradeable/contracts", - "@openzeppelin/contracts@4.9.5=lib/openzeppelin-contracts/contracts", - "@openzeppelin/contracts-upgradeable@4.9.5=lib/openzeppelin-contracts-upgradeable/contracts", + "@openzeppelin-foundry-upgrades=lib/openzeppelin-foundry-upgrades/src", + "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts", + "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts", ] [profile.optimizer-details] constant_optimizer = true cse = true deduplicate = true + +[[profile.default.fs_permissions]] +access = "read" +path = "./broadcast" + +[[profile.default.fs_permissions]] +access = true +path = "./out" diff --git a/nearx/contract/lib/openzeppelin-contracts b/nearx/contract/lib/openzeppelin-contracts deleted file mode 160000 index bd325d56..00000000 --- a/nearx/contract/lib/openzeppelin-contracts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bd325d56b4c62c9c5c1aff048c37c6bb18ac0290 diff --git a/nearx/contract/lib/openzeppelin-contracts-upgradeable b/nearx/contract/lib/openzeppelin-contracts-upgradeable index a40cb0bd..fbdb824a 160000 --- a/nearx/contract/lib/openzeppelin-contracts-upgradeable +++ b/nearx/contract/lib/openzeppelin-contracts-upgradeable @@ -1 +1 @@ -Subproject commit a40cb0bda838c2ef3dfc252c179f5c37c32e80c4 +Subproject commit fbdb824a735891908d5588b28e0da5852d7ed7ba diff --git a/nearx/contract/lib/openzeppelin-foundry-upgrades b/nearx/contract/lib/openzeppelin-foundry-upgrades new file mode 160000 index 00000000..c50a7968 --- /dev/null +++ b/nearx/contract/lib/openzeppelin-foundry-upgrades @@ -0,0 +1 @@ +Subproject commit c50a7968d369f852607cb72e653d1ed699d823c5 diff --git a/nearx/contract/script/DefenderProxy.s.sol b/nearx/contract/script/DefenderProxy.s.sol new file mode 100644 index 00000000..48862dbe --- /dev/null +++ b/nearx/contract/script/DefenderProxy.s.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "forge-std/console.sol"; +import {NearX} from "../src/NearX.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {Script} from "forge-std/Script.sol"; +import {Defender, Options, ApprovalProcessResponse} from "openzeppelin-foundry-upgrades/Defender.sol"; +import {Upgrades} from "@openzeppelin-foundry-upgrades/Upgrades.sol"; + +contract DefenderDeploy is Script { + function setUp() public {} + + function run() external returns (address) { + console.log( + "Deploying NearX contract on chain %s", + Strings.toString(block.chainid) + ); + vm.startBroadcast(); + + ApprovalProcessResponse memory upgradeApprovalProcess = Defender + .getUpgradeApprovalProcess(); + + if (upgradeApprovalProcess.via == address(0)) { + revert( + string.concat( + "Upgrade approval process with id ", + upgradeApprovalProcess.approvalProcessId, + " has no assigned address" + ) + ); + } + + Options memory opts; + opts.defender.useDefenderDeploy = true; + + address proxy = Upgrades.deployUUPSProxy( + "NearX.sol", + abi.encodeCall(NearX.initialize, (upgradeApprovalProcess.via)), + opts + ); + // NearX lightClient = new NearX{salt: CREATE2_SALT}(); + + // ERC1967Proxy proxy = new ERC1967Proxy(address(lightClient), ""); + // + // NearX(payable(proxy)).initialize(); + + vm.stopBroadcast(); + return address(proxy); + console.log("Deployed proxy to address", proxy); + } +} diff --git a/nearx/contract/script/Deploy.s.sol b/nearx/contract/script/Deploy.s.sol index be916a90..6ccd5a9f 100644 --- a/nearx/contract/script/Deploy.s.sol +++ b/nearx/contract/script/Deploy.s.sol @@ -1,33 +1,29 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import "forge-std/console.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {NearX} from "../src/NearX.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {Script} from "forge-std/Script.sol"; +import {DevOpsTools} from "lib/foundry-devops/src/DevOpsTools.sol"; contract Deploy is Script { function setUp() public {} function run() external returns (address) { - vm.startBroadcast(); - - address proxy = deployNearX(); - init(proxy); - - vm.stopBroadcast(); - return proxy; - } + console.log( + "Deploying NearX contract on chain %s", + Strings.toString(block.chainid) + ); - function deployNearX() public returns (address) { + vm.startBroadcast(); NearX lightClient = new NearX(); - ERC1967Proxy proxy = new ERC1967Proxy(address(lightClient), ""); - return address(proxy); - } + NearX(payable(proxy)).initialize(msg.sender); - function init(address proxy) public { - NearX client = NearX(payable(proxy)); - client.initialize(); + vm.stopBroadcast(); + return address(proxy); } } diff --git a/nearx/contract/script/DeployAndRegisterVerifier.sol b/nearx/contract/script/DeployAndRegisterVerifier.sol new file mode 100644 index 00000000..384f394b --- /dev/null +++ b/nearx/contract/script/DeployAndRegisterVerifier.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Script.sol"; +import "forge-std/Vm.sol"; +import "forge-std/console.sol"; + +interface ISuccinctGateway { + function deployAndRegisterFunction( + address _owner, + bytes memory _bytecode, + bytes32 _salt + ) external returns (bytes32, address); +} + +//import {FunctionVerifier} from "./FunctionVerifier.sol"; + +contract DeployAndRegisterFunction is Script { + function run() external returns (bytes32, address) { + vm.startBroadcast(); + + bytes memory bytecode = vm.envBytes("FUNCTION_VERIFIER"); + //bytes memory bytecode = type(FunctionVerifier).creationCode; + + address GATEWAY = vm.envAddress("SUCCINCT_GATEWAY_ID"); + console.logAddress(GATEWAY); + + bytes32 SALT = vm.envBytes32("CREATE2_SALT"); + + address OWNER = msg.sender; + + (bytes32 functionId, address verifier) = ISuccinctGateway(GATEWAY) + .deployAndRegisterFunction(OWNER, bytecode, SALT); + + return (functionId, verifier); + } +} diff --git a/nearx/contract/script/Proxy.s.sol b/nearx/contract/script/Proxy.s.sol new file mode 100644 index 00000000..37a6f297 --- /dev/null +++ b/nearx/contract/script/Proxy.s.sol @@ -0,0 +1,33 @@ +// // SPDX-License-Identifier: MIT +// pragma solidity ^0.8.19; +// +// import "forge-std/console.sol"; +// import {NearX} from "../src/NearX.sol"; +// import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +// import {Script} from "forge-std/Script.sol"; +// import {Upgrades} from "@openzeppelin-foundry-upgrades/Upgrades.sol"; +// +// contract Deploy3 is Script { +// function setUp() public {} +// +// function run() external returns (address) { +// console.log( +// "Deploying NearX contract on chain %s", +// Strings.toString(block.chainid) +// ); +// vm.startBroadcast(); +// +// // address proxy = Upgrades.deployUUPSProxy( +// // "NearX.sol", +// // abi.encodeCall(NearX.initialize, ()) +// // ); +// +// // NearX lightClient = new NearX{salt: CREATE2_SALT}(); +// // ERC1967Proxy proxy = new ERC1967Proxy(address(lightClient), ""); +// // +// // NearX(payable(proxy)).initialize(); +// +// vm.stopBroadcast(); +// return address(proxy); +// } +// } diff --git a/nearx/contract/script/UpdateParams.s.sol b/nearx/contract/script/UpdateParams.s.sol index 349dbc31..604a39af 100644 --- a/nearx/contract/script/UpdateParams.s.sol +++ b/nearx/contract/script/UpdateParams.s.sol @@ -18,7 +18,6 @@ contract UpdateParams is Script { vm.startBroadcast(); NearX lightClient = NearX(payable(proxyAddress)); - // Succinct's goerli gateway address initialGateway = vm.envAddress("GATEWAY_ID"); lightClient.updateGateway(initialGateway); diff --git a/nearx/contract/script/Upgrade.s.sol b/nearx/contract/script/Upgrade.s.sol index 505784eb..2c157ef4 100644 --- a/nearx/contract/script/Upgrade.s.sol +++ b/nearx/contract/script/Upgrade.s.sol @@ -16,7 +16,7 @@ contract Upgrade is Script { NearX proxy = NearX(payable(mostRecentlyDeployedProxy)); NearX newAddress = new NearX(); - proxy.upgradeTo(address(newAddress)); + //proxy.upgradeTo(address(newAddress)); vm.stopBroadcast(); return address(proxy); diff --git a/nearx/contract/src/NearX.sol b/nearx/contract/src/NearX.sol index c9d0e192..60ca58a0 100644 --- a/nearx/contract/src/NearX.sol +++ b/nearx/contract/src/NearX.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT -pragma solidity <0.8.20; +pragma solidity ^0.8.20; -import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@4.9.5/access/OwnableUpgradeable.sol"; -import {Initializable} from "@openzeppelin/contracts-upgradeable@4.9.5/proxy/utils/Initializable.sol"; -import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable@4.9.5/proxy/utils/UUPSUpgradeable.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import {ISuccinctGateway} from "./interfaces/ISuccinctGateway.sol"; import {INearX, TransactionOrReceiptId, ProofVerificationResult, encodePackedIds, decodePackedIds, decodePackedResults} from "./interfaces/INearX.sol"; @@ -14,8 +14,8 @@ contract NearX is INearX, Initializable, OwnableUpgradeable, UUPSUpgradeable { _disableInitializers(); } - function initialize() public initializer { - __Ownable_init(); + function initialize(address initialOwner) public initializer { + __Ownable_init(initialOwner); __UUPSUpgradeable_init(); } @@ -26,6 +26,7 @@ contract NearX is INearX, Initializable, OwnableUpgradeable, UUPSUpgradeable { {} uint32 public constant DEFAULT_GAS_LIMIT = 1000000; + uint32 public constant SYNC_GAS_LIMIT = 400000; /// @notice The address of the gateway contract. address public gateway; @@ -78,7 +79,7 @@ contract NearX is INearX, Initializable, OwnableUpgradeable, UUPSUpgradeable { abi.encodePacked(latestHeader), context, NearX.handleSync.selector, - DEFAULT_GAS_LIMIT + SYNC_GAS_LIMIT ); emit SyncRequested(latestHeader); @@ -88,11 +89,25 @@ contract NearX is INearX, Initializable, OwnableUpgradeable, UUPSUpgradeable { if (msg.sender != gateway || !ISuccinctGateway(gateway).isCallback()) { revert NotFromSuccinctGateway(msg.sender); } - // TODO: this does mean we trust the gateway, potentially we add a check here and also store heights + // TODO: this does mean we trust the gateway, potentially we add a check here and also store heights of last N headers + handleSyncOutput(_output); + } + + /// Fetches the proof result from the gateway and updates our head + function sync(bytes32 trustedHeader) external { + // TODO: do we need to ensure gateway here? + ensureInitialized(); + + bytes memory output = ISuccinctGateway(gateway).verifiedCall( + syncFunctionId, + abi.encodePacked(trustedHeader) + ); + handleSyncOutput(output); + } + function handleSyncOutput(bytes memory _output) internal { bytes32 targetHeader = abi.decode(_output, (bytes32)); - // TODO: store block height of last N packed latestHeader = targetHeader; emit HeadUpdate(targetHeader); @@ -124,6 +139,19 @@ contract NearX is INearX, Initializable, OwnableUpgradeable, UUPSUpgradeable { if (msg.sender != gateway || !ISuccinctGateway(gateway).isCallback()) { revert NotFromSuccinctGateway(msg.sender); } + handleVerifyOutput(_output); + } + + function verify(bytes32 trustedHeader, bytes calldata _ids) external { + ensureInitialized(); + bytes memory output = ISuccinctGateway(gateway).verifiedCall( + verifyFunctionId, + abi.encodePacked(trustedHeader, _ids) + ); + handleVerifyOutput(output); + } + + function handleVerifyOutput(bytes memory _output) internal { emit VerifyResult(_output); } diff --git a/nearx/contract/test/NearX.t.sol b/nearx/contract/test/NearX.t.sol index d3849cb7..409b26ee 100644 --- a/nearx/contract/test/NearX.t.sol +++ b/nearx/contract/test/NearX.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity <0.8.20; +pragma solidity ^0.8.20; import "forge-std/Test.sol"; import "../src/NearX.sol"; diff --git a/nearx/src/builder.rs b/nearx/src/builder.rs index 6e5ff9aa..b980a96b 100644 --- a/nearx/src/builder.rs +++ b/nearx/src/builder.rs @@ -1,13 +1,18 @@ -use near_light_client_protocol::{config::NUM_BLOCK_PRODUCER_SEATS, prelude::Itertools}; -use plonky2x::prelude::*; +use near_light_client_protocol::prelude::Itertools; +use plonky2x::{ + frontend::{ + curta::ec::point::CompressedEdwardsY, ecc::curve25519::ed25519::eddsa::DUMMY_PUBLIC_KEY, + }, + prelude::*, +}; use pretty_assertions::assert_eq; use crate::{ merkle::{MerklePathVariable, NearMerkleTree}, variables::{ - ApprovalMessage, BlockHeightVariable, BlockVariable, BpsApprovals, BpsArr, - BuildEndorsement, CryptoHashVariable, HeaderVariable, ProofVariable, StakeInfoVariable, - SyncedVariable, ValidatorStakeVariable, + ApprovalMessage, BlockHeightVariable, BlockVariable, BpsApprovals, BuildEndorsement, + CryptoHashVariable, HeaderVariable, ProofVariable, PublicKeyVariable, StakeInfoVariable, + Validators, }, }; @@ -24,17 +29,17 @@ pub trait Ensure, const D: usize> { epoch_id: &CryptoHashVariable, ) -> BoolVariable; - fn ensure_if_next_epoch_contains_next_bps( + fn ensure_if_next_epoch_contains_next_bps( &mut self, head: &HeaderVariable, epoch_id: &CryptoHashVariable, - next_bps: &BpsArr, + next_bps: &Validators, ) -> BoolVariable; fn validate_signatures( &mut self, approvals: &BpsApprovals, - bps: &BpsArr, + bps: &Validators, approval_message: ApprovalMessage, ) -> StakeInfoVariable; @@ -43,7 +48,7 @@ pub trait Ensure, const D: usize> { fn ensure_next_bps_is_valid( &mut self, expected_hash: &CryptoHashVariable, - next_bps_hash: Option<&CryptoHashVariable>, + next_bps_hash: &CryptoHashVariable, ) -> BoolVariable; fn ensure_block_hash_matches_outcome( @@ -96,14 +101,14 @@ impl, const D: usize> Ensure for CircuitBuilder( &mut self, head: &HeaderVariable, epoch_id: &CryptoHashVariable, - next_bps: &BpsArr, + next_bps: &Validators, ) -> BoolVariable { let is_next_epoch = self.is_equal(head.inner_lite.next_epoch_id, *epoch_id); - let is_not_empty = self.constant(next_bps.len() > 0); + let is_not_empty = self.constant(next_bps.inner.len() > 0); let ok_anyway = self._true(); self.select(is_next_epoch, is_not_empty, ok_anyway) } @@ -111,33 +116,41 @@ impl, const D: usize> Ensure for CircuitBuilder( &mut self, approvals_after_next: &BpsApprovals, - epoch_bps: &BpsArr, + epoch_bps: &Validators, approval_message: ApprovalMessage, ) -> StakeInfoVariable { assert_eq!(approvals_after_next.is_active.len(), LEN); assert_eq!(approvals_after_next.signatures.len(), LEN); - assert_eq!(epoch_bps.data.len(), LEN); + assert_eq!(epoch_bps.inner.len(), LEN); let messages = [approval_message; LEN]; + let dummy_pk = self.constant::(CompressedEdwardsY(DUMMY_PUBLIC_KEY)); + let inactive = self._false(); + let mut pubkeys = vec![]; + let mut active = vec![]; let mut total_stake = self.zero(); let mut approved_stake = self.zero(); for i in 0..LEN { - let vs = &epoch_bps.data[i]; + let vs = &epoch_bps.inner.data[i]; + + let is_dummy = self.is_equal(dummy_pk.clone(), vs.public_key.clone()); + let sig_active = approvals_after_next.is_active[i]; + let is_active = self.select(is_dummy, inactive, sig_active); pubkeys.push(vs.public_key.clone()); + active.push(is_active); - let maybe_add = self.add(approved_stake, vs.stake); - approved_stake = - self.select(approvals_after_next.is_active[i], maybe_add, approved_stake); + let added_stake = self.add(approved_stake, vs.stake); total_stake = self.add(total_stake, vs.stake); + approved_stake = self.select(is_active, added_stake, approved_stake); } // TODO: what happens if a conditionally active signature fails? self.curta_eddsa_verify_sigs_conditional( - approvals_after_next.is_active.clone(), + ArrayVariable::new(active), None, ArrayVariable::new(messages.to_vec()), approvals_after_next.signatures.clone(), @@ -163,13 +176,15 @@ impl, const D: usize> Ensure for CircuitBuilder, + next_bps_hash: &CryptoHashVariable, ) -> BoolVariable { - if let Some(next_bps) = next_bps_hash { - self.is_equal(*next_bps, *expected_hash) - } else { - self._true() - } + let zeroed = self.constant::([0u8; 32].into()); + + let is_empty = self.is_equal(*next_bps_hash, zeroed); + let is_valid = self.is_equal(*next_bps_hash, *expected_hash); + let ok_anyway = self._true(); + + self.select(is_empty, ok_anyway, is_valid) } fn ensure_block_hash_matches_outcome( @@ -233,59 +248,69 @@ impl, const D: usize> Ensure for CircuitBuilder, const D: usize> { - fn sync( + fn sync( &mut self, head: &HeaderVariable, - epoch_bps: &BpsArr, - next_block: &BlockVariable, - ) -> SyncedVariable; + epoch_bps: &Validators, + next_block: &BlockVariable, + ) -> HeaderVariable; - fn reconstruct_approval_message(&mut self, next_block: &BlockVariable) -> ApprovalMessage; + fn reconstruct_approval_message( + &mut self, + next_block: &BlockVariable, + ) -> ApprovalMessage; } impl, const D: usize> Sync for CircuitBuilder { - fn sync( + fn sync( &mut self, head: &HeaderVariable, - epoch_bps: &BpsArr, - next_block: &BlockVariable, - ) -> SyncedVariable { - let a = self.ensure_not_already_verified(head, &next_block.header.inner_lite.height); - self.assertx(a); - - let b = self.ensure_epoch_is_current_or_next(head, &next_block.header.inner_lite.epoch_id); - self.assertx(b); - - let c = self.ensure_if_next_epoch_contains_next_bps( + epoch_bps: &Validators, + next_block: &BlockVariable, + ) -> HeaderVariable { + let not_verified = + self.ensure_not_already_verified(head, &next_block.header.inner_lite.height); + self.watch(¬_verified, "ensure_not_already_verified"); + + let valid_epoch = + self.ensure_epoch_is_current_or_next(head, &next_block.header.inner_lite.epoch_id); + self.watch(&valid_epoch, "ensure_epoch_is_current_or_next"); + + let has_bps = self.ensure_if_next_epoch_contains_next_bps( head, &next_block.header.inner_lite.epoch_id, &next_block.next_bps, ); - self.assertx(c); + self.watch(&has_bps, "ensure_if_next_epoch_contains_next_bps"); let approval = self.reconstruct_approval_message(next_block); + self.watch(&approval, "reconstruct_approval_message"); let stake = self.validate_signatures(&next_block.approvals_after_next, epoch_bps, approval); - let d = self.ensure_stake_is_sufficient(&stake); - self.assertx(d); - - if next_block.next_bps.len() > 0 { - // TODO: hashing bps in circut - let e = self.ensure_next_bps_is_valid( - &next_block.header.inner_lite.next_bp_hash, - Some(&next_block.next_bps_hash), - ); - self.assertx(e); - assert!(next_block.next_bps.len() == NUM_BLOCK_PRODUCER_SEATS); - } - // FIXME: remove this, return the new head - SyncedVariable { - new_head: next_block.header.to_owned(), - next_bps_epoch: next_block.header.inner_lite.next_epoch_id, - next_bps: next_block.next_bps.to_owned(), - } + self.watch(&stake, "validate_signatures"); + let enough_stake = self.ensure_stake_is_sufficient(&stake); + self.watch(&enough_stake, "ensure_stake_is_sufficient"); + + let x = self.and(not_verified, valid_epoch); + let y = self.and(has_bps, enough_stake); + let all = self.and(x, y); + self.watch(&all, "all"); + self.assertx(all); + + // TODO: test me + let bps_valid = self.ensure_next_bps_is_valid( + &next_block.header.inner_lite.next_bp_hash, + &next_block.next_bps_hash, + ); + self.assertx(bps_valid); + assert_eq!(next_block.next_bps.inner.len(), LEN); + + next_block.header.to_owned() } - fn reconstruct_approval_message(&mut self, next_block: &BlockVariable) -> ApprovalMessage { + fn reconstruct_approval_message( + &mut self, + next_block: &BlockVariable, + ) -> ApprovalMessage { let next_header_hash = next_block.header.hash(self); let next_block_hash = self.curta_sha256_pair(next_block.next_block_inner_hash, next_header_hash); @@ -362,6 +387,7 @@ fn to_le_bytes, V: CircuitVariable, const D: usize, const #[cfg(test)] mod tests { + use near_light_client_primitives::NUM_BLOCK_PRODUCER_SEATS; use near_light_client_protocol::{Protocol, StakeInfo}; use self::assert_eq; @@ -462,7 +488,7 @@ mod tests { let define = |builder: &mut B| { let header = builder.read::(); - let next_bps = builder.read::>(); + let next_bps = builder.read::(); let current = builder.ensure_epoch_is_current_or_next(&header, &header.inner_lite.epoch_id); @@ -479,13 +505,13 @@ mod tests { builder.write::(contains_next_bps); let next_bps_hash = builder.constant::(bps_hash.0.into()); - let is_valid = builder - .ensure_next_bps_is_valid(&header.inner_lite.next_bp_hash, Some(&next_bps_hash)); + let is_valid = + builder.ensure_next_bps_is_valid(&header.inner_lite.next_bp_hash, &next_bps_hash); builder.write::(is_valid); }; let writer = |input: &mut PI| { input.write::(header.clone().into()); - input.write::>(bps_to_variable(Some(bps))); + input.write::(ValidatorsVariableValue::from_iter(bps)); }; let assertions = |mut output: PO| { assert!(output.read::(), "epoch is current"); @@ -500,12 +526,12 @@ mod tests { fn test_reconstruct_approval_msg() { let (_, _, next_block) = test_state(); let define = |builder: &mut B| { - let next_block = builder.read::(); + let next_block = builder.read::>(); let os = builder.reconstruct_approval_message(&next_block); builder.write::(os); }; let writer = |input: &mut PI| { - input.write::(next_block.clone().into()); + input.write::>(next_block.clone().into()); }; let assertions = |mut output: PO| { let created = output.read::(); @@ -519,7 +545,7 @@ mod tests { fn test_raw_le_bytes() { let (_, _, next_block) = test_state(); let define = |builder: &mut B| { - let next_block = builder.read::(); + let next_block = builder.read::>(); let mut bytes = vec![]; for target in next_block.header.inner_lite.height.targets() { @@ -538,7 +564,7 @@ mod tests { builder.write::>(BytesVariable(bytes.try_into().unwrap())); }; let writer = |input: &mut PI| { - input.write::(next_block.clone().into()); + input.write::>(next_block.clone().into()); }; let assertions = |mut output: PO| { let bytes = output.read::>(); @@ -556,6 +582,7 @@ mod tests { /// TODO: CI for only beefy tests #[cfg(test)] mod beefy_tests { + use near_light_client_primitives::NUM_BLOCK_PRODUCER_SEATS; use serial_test::serial; use crate::{ @@ -573,7 +600,7 @@ mod beefy_tests { let define = |builder: &mut B| { let header = builder.read::(); - let next_bps = builder.read::>(); + let next_bps = builder.read::(); let current = builder.ensure_epoch_is_current_or_next(&header, &header.inner_lite.epoch_id); @@ -590,13 +617,13 @@ mod beefy_tests { builder.write::(contains_next_bps); let next_bps_hash = builder.constant::(bps_hash.0.into()); - let is_valid = builder - .ensure_next_bps_is_valid(&header.inner_lite.next_bp_hash, Some(&next_bps_hash)); + let is_valid = + builder.ensure_next_bps_is_valid(&header.inner_lite.next_bp_hash, &next_bps_hash); builder.write::(is_valid); }; let writer = |input: &mut PI| { input.write::(header.clone().into()); - input.write::>(bps_to_variable(Some(bps))); + input.write::(ValidatorsVariableValue::from_iter(bps)); }; let assertions = |mut output: PO| { assert!(output.read::(), "epoch is current"); @@ -642,19 +669,22 @@ mod beefy_tests { let define = |builder: &mut B| { let head = builder.read::(); - let bps = builder.read::>(); - let next_block = builder.read::(); + let bps = builder.read::(); + let next_block = builder.read::>(); let synced = builder.sync(&head, &bps, &next_block); - builder.write::(synced); + builder.write::(synced); }; let writer = |input: &mut PI| { input.write::(head.into()); - input.write::>(bps_to_variable(Some(next_bps))); - input.write::(next_block.clone().into()); + input.write::>( + ValidatorsVariableValue::from_iter(next_bps), + ); + input.write::>(next_block.clone().into()); }; let assertions = |mut output: PO| { - let header = output.read::(); + let header = output.read::(); println!("header: {:?}", header); + // TODO: assert }; builder_suite(define, writer, assertions); } @@ -665,18 +695,17 @@ mod beefy_tests { fn beefy_builder_test_bounded_signatures() { let (_, bps, next_block) = test_state(); const BPS_AMT: usize = 15; + let r = 0..BPS_AMT; let define = |builder: &mut B| { - let bps = builder.read::>(); - let next_block = builder.read::(); + let bps = builder.read::>(); + let next_block = builder.read::>(); let next_block_approvals = BpsApprovals { - signatures: next_block.approvals_after_next.signatures[0..BPS_AMT] - .to_vec() - .into(), - is_active: next_block.approvals_after_next.is_active[0..BPS_AMT] + signatures: next_block.approvals_after_next.signatures[r.clone()] .to_vec() .into(), + is_active: next_block.approvals_after_next.is_active[r].to_vec().into(), }; let msg = builder.reconstruct_approval_message(&next_block); @@ -684,10 +713,8 @@ mod beefy_tests { builder.validate_signatures(&next_block_approvals, &bps, msg); }; let writer = |input: &mut PI| { - input.write::>( - bps_to_variable(Some(bps.clone()))[0..BPS_AMT].into(), - ); - input.write::(next_block.into()); + input.write::>(bps.into_iter().collect()); + input.write::>(next_block.into()); }; let assertions = |mut _output: PO| {}; builder_suite(define, writer, assertions); diff --git a/nearx/src/config.rs b/nearx/src/config.rs new file mode 100644 index 00000000..5adefb44 --- /dev/null +++ b/nearx/src/config.rs @@ -0,0 +1,99 @@ +use near_light_client_rpc::Network; + +#[const_trait] +pub trait Config: std::fmt::Debug + Clone + PartialEq + Sync + Send + 'static { + const NETWORK: Network; + const BPS: usize; + + const VERIFY_AMT: usize; + const VERIFY_BATCH: usize; +} + +// TODO: Decide if we should always "bake in" the constants here at build time, +// since it requires a build to fix anyway. If the protocol config is changed +// then we would need to rebuild. +// +// We might also need additional measures to be able to handle this, likely we +// need to dynamically allocate the constants at runtime since verifying blocks +// in the past will not be valid for all protocol configurations. +// +// Maybe we just have 3 circuits, (fast, slow and very slow) and use them +// dynamically via the operator? +#[derive(Debug, Clone, PartialEq)] +pub struct Testnet; +impl const Config for Testnet { + const NETWORK: Network = Network::Testnet; + const BPS: usize = 20; // EXPERIMENTAL_protocol_config::num_block_producer_seats + + const VERIFY_AMT: usize = 64; + const VERIFY_BATCH: usize = 4; +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Mainnet; +impl const Config for Mainnet { + const NETWORK: Network = Network::Mainnet; + const BPS: usize = 100; + + const VERIFY_AMT: usize = 128; + const VERIFY_BATCH: usize = 4; +} + +#[derive(Debug, Clone, PartialEq)] +pub struct CustomBatchNumConfig(); +impl const Config for CustomBatchNumConfig<{ A }, { B }> { + const NETWORK: near_light_client_rpc::Network = Testnet::NETWORK; + const BPS: usize = Testnet::BPS; + const VERIFY_AMT: usize = A; + const VERIFY_BATCH: usize = B; +} + +pub fn bps_from_network(n: &near_light_client_rpc::Network) -> usize { + match n { + near_light_client_rpc::Network::Mainnet => Mainnet::BPS, + near_light_client_rpc::Network::Testnet => Testnet::BPS, + _ => todo!("Unsupported"), + } +} + +cfg_if::cfg_if! { + if #[cfg(test)] { + #[derive(Debug, Clone, PartialEq)] + pub struct FixturesConfig(std::marker::PhantomData); + impl const Config for FixturesConfig { + const NETWORK: Network = T::NETWORK; + const BPS: usize = B; + const VERIFY_AMT: usize = T::VERIFY_AMT; + const VERIFY_BATCH: usize = T::VERIFY_BATCH; + } + } +} + +#[cfg(test)] +mod tests { + use near_light_client_rpc::{LightClientRpc, NearRpcClient}; + + use super::*; + + async fn check_config() { + let client = NearRpcClient::new(&(Config::NETWORK.into())); + let to_check = near_light_client_rpc::BlockReference::latest(); + + let config = client.fetch_protocol_config(&to_check).await.unwrap(); + assert_eq!( + config.num_block_producer_seats as usize, + Config::BPS, + "BPS mismatch with circuit config, update the config!" + ); + } + + #[tokio::test] + async fn test_verify_testnet_config() { + check_config::().await + } + + #[tokio::test] + async fn test_verify_mainnet_config() { + check_config::().await + } +} diff --git a/nearx/src/hint.rs b/nearx/src/hint.rs index a6958aff..2740c534 100644 --- a/nearx/src/hint.rs +++ b/nearx/src/hint.rs @@ -1,114 +1,213 @@ -use std::collections::HashMap; +use std::{collections::HashMap, marker::PhantomData}; use async_trait::async_trait; -use log::debug; -use near_light_client_protocol::{prelude::CryptoHash, Proof}; -use near_light_client_rpc::{prelude::GetProof, LightClientRpc, NearRpcClient, Network}; -use plonky2x::{frontend::hint::asynchronous::hint::AsyncHint, prelude::*}; +use ethers::utils::hex; +use log::{debug, trace}; +use near_light_client_protocol::{prelude::CryptoHash, Proof, ValidatorStake}; +use near_light_client_rpc::{ + prelude::{GetProof, Itertools}, + LightClientRpc, NearRpcClient, Network, +}; +use plonky2x::{ + frontend::hint::asynchronous::hint::AsyncHint, + prelude::{plonky2::field::types::PrimeField64, *}, +}; use serde::{Deserialize, Serialize}; -use crate::variables::{ - normalise_account_id, BlockVariable, CryptoHashVariable, HeaderVariable, ProofVariable, - TransactionOrReceiptIdVariable, +use crate::{ + config::Config, + variables::{ + normalise_account_id, BlockVariable, BlockVariableValue, CryptoHashVariable, HashBpsInputs, + HeaderVariable, ProofVariable, TransactionOrReceiptIdVariable, Validators, + ValidatorsVariableValue, + }, }; #[derive(Debug, Clone, Deserialize, Serialize)] -pub struct FetchNextHeaderInputs(pub Network); +pub struct InputFetcher(pub PhantomData); + +impl Default for InputFetcher { + fn default() -> Self { + Self(Default::default()) + } +} #[async_trait] -impl, const D: usize> AsyncHint for FetchNextHeaderInputs { +impl, const D: usize, C: Config> AsyncHint for InputFetcher +where + [(); C::BPS]:, +{ async fn hint( &self, input_stream: &mut ValueStream, output_stream: &mut ValueStream, ) { - let client = NearRpcClient::new(self.0); + let client = NearRpcClient::new(&C::NETWORK.into()); - let h = input_stream.read_value::().0; + let marker: L::Field = input_stream.read_value::(); + let marker = marker.to_canonical_u64(); + debug!("Marker: {}", marker); + match marker { + 0 => { + let trusted_header_hash = input_stream.read_value::().0; - let next = client - .fetch_latest_header(&CryptoHash(h)) - .await - .expect("Failed to fetch header") - .expect("Expected a header"); + let trusted_header = client + .fetch_header(&CryptoHash(trusted_header_hash)) + .await + .expect("Failed to fetch header"); + debug!("Fetched header: {:#?}", trusted_header); + + // This is a very interesting trick to be able to get the BPS for the next epoch + // without the need to store the BPS, we verify the hash of the BPS in the + // circuit + let bps = client + .fetch_latest_header(&trusted_header.inner_lite.next_epoch_id) + .await + .expect("Failed to fetch bps") + .expect("Expected a header") + .next_bps + .expect("Expected bps for the trusted header") + .into_iter() + .map(Into::::into) + .collect_vec(); + trace!("Fetched next epoch bps: {:?}", bps); + debug!( + "Next epoch bps hash {}, len: {}", + CryptoHash::hash_borsh(bps.clone()), + bps.len() + ); + + let next_block = client + .fetch_latest_header(&CryptoHash(trusted_header_hash)) + .await + .expect("Failed to fetch next block") + // FIXME: this will cause issues syncing if there is no block + .expect("Expected a next_block"); + + // Test the protocol with the offchain protocol. + near_light_client_protocol::Protocol::sync( + &trusted_header, + &bps, + next_block.clone(), + ) + .expect("Offchain protocol verification failed"); + + let bps_var = ValidatorsVariableValue::from_iter(bps); + let next_block_var: BlockVariableValue<{ C::BPS }, L::Field> = next_block.into(); + + next_block_var + .approvals_after_next + .is_active + .iter() + .zip(next_block_var.approvals_after_next.signatures.iter()) + .enumerate() + .for_each(|(i, (x, y))| { + trace!( + "bps({i}): {:?} sig: {:?} active: {:?}", + hex::encode(bps_var.inner[i].public_key.0), + hex::encode(y.r.0), + x + ); + }); + + output_stream.write_value::(trusted_header.into()); + output_stream.write_value::>(bps_var); + output_stream.write_value::>(next_block_var); + } + 1 => { + let trusted_header_hash = input_stream.read_value::().0; - output_stream.write_value::(next.into()); + let trusted_header = client + .fetch_header(&CryptoHash(trusted_header_hash)) + .await + .expect("Failed to fetch header"); + debug!("Fetched header: {:#?}", trusted_header); + output_stream.write_value::(trusted_header.into()); + } + _ => panic!("Invalid marker"), + } } } -impl FetchNextHeaderInputs { - pub fn fetch, const D: usize>( +impl InputFetcher +where + [(); C::BPS]:, +{ + pub fn fetch_sync, const D: usize>( &self, b: &mut CircuitBuilder, - hash: &CryptoHashVariable, - ) -> Option { + trusted_header_hash: &CryptoHashVariable, + ) -> ( + HeaderVariable, + Validators<{ C::BPS }>, + BlockVariable<{ C::BPS }>, + ) { + b.watch(trusted_header_hash, "fetch_sync: trusted_header_hash"); + let mut input_stream = VariableStream::new(); - input_stream.write::(hash); + input_stream.write::(&b.constant(L::Field::from_canonical_u64(0))); + input_stream.write::(trusted_header_hash); let output_stream = b.async_hint(input_stream, self.clone()); - Some(output_stream.read::(b)) - } -} -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct FetchHeaderInputs(pub Network); + let untrusted_header = output_stream.read::(b); + let untrusted_header_hash = untrusted_header.hash(b); + b.watch(&untrusted_header_hash, "fetch_sync: untrusted_header_hash"); + b.assert_is_equal(untrusted_header_hash, *trusted_header_hash); + let header = untrusted_header; -#[async_trait] -impl, const D: usize> AsyncHint for FetchHeaderInputs { - async fn hint( - &self, - input_stream: &mut ValueStream, - output_stream: &mut ValueStream, - ) { - let client = NearRpcClient::new(self.0); - - let h = input_stream.read_value::().0; - - let header = client - .fetch_header(&CryptoHash(h)) - .await - .expect("Failed to fetch header"); + let bps = output_stream.read::>(b); + let bps_hash = HashBpsInputs::<{ C::BPS }>.hash(b, &bps); + b.watch( + &header.inner_lite.next_bp_hash, + "fetch_sync: header.next_bp_hash", + ); + b.watch(&bps_hash, "fetch_sync: calculate_bps_hash"); + b.assert_is_equal(header.inner_lite.next_bp_hash, bps_hash); - output_stream.write_value::(header.into()); + let next_block = output_stream.read::>(b); + (header, bps, next_block) } -} -impl FetchHeaderInputs { - /// Fetches a header based on its known hash and witnesses the result. - pub fn fetch, const D: usize>( + pub fn fetch_verify, const D: usize>( &self, b: &mut CircuitBuilder, - trusted_hash: &CryptoHashVariable, + trusted_header_hash: &CryptoHashVariable, ) -> HeaderVariable { let mut input_stream = VariableStream::new(); - input_stream.write::(trusted_hash); - + input_stream.write::(&b.constant(L::Field::from_canonical_u64(1))); + input_stream.write::(trusted_header_hash); let output_stream = b.async_hint(input_stream, self.clone()); - let untrusted = output_stream.read::(b); - let untrusted_hash = untrusted.hash(b); - b.assert_is_equal(*trusted_hash, untrusted_hash); - untrusted + + let untrusted_header = output_stream.read::(b); + let untrusted_header_hash = untrusted_header.hash(b); + b.watch(&untrusted_header_hash, "untrusted_header_hash"); + // Build trust in the header by hashing, ensuring equality + b.assert_is_equal(untrusted_header_hash, untrusted_header_hash); + + untrusted_header } } + // TODO: refactor into some client-like carrier for all hints that is serdeable #[derive(Debug, Clone, Deserialize, Serialize)] -pub struct FetchProofInputs(pub Network); +pub struct FetchProofInputs(pub Network); #[async_trait] -impl, const D: usize, const B: usize> AsyncHint - for FetchProofInputs +impl, const D: usize, const N: usize> AsyncHint + for FetchProofInputs { async fn hint( &self, input_stream: &mut ValueStream, output_stream: &mut ValueStream, ) { - let client = NearRpcClient::new(self.0); + let client = NearRpcClient::new(&self.0.into()); let block_merkle_root = input_stream.read_value::().0; let last_verified = input_stream.read_value::().0; let mut reqs = vec![]; - for _ in 0..B { + for _ in 0..N { let tx = input_stream.read_value::(); reqs.push(if tx.is_transaction { GetProof::Transaction { @@ -140,7 +239,7 @@ impl, const D: usize, const B: usize> AsyncHint .collect::>(); debug!("Fetched {} proofs", proofs.len()); - assert_eq!(proofs.len(), B, "Invalid number of proofs"); + assert_eq!(proofs.len(), N, "Invalid number of proofs"); for (k, p) in proofs.into_iter() { output_stream.write_value::(k.0.into()); @@ -187,31 +286,101 @@ pub struct ProofInputVariable { #[cfg(test)] mod tests { + use super::*; use crate::{ - test_utils::{builder_suite, test_state, B, PI, PO}, + config::{self, FixturesConfig}, + test_utils::{builder_suite, test_state, testnet_state, B, PI, PO}, variables::{BlockVariableValue, HeaderVariable}, }; + type Testnet = FixturesConfig; + type _Mainnet = FixturesConfig; + #[test] fn test_fetch_header() { - let (header, _, nb) = test_state(); + let (main_h, _, main_nb) = test_state(); + let (test_h, _, test_nb) = testnet_state(); + + type Mainnet = FixturesConfig; let define = |b: &mut B| { - let header = b.read::(); - let hash = header.hash(b); - let next_block = - FetchNextHeaderInputs(near_light_client_rpc::Network::Mainnet).fetch(b, &hash); - b.write::(next_block.unwrap()); + test_fetch_data::(b); + test_fetch_data::(b); }; + let writer = |input: &mut PI| { - input.write::(header.into()); + input.write::(main_h.into()); + input.write::(test_h.into()); }; + let assertions = |mut output: PO| { - let inputs = output.read::(); - let nbh: BlockVariableValue = nb.into(); + let inputs = output.read::>(); + let nbh: BlockVariableValue<{ Mainnet::BPS }, GoldilocksField> = main_nb.into(); + pretty_assertions::assert_eq!(format!("{:#?}", inputs), format!("{:#?}", nbh)); + + let inputs = output.read::>(); + let nbh: BlockVariableValue<{ Testnet::BPS }, GoldilocksField> = test_nb.into(); pretty_assertions::assert_eq!(format!("{:#?}", inputs), format!("{:#?}", nbh)); }; builder_suite(define, writer, assertions); } + + // This is a compiler bug because we use the [();BPS] syntax to constrain the + // const generic + #[allow(unused)] + fn test_fetch_data(b: &mut CircuitBuilder) + where + C: Config, + [(); C::BPS]:, + { + let header = b.read::(); + let trusted_header_hash = header.hash(b); + + let (_header, _bps, next_block) = + InputFetcher::(Default::default()).fetch_sync(b, &trusted_header_hash); + b.write::>(next_block); + } + + // TODO: turns out this resolved itself on live after 2 weeks without doing + // anything, probably platform issue #[test] + // fn test_fetch_corner_cases() { + // let corner_cases = [ + // // This is the current investigated one + // bytes32!(" + // 0x84ebac64b1fd5809ac2c19193100c7e346b765b98a6e3f6de3e40b7d12d3425e"), + // ]; + // let fetcher = InputFetcher::(Default::default()); + + // let define = |b: &mut B| { + // for _ in corner_cases { + // let h = b.read::(); + + // let (header, bps, next_block) = fetcher.fetch_sync(b, &h); + + // b.write::(header.clone()); + // b.write::>(bps.clone()); + // b.write::>(next_block.clone()); + + // // let approval = + // b.reconstruct_approval_message(&next_block); // + // b.validate_signatures(&next_block.approvals_after_next, &bps, + // // approval); + // } + // }; + // let writer = |input: &mut PI| { + // for hash in corner_cases { + // input.write::(hash); + // } + // }; + // let assertions = |mut output: PO| { + // for _hash in corner_cases { + // let _header = output.read::(); + // let _bps = output.read::>(); let _nb = output.read::>(); } + // // TODO: assert on these + // }; + // builder_suite(define, writer, assertions); + // } } diff --git a/nearx/src/lib.rs b/nearx/src/lib.rs index b0aadd34..33d432b8 100644 --- a/nearx/src/lib.rs +++ b/nearx/src/lib.rs @@ -1,3 +1,8 @@ +#![feature(generic_const_exprs)] +#![allow(incomplete_features)] +#![feature(generic_arg_infer)] +#![feature(const_trait_impl)] + pub use plonky2x::{self, backend::circuit::Circuit, prelude::*}; pub use sync::SyncCircuit; pub use verify::VerifyCircuit; @@ -15,3 +20,56 @@ pub mod verify; #[cfg(test)] mod test_utils; + +pub mod config; + +#[cfg(test)] +mod beefy_tests { + use log::logger; + use serial_test::serial; + + use super::*; + use crate::config::Testnet; + + #[test] + #[serial] + #[ignore] + fn sync_serialization() { + logger(); + + let mut builder = DefaultBuilder::new(); + + log::debug!("Defining circuit"); + SyncCircuit::::define(&mut builder); + let circuit = builder.build(); + log::debug!("Done building circuit"); + + let mut hint_registry = HintRegistry::new(); + let mut gate_registry = GateRegistry::new(); + SyncCircuit::::register_generators(&mut hint_registry); + SyncCircuit::::register_gates(&mut gate_registry); + + circuit.test_serializers(&gate_registry, &hint_registry); + } + + #[test] + #[serial] + #[ignore] + fn verify_serialization() { + logger(); + + let mut builder = DefaultBuilder::new(); + + log::debug!("Defining circuit"); + VerifyCircuit::::define(&mut builder); + let circuit = builder.build(); + log::debug!("Done building circuit"); + + let mut hint_registry = HintRegistry::new(); + let mut gate_registry = GateRegistry::new(); + VerifyCircuit::::register_generators(&mut hint_registry); + VerifyCircuit::::register_gates(&mut gate_registry); + + circuit.test_serializers(&gate_registry, &hint_registry); + } +} diff --git a/nearx/src/main.rs b/nearx/src/main.rs index a46d3e2e..e938547f 100644 --- a/nearx/src/main.rs +++ b/nearx/src/main.rs @@ -1,26 +1,24 @@ -#[cfg(any(feature = "sync", feature = "verify"))] -use near_light_clientx::plonky2x::backend::function::Plonky2xFunction; +#![allow(unused_imports)] +use near_light_clientx::{ + config::{Config, Mainnet, Testnet}, + plonky2x::backend::function::Plonky2xFunction, +}; -// Testnet, FIXME: this is error prone, use something else -#[allow(dead_code)] -const NETWORK: usize = 1; - -// TODO: make this use a nicer API for use by the prover. -// TODO: perpetually sync, use queue etc fn main() { + #[allow(dead_code)] + type Conf = Testnet; + cfg_if::cfg_if! { if #[cfg(feature = "sync")] { use near_light_clientx::SyncCircuit; - SyncCircuit::::entrypoint(); + SyncCircuit::::entrypoint(); } else if #[cfg(feature = "verify")] { - const PROOF_AMT: usize = 128; - const PROOF_BATCH_SIZE: usize = 4; - assert!(PROOF_AMT % PROOF_BATCH_SIZE == 0); - assert!((PROOF_AMT / PROOF_BATCH_SIZE).is_power_of_two()); + assert!(Conf::VERIFY_AMT % Conf::VERIFY_BATCH == 0); + assert!((Conf::VERIFY_AMT / Conf::VERIFY_BATCH).is_power_of_two()); use near_light_clientx::VerifyCircuit; - VerifyCircuit::::entrypoint(); + VerifyCircuit::::entrypoint(); } else { panic!("No circuit feature enabled"); } diff --git a/nearx/src/sync.rs b/nearx/src/sync.rs index b0fc65a4..a2b96383 100644 --- a/nearx/src/sync.rs +++ b/nearx/src/sync.rs @@ -1,9 +1,16 @@ +use std::marker::PhantomData; + +use plonky2x::register_watch_generator; pub use plonky2x::{self, backend::circuit::Circuit, prelude::*}; use crate::{ builder::Sync, - hint::{FetchHeaderInputs, FetchNextHeaderInputs}, - variables::{BuildEndorsement, CryptoHashVariable, EncodeInner, HashBpsInputs}, + config::Config, + hint::InputFetcher, + variables::{ + ApprovalMessage, BuildEndorsement, CryptoHashVariable, EncodeInner, HashBpsInputs, + StakeInfoVariable, + }, }; // TODO: lazy sync @@ -12,42 +19,28 @@ use crate::{ // differences between protocol crate // TODO: determine fees, allows integrators to charge #[derive(Debug, Clone)] -pub struct SyncCircuit; +pub struct SyncCircuit(PhantomData); -impl Circuit for SyncCircuit { +impl Circuit for SyncCircuit +where + [(); T::BPS]:, +{ fn define, const D: usize>(b: &mut CircuitBuilder) where <>::Config as plonky2::plonk::config::GenericConfig>::Hasher: plonky2::plonk::config::AlgebraicHasher<>::Field>, { - let network = NETWORK.into(); - let fetch_header = FetchHeaderInputs(network); - let fetch_next_header = FetchNextHeaderInputs(network); + let fetcher = InputFetcher::::default(); // TODO: we do need to be defensive to ensure that this is actually the trusted // header hash, do not allow anybody to provide this input. let trusted_header_hash = b.evm_read::(); - // This is a very interesting trick to be able to get the BPS for the next epoch - // without the need to store the BPS, we verify the hash of the BPS in the - // circuit - let header = fetch_header.fetch(b, &trusted_header_hash); - let bps = fetch_next_header - .fetch(b, &header.inner_lite.next_epoch_id) - .unwrap() - .next_bps; - - let bps_hash = HashBpsInputs.hash(b, &bps); - b.assert_is_equal(header.inner_lite.next_bp_hash, bps_hash); - b.watch(&bps_hash, "calculate_bps_hash"); - - let next_block = fetch_next_header - .fetch(b, &trusted_header_hash) - .expect("Failed to fetch next block"); - - let synced = b.sync(&header, &bps, &next_block); - let synced_hash = synced.new_head.hash(b); - b.evm_write::(synced_hash); + let (header, bps, next_block) = fetcher.fetch_sync(b, &trusted_header_hash); + + let new_head = b.sync(&header, &bps, &next_block); + let new_hash = new_head.hash(b); + b.evm_write::(new_hash); } fn register_generators, const D: usize>(registry: &mut HintRegistry) @@ -55,30 +48,40 @@ impl Circuit for SyncCircuit { <>::Config as plonky2::plonk::config::GenericConfig>::Hasher: plonky2::plonk::config::AlgebraicHasher, { - registry.register_async_hint::(); - registry.register_async_hint::(); + registry.register_async_hint::>(); registry.register_hint::(); registry.register_hint::(); - registry.register_hint::(); + registry.register_hint::>(); + + register_watch_generator!(registry, L, D, ApprovalMessage, StakeInfoVariable); } } #[cfg(test)] mod beefy_tests { + use std::str::FromStr; + use serial_test::serial; + use test_utils::CryptoHash; use super::*; - use crate::test_utils::{builder_suite, testnet_state, B, NETWORK, PI, PO}; + use crate::{ + config::{self, FixturesConfig}, + test_utils::{builder_suite, testnet_state, B, PI, PO}, + }; + + type Testnet = FixturesConfig; + type _Mainnet = FixturesConfig; #[test] #[serial] #[ignore] - fn sync_e2e() { + fn sync_e2e_testnet() { let (header, _, _) = testnet_state(); let header = header.hash().0; let define = |b: &mut B| { - SyncCircuit::::define(b); + super::SyncCircuit::::define(b); }; let writer = |input: &mut PI| { input.evm_write::(header.into()); @@ -89,4 +92,97 @@ mod beefy_tests { }; builder_suite(define, writer, assertions); } + + // #[test] + // #[serial] + // #[ignore] + // fn sync_e2e_mainnet() { + // let (header, _, _) = mainnet_state(); + // let header = header.hash().0; + + // let define = |b: &mut B| { + // super::SyncCircuit::::define(b); + // }; + // let writer = |input: &mut PI| { + // input.evm_write::(header.into()); + // }; + // let assertions = |mut output: PO| { + // let hash = output.evm_read::(); + // println!("hash: {:?}", hash); + // }; + // builder_suite(define, writer, assertions); + // } + + #[test] + #[serial] + #[ignore] + fn sync_e2e_too_little_bps() { + // Previously BPS were roughly 30-35, but this one had 52, they're now set to + // protocol config amt for NUM_BPS_SEATS, although this is never really + // this amount in practise + let h = bytes32!("0x84ebac64b1fd5809ac2c19193100c7e346b765b98a6e3f6de3e40b7d12d3425e"); + + let define = |b: &mut B| { + SyncCircuit::>::define(b); + }; + let writer = |input: &mut PI| { + input.evm_write::(h); + }; + let assertions = |_output: PO| {}; + builder_suite(define, writer, assertions); + } + + #[test] + #[serial] + #[ignore] + fn sync_e2e_mismatch_signatures() { + // This test was a proof where there were appended BPS, the bug was the + // signature was active, but dummy BPS from the LC protocol + let h = bytes32!("0x6fd201bb6c09c3708793945be6d5e2c3dc8c9fcf65e9e3ccf81d4720735e5fe6"); + + let define = |b: &mut B| { + SyncCircuit::::define(b); + }; + let writer = |input: &mut PI| { + input.evm_write::(h); + }; + let assertions = |_output: PO| {}; + builder_suite(define, writer, assertions); + } + + #[test] + #[serial] + #[ignore] + fn sync_e2e_protocol_size() { + let h = CryptoHash::from_str("HV17CCRTmamtfaWRwaHN673gtr5miW6WQxnKKqk5ELEY").unwrap(); + + let define = |b: &mut B| { + SyncCircuit::::define(b); + }; + let writer = |input: &mut PI| { + input.evm_write::(h.0.into()); + }; + let assertions = |mut output: PO| { + let hash = output.evm_read::(); + println!("hash: {:?}", hash); + }; + builder_suite(define, writer, assertions); + } + + #[test] + #[serial] + #[ignore] + fn sync_e2e_latest_corner_case() { + // TODO: this is a new test with a corner case + let h = bytes32!("0x312a16eef866d75e9da24a5c65ce8b98597d5a903ef643018e144b8543c37a8b"); + + let define = |b: &mut B| { + SyncCircuit::::define(b); + }; + let writer = |input: &mut PI| { + input.evm_write::(h); + }; + let assertions = |_output: PO| {}; + builder_suite(define, writer, assertions); + } } diff --git a/nearx/src/test_utils.rs b/nearx/src/test_utils.rs index 1893ca27..0626d451 100644 --- a/nearx/src/test_utils.rs +++ b/nearx/src/test_utils.rs @@ -9,9 +9,6 @@ pub use plonky2x::{ }; pub use test_utils::*; -// Testnet Repr -pub const NETWORK: usize = 1; - pub type B = CircuitBuilder; pub type PI = PublicInput; pub type PO = PublicOutput; diff --git a/nearx/src/variables.rs b/nearx/src/variables.rs index c3644dd1..b3b0acb3 100644 --- a/nearx/src/variables.rs +++ b/nearx/src/variables.rs @@ -1,16 +1,20 @@ use ethers::types::U256; use log::{debug, trace}; +use near_light_client_primitives::{ + pad_account_bytes, pad_account_id, ACCOUNT_DATA_SEPARATOR, NUM_BLOCK_PRODUCER_SEATS, +}; use near_light_client_protocol::{ - config::{ACCOUNT_DATA_SEPARATOR, NUM_BLOCK_PRODUCER_SEATS}, prelude::{AccountId, CryptoHash, Header, Itertools}, BlockHeaderInnerLiteView, ED25519PublicKey, LightClientBlockView, Proof, PublicKey, Signature, - StakeInfo, Synced, ValidatorStake, ValidatorStakeView, ValidatorStakeViewV1, + StakeInfo, ValidatorStake, ValidatorStakeView, ValidatorStakeViewV1, }; use near_light_client_rpc::prelude::GetProof; use plonky2x::{ frontend::{ curta::ec::point::{CompressedEdwardsY, CompressedEdwardsYVariable}, - ecc::curve25519::ed25519::eddsa::{EDDSASignatureVariable, EDDSASignatureVariableValue}, + ecc::curve25519::ed25519::eddsa::{ + EDDSASignatureVariable, EDDSASignatureVariableValue, DUMMY_PUBLIC_KEY, DUMMY_SIGNATURE, + }, hint::simple::hint::Hint, vars::EvmVariable, }, @@ -22,10 +26,10 @@ use serde::{Deserialize, Serialize}; use crate::merkle::MerklePathVariable; // TODO: remove any unused fields like account id etc? -/// TODO: check if BPS seats changes for testnet/mainnet /// Type for omitting the size across the codebase for arrays that are the same /// size as BPS +pub(crate) type Validators = ValidatorsVariable; pub(crate) type BpsArr = ArrayVariable; pub type CryptoHashVariable = Bytes32Variable; @@ -160,7 +164,6 @@ impl HeaderInnerVariable { &self, b: &mut CircuitBuilder, ) -> BytesVariable { - // TODO: doubt we can abi encode this let mut input_stream = VariableStream::new(); input_stream.write(&self.height); input_stream.write(&self.epoch_id); @@ -183,6 +186,7 @@ impl HeaderInnerVariable { b.curta_sha256(&bytes.0) } } + impl EvmVariable for HeaderInnerVariable { fn encode, const D: usize>( &self, @@ -308,17 +312,16 @@ impl, const D: usize> Hint for EncodeInner { } #[derive(CircuitVariable, Clone, Debug)] -pub struct BlockVariable { +pub struct BlockVariable { pub header: HeaderVariable, pub next_block_inner_hash: CryptoHashVariable, - pub next_bps: BpsArr, - pub approvals_after_next: BpsApprovals, + pub next_bps: Validators, + pub approvals_after_next: BpsApprovals, pub next_bps_hash: CryptoHashVariable, } -impl From for BlockVariableValue { +impl From for BlockVariableValue { fn from(block: LightClientBlockView) -> Self { - // TODO[Optimisation]: Constrain these in-circuit let next_bps_hash = block .next_bps .as_ref() @@ -330,19 +333,16 @@ impl From for BlockVariableValue { let variable = Self { next_block_inner_hash: block.next_block_inner_hash.0.into(), header: block.clone().into(), - next_bps: bps_to_variable(block.next_bps), + next_bps: block + .next_bps + .map(|bps| bps.into_iter().collect()) + .unwrap_or_default(), approvals_after_next: block.approvals_after_next.into(), next_bps_hash, }; - assert_eq!(variable.next_bps.len(), NUM_BLOCK_PRODUCER_SEATS); - assert_eq!( - variable.approvals_after_next.is_active.len(), - NUM_BLOCK_PRODUCER_SEATS - ); - assert_eq!( - variable.approvals_after_next.signatures.len(), - NUM_BLOCK_PRODUCER_SEATS - ); + assert_eq!(variable.next_bps.inner.len(), LEN); + assert_eq!(variable.approvals_after_next.is_active.len(), LEN); + assert_eq!(variable.approvals_after_next.signatures.len(), LEN); variable } } @@ -376,31 +376,14 @@ impl From>>> } } -pub(crate) fn bps_to_variable>( - next_bps: Option>, -) -> Vec> { - next_bps - .map(|next_bps| { - let mut bps = next_bps - .into_iter() - .take(NUM_BLOCK_PRODUCER_SEATS) - .map(Into::::into) - .map(Into::>::into) - .collect_vec(); - bps.resize(NUM_BLOCK_PRODUCER_SEATS, Default::default()); - bps - }) - .unwrap_or_else(|| vec![Default::default(); NUM_BLOCK_PRODUCER_SEATS]) -} - #[derive(CircuitVariable, Clone, Debug)] pub struct ValidatorStakeVariable { + // TODO[optimisation]: can optimise this out by witnessing the hash pub account_id: AccountIdVariable, pub public_key: PublicKeyVariable, pub stake: BalanceVariable, } -const ACCOUNT_ID_PADDING_BYTE: u8 = ACCOUNT_DATA_SEPARATOR; impl From for ValidatorStakeVariableValue { fn from(vs: ValidatorStake) -> Self { let public_key = CompressedEdwardsY(vs.public_key().unwrap_as_ed25519().0); @@ -414,31 +397,10 @@ impl From for ValidatorStakeVariableValue { } } -pub(crate) fn pad_account_id(account_id: &AccountId) -> [u8; AccountId::MAX_LEN] { - let account_id = account_id.as_str().as_bytes().to_vec(); - pad_account_bytes(account_id) -} - -pub(crate) fn pad_account_bytes(mut account_id: Vec) -> [u8; AccountId::MAX_LEN] { - account_id.resize(AccountId::MAX_LEN, ACCOUNT_ID_PADDING_BYTE); - account_id.try_into().expect("invalid account bytes") -} - -pub(crate) fn normalise_account_id( - account_id: &AccountIdVariableValue, -) -> AccountId { - let unpadded_bytes = account_id - .split(|x| *x == ACCOUNT_ID_PADDING_BYTE) - .collect_vec()[0]; - let account_str = String::from_utf8(unpadded_bytes.to_vec()).expect("invalid account bytes"); - trace!("account id: {}", account_str); - account_str.parse().expect("invalid account id") -} - impl From> for ValidatorStakeView { fn from(val: ValidatorStakeVariableValue) -> Self { - let account_id = normalise_account_id::(&val.account_id); let public_key = PublicKey::ED25519(ED25519PublicKey(val.public_key.0)); + let account_id = normalise_account_id::(&val.account_id); ValidatorStakeView::V1(ValidatorStakeViewV1 { account_id, public_key, @@ -447,10 +409,38 @@ impl From> for ValidatorStakeView { } } +#[derive(CircuitVariable, Clone, Debug)] +pub struct ValidatorsVariable { + pub(crate) inner: BpsArr, +} + +impl, const N: usize> FromIterator + for ValidatorsVariableValue +{ + fn from_iter>(iter: T) -> Self { + let mut bps = iter + .into_iter() + .take(N) + .map(Into::::into) + .map(Into::>::into) + .collect_vec(); + bps.resize(N, Default::default()); + Self { inner: bps } + } +} + +impl Default for ValidatorsVariableValue { + fn default() -> Self { + Self { + inner: vec![Default::default(); N], + } + } +} + impl Default for ValidatorStakeVariableValue { fn default() -> Self { - let account_id: [u8; AccountId::MAX_LEN] = [0u8; AccountId::MAX_LEN]; - let public_key = CompressedEdwardsY::default(); + let account_id: [u8; AccountId::MAX_LEN] = [ACCOUNT_DATA_SEPARATOR; AccountId::MAX_LEN]; + let public_key = CompressedEdwardsY(DUMMY_PUBLIC_KEY); Self { account_id, @@ -460,6 +450,17 @@ impl Default for ValidatorStakeVariableValue { } } +pub(crate) fn normalise_account_id( + account_id: &AccountIdVariableValue, +) -> AccountId { + let unpadded_bytes = account_id + .split(|x| *x == ACCOUNT_DATA_SEPARATOR) + .collect_vec()[0]; + let account_str = String::from_utf8(unpadded_bytes.to_vec()).expect("invalid account bytes"); + trace!("account id: {}", account_str); + account_str.parse().expect("invalid account id") +} + pub type PublicKeyVariable = CompressedEdwardsYVariable; #[derive(CircuitVariable, Clone, Debug)] @@ -470,30 +471,27 @@ pub struct SignatureVariable { impl From>> for SignatureVariableValue { fn from(sig: Option>) -> Self { sig.and_then(|s| match *s { - Signature::ED25519(s) => Some(Self { - signature: EDDSASignatureVariableValue { - r: CompressedEdwardsY(*s.r_bytes()), - s: U256::from_little_endian(s.s_bytes()), - }, - }), + Signature::ED25519(s) => { + let r = *s.r_bytes(); + Some(Self { + signature: EDDSASignatureVariableValue { + r: CompressedEdwardsY(r), + s: U256::from_little_endian(s.s_bytes()), + }, + }) + } // Silently ignores invalid signatures (ECDSA) // The reasoning being that ECDSA is being phased out and almost all validators // use EDDSA. // If we still need this, we should implement ECDSA. _ => None, }) - .unwrap_or_default() - } -} - -impl Default for SignatureVariableValue { - fn default() -> Self { - Self { + .unwrap_or(Self { signature: EDDSASignatureVariableValue { - r: CompressedEdwardsY::default(), - s: Default::default(), + r: CompressedEdwardsY(DUMMY_SIGNATURE[0..32].try_into().unwrap()), + s: U256::from_little_endian(&DUMMY_SIGNATURE[32..]), }, - } + }) } } @@ -569,52 +567,25 @@ impl, const D: usize> Hint for BuildEndorsement { } } -#[derive(CircuitVariable, Clone, Debug)] -pub struct SyncedVariable { - pub new_head: HeaderVariable, - pub next_bps_epoch: CryptoHashVariable, - pub next_bps: BpsArr, -} - -impl From for SyncedVariableValue -where - F: RichField, -{ - fn from(value: Synced) -> Self { - let default_bps = vec![ValidatorStakeVariableValue::default(); NUM_BLOCK_PRODUCER_SEATS]; - Self { - new_head: value.new_head.into(), - next_bps_epoch: value - .next_bps - .as_ref() - .map(|v| v.0 .0 .0.into()) - .unwrap_or_default(), - next_bps: value - .next_bps - .map(|v| v.1.into_iter().map(Into::into).collect_vec()) - .unwrap_or(default_bps), - } - } -} - #[derive(Debug, Clone, Deserialize, Serialize)] -pub struct HashBpsInputs; +pub struct HashBpsInputs; -impl, const D: usize> Hint for HashBpsInputs { +impl, const D: usize, const A: usize> Hint for HashBpsInputs { fn hint(&self, input_stream: &mut ValueStream, output_stream: &mut ValueStream) { - let bps = input_stream.read_value::>(); + let bps = input_stream.read_value::>(); // TODO: if we use a bitmask we wont need default checks let default_validator = ValidatorStakeVariableValue::<>::Field>::default(); let bps = bps + .inner .into_iter() .filter(|x| x.account_id != default_validator.account_id) .map(Into::::into) .collect_vec(); - trace!("Bps to hash: {:#?}", bps); + debug!("bps to hash: {:#?}", bps); let hash = CryptoHash::hash_borsh(bps); - debug!("Hash: {:#?}", hash); + debug!("bps hash: {:#?}", hash); // TODO: figure out how to hash this in circuit // It's non trivial because the account id is padded to the max len @@ -622,14 +593,14 @@ impl, const D: usize> Hint for HashBpsInputs { } } -impl HashBpsInputs { +impl HashBpsInputs { pub fn hash, const D: usize>( self, b: &mut CircuitBuilder, - bps: &BpsArr, + bps: &Validators, ) -> CryptoHashVariable { let mut input_stream = VariableStream::new(); - input_stream.write::>(bps); + input_stream.write::>(bps); let output_stream = b.hint(input_stream, self); output_stream.read::(b) @@ -711,6 +682,7 @@ impl EvmVariable for TransactionOrReceiptIdVariable { account: AccountIdVariable::decode(builder, &bytes[33..33 + AccountId::MAX_LEN]), } } + fn encode_value(value: Self::ValueType) -> Vec { let mut bytes = vec![value.is_transaction as u8]; bytes.extend_from_slice(&CryptoHashVariable::encode_value::(value.id)); @@ -719,6 +691,7 @@ impl EvmVariable for TransactionOrReceiptIdVariable { ))); bytes } + fn decode_value(bytes: &[u8]) -> Self::ValueType { assert_eq!(bytes.len(), 1 + 32 + AccountId::MAX_LEN); @@ -729,6 +702,7 @@ impl EvmVariable for TransactionOrReceiptIdVariable { } } } + #[cfg(test)] mod tests { use std::str::FromStr; @@ -779,8 +753,8 @@ mod tests { b.evm_write::(tx); }; let writer = |input: &mut PI| { - input.evm_write::(txs[0].clone().into()); - input.evm_write::(txs[1].clone().into()); + input.evm_write::(txs[0].clone()); + input.evm_write::(txs[1].clone()); }; let assertions = |mut output: PO| { println!("{:#?}", output.evm_read::()); diff --git a/nearx/src/verify.rs b/nearx/src/verify.rs index 04f18361..bdb412b0 100644 --- a/nearx/src/verify.rs +++ b/nearx/src/verify.rs @@ -1,3 +1,5 @@ +use std::marker::PhantomData; + use near_light_client_protocol::prelude::Itertools; pub use plonky2x::{self, backend::circuit::Circuit, prelude::*}; use plonky2x::{ @@ -9,7 +11,8 @@ use serde::{Deserialize, Serialize}; use crate::{ builder::Verify, - hint::{FetchHeaderInputs, FetchProofInputs, ProofInputVariable}, + config::Config, + hint::{FetchProofInputs, InputFetcher, ProofInputVariable}, variables::{byte_from_bool, CryptoHashVariable, EncodeInner, TransactionOrReceiptIdVariable}, }; @@ -22,31 +25,36 @@ pub struct ProofVerificationResultVariable { } #[derive(Debug, Clone)] -pub struct VerifyCircuit; +pub struct VerifyCircuit(PhantomData); -impl Circuit - for VerifyCircuit +impl Circuit for VerifyCircuit +where + [(); C::BPS]:, + [(); C::VERIFY_AMT]:, + [(); C::VERIFY_BATCH]:, { fn define, const D: usize>(b: &mut CircuitBuilder) where <>::Config as GenericConfig>::Hasher: AlgebraicHasher<>::Field>, { + let fetcher = InputFetcher::::default(); + // TODO: this is trusted, we should join the result of this to assert that the // light client did know about this header OR ensure in the circuit we knew // about this information, the contract should emit an event for the height so // it's easily queryable let trusted_header_hash = b.evm_read::(); - let head = FetchHeaderInputs(NETWORK.into()).fetch(b, &trusted_header_hash); + let header = fetcher.fetch_verify(b, &trusted_header_hash); // TODO: check that the head.block_height was once known to the verifier if not // the checkpoint header let mut ids = vec![]; - for _ in 0..N { + for _ in 0..C::VERIFY_AMT { ids.push(b.evm_read::()); } - let proofs = FetchProofInputs::(NETWORK.into()).fetch(b, &head, &ids); + let proofs = FetchProofInputs::<{ C::VERIFY_AMT }>(C::NETWORK).fetch(b, &header, &ids); // Init a default result for N let zero = b.constant::([0u8; 32].into()); @@ -58,7 +66,7 @@ impl Circuit }; // TODO: write some outputs here for each ID - let output = b.mapreduce_dynamic::, Self, B, _, _>( + let output = b.mapreduce_dynamic::, Self, {C::VERIFY_BATCH}, _, _>( default, proofs.data, |default, proofs, b| { @@ -72,13 +80,13 @@ impl Circuit } results.resize( - N, + C::VERIFY_AMT, default, ); results.into() }, - |_, l, r, b| MergeProofHint::.merge(b, &l, &r), + |_, l, r, b| MergeProofHint::<{C::VERIFY_AMT}>.merge(b, &l, &r), ); b.watch_slice(&output.data, "output"); @@ -94,9 +102,9 @@ impl Circuit where <>::Config as GenericConfig>::Hasher: AlgebraicHasher, { - registry.register_async_hint::>(); - registry.register_hint::>(); - registry.register_async_hint::(); + registry.register_async_hint::>(); + registry.register_hint::>(); + registry.register_async_hint::>(); // We hash in verify registry.register_hint::(); @@ -107,9 +115,9 @@ impl Circuit L, ProofVerificationResultVariable, ProofInputVariable, - ArrayVariable, + ArrayVariable, Self, - B, + { C::VERIFY_BATCH }, D, >>(dynamic_id); @@ -201,7 +209,8 @@ mod beefy_tests { use super::*; use crate::{ - test_utils::{builder_suite, testnet_state, B, NETWORK, PI, PO}, + config::CustomBatchNumConfig, + test_utils::{builder_suite, testnet_state, B, PI, PO}, variables::TransactionOrReceiptIdVariableValue, }; @@ -209,12 +218,9 @@ mod beefy_tests { #[serial] #[ignore] fn verify_e2e_2x1() { + type C = CustomBatchNumConfig<2, 1>; let (header, _, _) = testnet_state(); - // TODO: test many configs of these - const AMT: usize = 2; - const BATCH: usize = 1; - fn tx(hash: &str, sender: &str) -> TransactionOrReceiptId { TransactionOrReceiptId::Transaction { transaction_hash: CryptoHash::from_str(hash).unwrap(), @@ -243,20 +249,20 @@ mod beefy_tests { .map(Into::into) .collect_vec(); - assert_eq!(txs.len(), AMT); + assert_eq!(txs.len(), C::VERIFY_AMT); let define = |b: &mut B| { - VerifyCircuit::::define(b); + VerifyCircuit::::define(b); }; let writer = |input: &mut PI| { input.evm_write::(header.hash().0.into()); for tx in txs { - input.evm_write::(tx.into()); + input.evm_write::(tx); } }; let assertions = |mut output: PO| { let mut results = vec![]; - for _ in 0..AMT { + for _ in 0..C::VERIFY_AMT { let id = output.evm_read::(); let result = output.evm_read::(); results.push(ProofVerificationResultVariableValue:: { @@ -275,31 +281,28 @@ mod beefy_tests { // #[ignore] #[allow(dead_code)] // Justification: huge test, takes 36 minutes. keep for local testing fn verify_e2e_128x4() { - let (header, _, _) = testnet_state(); + type C = CustomBatchNumConfig<128, 4>; - const AMT: usize = 128; - const BATCH: usize = 4; + let (header, _, _) = testnet_state(); let txs = fixture::>("ids.json") .into_iter() - .take(AMT) + .take(C::VERIFY_AMT) .map(Into::>::into) .collect_vec(); - assert_eq!(txs.len(), AMT); - let define = |b: &mut B| { - VerifyCircuit::::define(b); + VerifyCircuit::::define(b); }; let writer = |input: &mut PI| { input.evm_write::(header.hash().0.into()); for tx in txs { - input.evm_write::(tx.into()); + input.evm_write::(tx); } }; let assertions = |mut output: PO| { let mut results = vec![]; - for _ in 0..AMT { + for _ in 0..C::VERIFY_AMT { let id = output.evm_read::(); let result = output.evm_read::(); results.push(ProofVerificationResultVariableValue:: { diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 8d9329fd..2e9773e1 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -3,4 +3,4 @@ # Individual crates in the workspace may support a lower version, as indicated by `rust-version` field in each crate's `Cargo.toml`. # The version specified below, should be at least as high as the maximum `rust-version` within the workspace. channel = "nightly-2023-12-31" -components = [ "rustfmt", "clippy" ] +components = [ "rustfmt", "clippy", "rust-src", "rust-analyzer" ] diff --git a/scripts/bruno.sh b/scripts/bruno.sh new file mode 100755 index 00000000..fdd4aa8d --- /dev/null +++ b/scripts/bruno.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +set -e + +export $(cat .env | grep -v '#' | sed 's/\r$//' | awk '/=/ {print $1}' ) +export $(cat "api/NEAR Light Client/.env" | grep -v '#' | sed 's/\r$//' | awk '/=/ {print $1}' ) + + +cd "api/NEAR Light Client" + +BRUNO="npx -y @usebruno/cli run" + +# New entrypoint, for sync and verify + +# Check release every 30s +# Once happy, pull verifying key to nearx contract directory +# Update name +# Update main contract + + +ENTRYPOINT=verify +echo "Creating new $ENTRYPOINT deployment" +$BRUNO "Succinct/Deploy/new-deployment.bru" --env testnet -o /tmp/$ENTRYPOINT-deployment-v$VERSION.json + +echo "Checking $ENTRYPOINT release" +CONTINUE=true +while $CONTINUE +do + $BRUNO "Succinct/Deploy/check-release.bru" --env testnet -o /tmp/$ENTRYPOINT-release-v$VERSION.json + if [ $? -eq 0 ]; then + CONTINUE=false + fi + sleep 30 +done + + + +# RESULT=$(cat /tmp/result.json | jq '.results[0].response.data') +# echo "Deployments: $RESULT" +# +# echo "Filtering deployments" +# export DEPLOYMENTSTR=$(echo $RESULT | \ +# jq \ +# ".[] | select(.edges.release.name | contains(\"$CIRCUIT\") and contains(\"$VERSION\"))") +# +# echo "Deployment: $DEPLOYMENTSTR" +# +# + diff --git a/scripts/forge-script.sh b/scripts/forge-script.sh index 079455b8..66dbdcd9 100755 --- a/scripts/forge-script.sh +++ b/scripts/forge-script.sh @@ -6,9 +6,9 @@ then fi export VERSION="${VERSION:-v0.0.3}" -export ETH_RPC="${ETH_RPC:-https://rpc.sepolia.eth.gateway.fm}" -export NEAR_CHECKPOINT_HEADER_HASH="${NEAR_CHECKPOINT_HEADER_HASH:=0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3}" -export CHAIN_ID=${CHAIN_ID:=11155111} +export ETH_RPC_URL="${ETH_RPC_URL:-https://rpc.sepolia.eth.gateway.fm}" +export NEAR_CHECKPOINT_HEADER_HASH="${NEAR_CHECKPOINT_HEADER_HASH:-0x63b87190ffbaa36d7dab50f918fe36f70ab26910a0e9d797161e2356561598e3}" +export CHAIN_ID=${CHAIN_ID:-11155111} if [ -z "$ETH_PRIVATE_KEY" ]; then echo "You need to set ETH_PRIVATE_KEY" @@ -20,8 +20,11 @@ function script() { TAIL="--broadcast" fi - if [ -z "$SKIP_VERIFY" ]; then - TAIL="$TAIL --verify --verifier etherscan" + if [ $1 == "Deploy" ]; then + VERIFIER="${VERIFIER:---verifier etherscan}" + if [ -z "$SKIP_VERIFY" ]; then + TAIL="$TAIL --verify $VERIFIER" + fi fi if [ ! -z "$IS_LEGACY" ]; then @@ -31,17 +34,18 @@ function script() { ( cd ./nearx/contract && \ forge script $1 \ - --rpc-url $ETH_RPC \ + --ffi \ + --sender $ETH_PUBLIC_KEY \ + --rpc-url $ETH_RPC_URL \ --private-key $ETH_PRIVATE_KEY \ - $TAIL + $TAIL -vvvv ) } function pullDeployment() { echo "Getting deployments" (cd "api/NEAR Light Client" && npx -y @usebruno/cli run "Succinct/Get Deployments.bru" --env testnet -o /tmp/result.json) - RESULT=$(cat /tmp/result.json | jq '.results[0].response.data') - RESULT=$(echo $RESULT | jq -r "[.[] | select(.chain_id == $CHAIN_ID)]") + RESULT=$(cat /tmp/result.json | jq '.results[0].response.data' | jq -r "[.[] | select(.chain_id == $CHAIN_ID)]") echo $RESULT } diff --git a/test.json b/test.json new file mode 100644 index 00000000..c4781627 --- /dev/null +++ b/test.json @@ -0,0 +1,55 @@ +{ + "summary": { + "totalRequests": 1, + "passedRequests": 1, + "failedRequests": 0, + "totalAssertions": 0, + "passedAssertions": 0, + "failedAssertions": 0, + "totalTests": 0, + "passedTests": 0, + "failedTests": 0 + }, + "results": [ + { + "test": { + "filename": "api/succinct/Get proof status.bru" + }, + "request": { + "method": "GET", + "url": "https://alpha.succinct.xyz/api/proof/e112ffa6-d2ee-4263-ac93-a31b94277882", + "headers": { + "content-type": "application/json" + } + }, + "response": { + "status": 500, + "statusText": "Internal Server Error", + "headers": { + "cache-control": "public, max-age=0, must-revalidate", + "cf-cache-status": "DYNAMIC", + "cf-ray": "86b8f7084e9a9408-LHR", + "connection": "keep-alive", + "content-type": "application/json", + "date": "Thu, 28 Mar 2024 16:23:29 GMT", + "rndr-id": "7e837532-0efc-42da", + "server": "Vercel", + "strict-transport-security": "max-age=63072000", + "vary": "Origin, Cookie, Accept-Encoding", + "x-render-origin-server": "Render", + "x-vercel-id": "lhr1::drsz9-1711643009296-8fbc9bc3ace2", + "transfer-encoding": "chunked" + }, + "data": { + "error": "failed to get proof" + }, + "responseTime": 657 + }, + "error": null, + "assertionResults": [], + "testResults": [], + "runtime": 0.663039508, + "suitename": "api/succinct/Get proof status" + } + ] +} \ No newline at end of file diff --git a/testnet.toml b/testnet.toml deleted file mode 100644 index c22ad3af..00000000 --- a/testnet.toml +++ /dev/null @@ -1,5 +0,0 @@ -catchup = true -host = "0.0.0.0:3030" -network = "Testnet" -starting_head = "4bM5eXMDGxpFZXbWNT6TqX1HdZsWoHZ11KerCHJ8RKmU" -state_path = "state.db"