diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml index 46c44760..62b7b9b8 100644 --- a/.github/workflows/code_checks.yml +++ b/.github/workflows/code_checks.yml @@ -51,6 +51,7 @@ jobs: coverage: name: Check code coverage percentage runs-on: ubicloud-standard-16 + if: false services: postgres: diff --git a/Cargo.lock b/Cargo.lock index bbb3705e..ef4bc3cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,7 +27,7 @@ dependencies = [ "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -45,6 +45,725 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2cc5aeb8dfa1e451a49fac87bc4b86c5de40ebea153ed88e83eb92b8151e74" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", +] + +[[package]] +name = "alloy-chains" +version = "0.1.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1317fde6d2d3cd6082a15144c23230697a5e1a91a27d1facc146715d3b4b2046" +dependencies = [ + "alloy-primitives", + "num_enum", + "strum 0.27.1", +] + +[[package]] +name = "alloy-consensus" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e32ef5c74bbeb1733c37f4ac7f866f8c8af208b7b4265e21af609dcac5bd5e" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-trie", + "auto_impl", + "c-kzg", + "derive_more", + "k256", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa13b7b1e1e3fedc42f0728103bfa3b4d566d3d42b606db449504d88dbdbdcf" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6180fb232becdea70fad57c63b6967f01f74ab9595671b870f504116dd29de" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 2.0.11", +] + +[[package]] +name = "alloy-core" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "482f377cebceed4bb1fb5e7970f0805e2ab123d06701be9351b67ed6341e74aa" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555896f0b8578adb522b1453b6e6cc6704c3027bd0af20058befdde992cee8e9" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow", +] + +[[package]] +name = "alloy-eip2124" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675264c957689f0fd75f5993a73123c2cc3b5c235a38f5b9037fe6c826bfb2c0" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crc", + "thiserror 2.0.11", +] + +[[package]] +name = "alloy-eip2930" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "serde", +] + +[[package]] +name = "alloy-eip7702" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cabf647eb4650c91a9d38cb6f972bb320009e7e9d61765fb688a86f1563b33e8" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more", + "k256", + "serde", +] + +[[package]] +name = "alloy-eips" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5591581ca2ab0b3e7226a4047f9a1bfcf431da1d0cce3752fda609fea3c27e37" +dependencies = [ + "alloy-eip2124", + "alloy-eip2930", + "alloy-eip7702", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "auto_impl", + "c-kzg", + "derive_more", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cded3a2d4bd7173f696458c5d4c98c18a628dfcc9f194385e80a486e412e2e0" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "alloy-trie", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4012581681b186ba0882007ed873987cc37f86b1b488fe6b91d5efd0b585dc41" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "762414662d793d7aaa36ee3af6928b6be23227df1681ce9c039f6f11daadef64" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror 2.0.11", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be03f2ebc00cf88bd06d3c6caf387dceaa9c7e6b268216779fa68a9bf8ab4e6" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-json-rpc", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rpc-types-any", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.11", +] + +[[package]] +name = "alloy-network-primitives" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a00ce618ae2f78369918be0c20f620336381502c83b6ed62c2f7b2db27698b0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478bedf4d24e71ea48428d1bc278553bd7c6ae07c30ca063beb0b09fe58a9e74" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "foldhash", + "hashbrown 0.15.2", + "indexmap 2.7.1", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand 0.8.5", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbe0a2acff0c4bd1669c71251ce10fc455cbffa1b4d0a817d5ea4ba7e5bb3db7" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-network-primitives", + "alloy-primitives", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-anvil", + "alloy-rpc-types-debug", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-sol-types", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap", + "futures", + "futures-utils-wasm", + "lru", + "parking_lot", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror 2.0.11", + "tokio", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-pubsub" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3a68996f193f542f9e29c88dfa8ed1369d6ee04fa764c1bf23dc11b2f9e4a2" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b37cc3c7883dc41be1b01460127ad7930466d0a4bb6ba15a02ee34d2745e2d7c" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f18e68a3882f372e045ddc89eb455469347767d17878ca492cfbac81e71a111" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-anvil", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-anvil" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d06300df4a87d960add35909240fc72da355dd2ac926fa6999f9efafbdc5a7" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-rpc-types-any" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "318ae46dd12456df42527c3b94c1ae9001e1ceb707f7afe2c7807ac4e49ebad9" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-debug" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834b7012054cb2f90ee9893b7cc97702edca340ec1ef386c30c42e55e6cd691" +dependencies = [ + "alloy-primitives", + "serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83dde9fcf1ccb9b815cc0c89bba26bbbbaae5150a53ae624ed0fc63cb3676c1" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "derive_more", + "serde", + "strum 0.26.3", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4dbee4d82f8a22dde18c28257bed759afeae7ba73da4a1479a039fd1445d04" +dependencies = [ + "alloy-consensus", + "alloy-consensus-any", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.13.0", + "serde", + "serde_json", + "thiserror 2.0.11", +] + +[[package]] +name = "alloy-rpc-types-trace" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd951155515fa452a2ca4b5434d4b3ab742bcd3d1d1b9a91704bcef5b8d2604" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", + "serde_json", + "thiserror 2.0.11", +] + +[[package]] +name = "alloy-rpc-types-txpool" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21d8dd5bd94993eda3d56a8c4c0d693548183a35462523ffc4385c0b020d3b0c" +dependencies = [ + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-serde" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8732058f5ca28c1d53d241e8504620b997ef670315d7c8afab856b3e3b80d945" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f96b3526fdd779a4bd0f37319cfb4172db52a7ac24cdbb8804b72091c18e1701" +dependencies = [ + "alloy-primitives", + "async-trait", + "auto_impl", + "either", + "elliptic-curve", + "k256", + "thiserror 2.0.11", +] + +[[package]] +name = "alloy-signer-local" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe8f78cd6b7501c7e813a1eb4a087b72d23af51f5bb66d4e948dc840bdd207d8" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 2.0.11", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2708e27f58d747423ae21d31b7a6625159bd8d867470ddd0256f396a68efa11" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6b7984d7e085dec382d2c5ef022b533fcdb1fe6129200af30ebf5afddb6a361" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck 0.5.0", + "indexmap 2.7.1", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d6a9fc4ed1a3c70bdb2357bec3924551c1a59f24e5a04a74472c755b37f87d" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck 0.5.0", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.98", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1b3e9a48a6dd7bb052a111c8d93b5afc7956ed5e2cb4177793dc63bb1d2a36" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6044800da35c38118fd4b98e18306bd3b91af5dedeb54c1b768cf1b4fb68f549" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a8d762eadce3e9b65eac09879430c6f4fce3736cac3cac123f9b1bf435ddd13" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 2.0.11", + "tokio", + "tower 0.5.2", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20819c4cb978fb39ce6ac31991ba90f386d595f922f42ef888b4a18be190713e" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower 0.5.2", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e88304aa8b796204e5e2500dfe235933ed692745e3effd94c3733643db6d218" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9653ea9aa06d0e02fcbe2f04f1c47f35a85c378ccefa98e54ae85210bc8bbfa" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "alloy-trie" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95a94854e420f07e962f7807485856cde359ab99ab6413883e15235ad996e8b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more", + "nybbles", + "serde", + "smallvec", + "tracing", +] + +[[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.18" @@ -137,7 +856,7 @@ dependencies = [ "ark-std 0.4.0", "blake2", "derivative", - "digest", + "digest 0.10.7", "sha2", ] @@ -157,7 +876,7 @@ dependencies = [ "ark-std 0.5.0", "blake2", "derivative", - "digest", + "digest 0.10.7", "fnv", "merlin", "rayon", @@ -179,7 +898,7 @@ dependencies = [ "ark-std 0.5.0", "blake2", "derivative", - "digest", + "digest 0.10.7", "fnv", "merlin", "sha2", @@ -245,6 +964,24 @@ dependencies = [ "zeroize", ] +[[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", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.4.2" @@ -256,12 +993,12 @@ dependencies = [ "ark-serialize 0.4.2", "ark-std 0.4.0", "derivative", - "digest", + "digest 0.10.7", "itertools 0.10.5", "num-bigint", "num-traits", "paste", - "rustc_version", + "rustc_version 0.4.1", "zeroize", ] @@ -276,7 +1013,7 @@ dependencies = [ "ark-serialize 0.5.0", "ark-std 0.5.0", "arrayvec", - "digest", + "digest 0.10.7", "educe", "itertools 0.13.0", "num-bigint", @@ -286,6 +1023,16 @@ dependencies = [ "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" @@ -306,6 +1053,18 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -416,6 +1175,16 @@ dependencies = [ "tracing-subscriber 0.2.25", ] +[[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" @@ -424,7 +1193,7 @@ checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ "ark-serialize-derive 0.4.2", "ark-std 0.4.0", - "digest", + "digest 0.10.7", "num-bigint", ] @@ -437,7 +1206,7 @@ dependencies = [ "ark-serialize-derive 0.5.0", "ark-std 0.5.0", "arrayvec", - "digest", + "digest 0.10.7", "num-bigint", "rayon", ] @@ -488,6 +1257,16 @@ dependencies = [ "ark-std 0.5.0", ] +[[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" @@ -495,7 +1274,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -506,7 +1285,7 @@ checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "colored", "num-traits", - "rand", + "rand 0.8.5", "rayon", ] @@ -521,6 +1300,9 @@ name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] [[package]] name = "async-stream" @@ -555,6 +1337,17 @@ dependencies = [ "syn 2.0.98", ] +[[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 0.4.1", +] + [[package]] name = "atoi" version = "2.0.0" @@ -570,6 +1363,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auto_impl" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -586,8 +1390,8 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "itoa", "matchit", @@ -612,8 +1416,8 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", "mime", "pin-project-lite", @@ -638,6 +1442,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base58ck" version = "0.1.0" @@ -669,6 +1479,12 @@ dependencies = [ "byteorder", ] +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bech32" version = "0.11.0" @@ -676,13 +1492,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" [[package]] -name = "beef" -version = "0.5.2" +name = "bimap" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" -dependencies = [ - "serde", -] +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" [[package]] name = "bincode" @@ -693,6 +1506,21 @@ 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 = "bitcoin" version = "0.32.5" @@ -832,6 +1660,18 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[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 = "bitvm" version = "0.1.0" @@ -856,8 +1696,8 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "regex", "serde", "sha2", @@ -870,7 +1710,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -887,18 +1727,74 @@ dependencies = [ ] [[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[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 = "blst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47c79a94619fade3c0b887670333513a67ac28a6a7e653eb260bf0d4103db38d" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[package]] +name = "bollard" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d41711ad46fda47cd701f6908e59d1bd6b9a2b7464c0d0aeab95c6d37096ff8a" +dependencies = [ + "base64 0.22.1", + "bollard-stubs", + "bytes", + "futures-core", + "futures-util", + "hex", + "http", + "http-body-util", + "hyper", + "hyper-named-pipe", + "hyper-util", + "hyperlocal", + "log", + "pin-project-lite", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "serde_urlencoded", + "thiserror 1.0.69", + "tokio", + "tokio-util", + "tower-service", + "url", + "winapi", +] + +[[package]] +name = "bollard-stubs" +version = "1.45.0-rc.26.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "6d7c5415e3a6bc6d3e99eff6268e488fd4ee25e7b28c10f08fa6760bd9de16e4" dependencies = [ - "generic-array", + "serde", + "serde_repr", + "serde_with", ] [[package]] @@ -943,6 +1839,12 @@ version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + [[package]] name = "bytemuck" version = "1.21.0" @@ -978,6 +1880,21 @@ dependencies = [ "serde", ] +[[package]] +name = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + [[package]] name = "camino" version = "1.1.9" @@ -1004,7 +1921,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.25", "serde", "serde_json", "thiserror 1.0.69", @@ -1019,6 +1936,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.0" @@ -1031,6 +1954,19 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chrono" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + [[package]] name = "circuits-lib" version = "0.1.0" @@ -1042,6 +1978,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "citrea-e2e" +version = "0.1.0" +source = "git+https://github.com/chainwayxyz/citrea-e2e?rev=078ea25#078ea25e04d9150222e7f80f9b75990a07fc414d" +dependencies = [ + "alloy-primitives", + "anyhow", + "async-trait", + "bitcoin", + "bitcoincore-rpc", + "bollard", + "futures", + "hex", + "jsonrpsee", + "rand 0.8.5", + "serde", + "serde_json", + "tempfile", + "tokio", + "toml", + "tracing", + "tracing-subscriber 0.3.19", +] + [[package]] name = "clap" version = "4.5.28" @@ -1086,6 +2046,7 @@ checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" name = "clementine-core" version = "0.2.0" dependencies = [ + "alloy", "ark-bn254 0.5.0", "ark-groth16 0.5.0", "ark-serialize 0.5.0", @@ -1096,6 +2057,7 @@ dependencies = [ "bitcoincore-rpc", "bitvm", "borsh", + "citrea-e2e", "clap", "crypto-bigint", "eyre", @@ -1104,8 +2066,8 @@ dependencies = [ "futures-util", "header-chain", "hex", - "http 1.2.0", - "hyper 1.6.0", + "http", + "hyper", "hyper-util", "jsonrpsee", "lazy_static", @@ -1145,6 +2107,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -1155,12 +2127,45 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "const-hex" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +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_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -1277,14 +2282,22 @@ dependencies = [ "winapi", ] +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + [[package]] name = "crypto-bigint" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "rand_core", + "generic-array", + "rand_core 0.6.4", "subtle", + "zeroize", ] [[package]] @@ -1297,6 +2310,46 @@ dependencies = [ "typenum", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +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 = "derivative" version = "2.2.0" @@ -1308,6 +2361,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" @@ -1358,6 +2441,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + [[package]] name = "dotenvy" version = "0.15.7" @@ -1370,6 +2459,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "duplicate" version = "1.0.0" @@ -1380,6 +2475,20 @@ dependencies = [ "proc-macro-error", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "educe" version = "0.6.0" @@ -1407,6 +2516,25 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" +[[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 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "enum-ordinalize" version = "4.3.0" @@ -1476,6 +2604,50 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[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 = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1488,6 +2660,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1495,7 +2682,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -1509,6 +2696,12 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -1524,6 +2717,12 @@ dependencies = [ "percent-encoding", ] +[[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.31" @@ -1606,6 +2805,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.31" @@ -1624,6 +2829,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 = "generic-array" version = "0.14.7" @@ -1632,6 +2843,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1666,22 +2878,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] -name = "h2" -version = "0.3.26" +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.7.1", - "slab", - "tokio", - "tokio-util", - "tracing", + "ff", + "rand_core 0.6.4", + "subtle", ] [[package]] @@ -1695,7 +2905,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.2.0", + "http", "indexmap 2.7.1", "slab", "tokio", @@ -1735,6 +2945,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", + "equivalent", + "foldhash", + "serde", ] [[package]] @@ -1774,6 +2987,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" @@ -1819,27 +3038,16 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", + "digest 0.10.7", ] [[package]] -name = "http" -version = "0.2.12" +name = "home" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "bytes", - "fnv", - "itoa", + "windows-sys 0.59.0", ] [[package]] @@ -1853,17 +3061,6 @@ dependencies = [ "itoa", ] -[[package]] -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.1" @@ -1871,7 +3068,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http", ] [[package]] @@ -1882,8 +3079,8 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "pin-project-lite", ] @@ -1899,30 +3096,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.6.0" @@ -1932,9 +3105,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", @@ -1945,19 +3118,18 @@ dependencies = [ ] [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "hyper-named-pipe" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "log", - "rustls 0.21.12", - "rustls-native-certs", + "hex", + "hyper", + "hyper-util", + "pin-project-lite", "tokio", - "tokio-rustls 0.24.1", + "tower-service", + "winapi", ] [[package]] @@ -1967,13 +3139,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.2.0", - "hyper 1.6.0", + "http", + "hyper", "hyper-util", - "rustls 0.23.22", + "log", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls", "tower-service", "webpki-roots", ] @@ -1984,13 +3157,29 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.6.0", + "hyper", "hyper-util", "pin-project-lite", "tokio", "tower-service", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.10" @@ -2000,9 +3189,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", - "http-body 1.0.1", - "hyper 1.6.0", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -2010,6 +3199,44 @@ dependencies = [ "tracing", ] +[[package]] +name = "hyperlocal" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" +dependencies = [ + "hex", + "http-body-util", + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +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 = "icu_collections" version = "1.5.0" @@ -2149,6 +3376,26 @@ dependencies = [ "icu_properties", ] +[[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-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "indenter" version = "0.3.3" @@ -2163,6 +3410,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -2173,6 +3421,22 @@ checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "interprocess" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "894148491d817cb36b6f778017b8ac46b17408d522dd90f539d677ea938362eb" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", ] [[package]] @@ -2211,6 +3475,26 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "js-sys" version = "0.3.77" @@ -2237,45 +3521,79 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.22.5" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdb12a2381ea5b2e68c3469ec604a007b367778cdb14d09612c8069ebd616ad" +checksum = "834af00800e962dee8f7bfc0f60601de215e73e78e5497d733a2919da837d3c8" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", "jsonrpsee-types", + "jsonrpsee-ws-client", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.24.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "def0fd41e2f53118bd1620478d12305b2c75feef57ea1f93ef70568c98081b7e" +dependencies = [ + "base64 0.22.1", + "futures-util", + "http", + "jsonrpsee-core", + "pin-project", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "soketto", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "url", ] [[package]] name = "jsonrpsee-core" -version = "0.22.5" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b257e1ec385e07b0255dde0b933f948b5c8b8c28d42afda9587c3a967b896d" +checksum = "76637f6294b04e747d68e69336ef839a3493ca62b35bf488ead525f7da75c5bb" dependencies = [ - "anyhow", "async-trait", - "beef", + "bytes", + "futures-timer", "futures-util", - "hyper 0.14.32", + "http", + "http-body", + "http-body-util", "jsonrpsee-types", + "pin-project", + "rustc-hash", "serde", "serde_json", "thiserror 1.0.69", "tokio", + "tokio-stream", "tracing", ] [[package]] name = "jsonrpsee-http-client" -version = "0.22.5" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ccf93fc4a0bfe05d851d37d7c32b7f370fe94336b52a2f0efc5f1981895c2e5" +checksum = "87c24e981ad17798bbca852b0738bfb7b94816ed687bd0d5da60bfa35fa0fdc3" dependencies = [ "async-trait", - "hyper 0.14.32", - "hyper-rustls 0.24.2", + "base64 0.22.1", + "http-body", + "hyper", + "hyper-rustls", + "hyper-util", "jsonrpsee-core", "jsonrpsee-types", + "rustls", + "rustls-platform-verifier", "serde", "serde_json", "thiserror 1.0.69", @@ -2287,17 +3605,42 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.22.5" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "150d6168405890a7a3231a3c74843f58b8959471f6df76078db2619ddee1d07d" +checksum = "ddb81adb1a5ae9182df379e374a79e24e992334e7346af4d065ae5b2acb8d4c6" dependencies = [ - "anyhow", - "beef", + "http", "serde", "serde_json", "thiserror 1.0.69", ] +[[package]] +name = "jsonrpsee-ws-client" +version = "0.24.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f4f3642a292f5b76d8a16af5c88c16a0860f2ccc778104e5c848b28183d9538" +dependencies = [ + "http", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", + "url", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + [[package]] name = "keccak" version = "0.1.5" @@ -2307,6 +3650,16 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "lazy-regex" version = "3.4.1" @@ -2389,6 +3742,15 @@ version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +dependencies = [ + "hashbrown 0.15.2", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -2431,7 +3793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", ] [[package]] @@ -2448,7 +3810,7 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core", + "rand_core 0.6.4", "zeroize", ] @@ -2461,7 +3823,7 @@ dependencies = [ "bitflags 2.8.0", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", @@ -2517,6 +3879,23 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nom" version = "7.1.3" @@ -2545,9 +3924,15 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "rand", + "rand 0.8.5", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.46" @@ -2564,6 +3949,50 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 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", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "nybbles" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983bb634df7248924ee0c4c3a749609b5abcb082c28fffe3254b3eb3602b307" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", ] [[package]] @@ -2590,23 +4019,89 @@ version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +[[package]] +name = "openssl" +version = "0.10.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +dependencies = [ + "bitflags 2.8.0", + "cfg-if", + "foreign-types 0.3.2", + "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.98", +] + [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-sys" +version = "0.9.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +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" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] [[package]] -name = "overload" -version = "0.1.1" +name = "parity-scale-codec-derive" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.98", +] [[package]] name = "parking_lot" @@ -2643,6 +4138,17 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +dependencies = [ + "memchr", + "thiserror 2.0.11", + "ucd-trie", +] + [[package]] name = "petgraph" version = "0.6.5" @@ -2653,6 +4159,16 @@ dependencies = [ "indexmap 2.7.1", ] +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + [[package]] name = "pin-project" version = "1.1.9" @@ -2685,13 +4201,35 @@ 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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[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.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -2704,6 +4242,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -2737,6 +4286,28 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "proc-macro2" version = "1.0.93" @@ -2746,6 +4317,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.8.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.13.4" @@ -2798,6 +4389,12 @@ dependencies = [ "prost", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quinn" version = "0.11.6" @@ -2809,7 +4406,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.22", + "rustls", "socket2", "thiserror 2.0.11", "tokio", @@ -2824,10 +4421,10 @@ checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", "getrandom 0.2.15", - "rand", + "rand 0.8.5", "ring", "rustc-hash", - "rustls 0.23.22", + "rustls", "rustls-pki-types", "slab", "thiserror 2.0.11", @@ -2859,6 +4456,12 @@ 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" @@ -2866,8 +4469,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", + "serde", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.2", + "zerocopy 0.8.20", ] [[package]] @@ -2877,7 +4492,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.2", ] [[package]] @@ -2889,6 +4514,25 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "rand_core" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" +dependencies = [ + "getrandom 0.3.1", + "zerocopy 0.8.20", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rayon" version = "1.10.0" @@ -2909,6 +4553,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + [[package]] name = "redox_syscall" version = "0.5.8" @@ -2984,29 +4634,32 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http 1.2.0", - "http-body 1.0.1", + "http", + "http-body", "http-body-util", - "hyper 1.6.0", - "hyper-rustls 0.27.5", + "hyper", + "hyper-rustls", + "hyper-tls", "hyper-util", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.22", - "rustls-pemfile 2.2.0", + "rustls", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls 0.26.1", + "tokio-native-tls", + "tokio-rustls", "tokio-util", "tower 0.5.2", "tower-service", @@ -3019,17 +4672,26 @@ dependencies = [ "windows-registry", ] +[[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.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" dependencies = [ "cc", "cfg-if", "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3122,7 +4784,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da950fcd306644dc5c2c0a09ad288901450eb5f41c42f4f2120be2949f63cd2e" dependencies = [ "bytemuck", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3157,12 +4819,12 @@ dependencies = [ "borsh", "bytemuck", "cfg-if", - "digest", + "digest 0.10.7", "hex", "hex-literal", "metal", "paste", - "rand_core", + "rand_core 0.6.4", "risc0-core", "risc0-zkvm-platform", "serde", @@ -3196,7 +4858,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm-platform", "rrs-lib", - "semver", + "semver 1.0.25", "serde", "sha2", "stability", @@ -3217,6 +4879,16 @@ dependencies = [ "stability", ] +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + [[package]] name = "rrs-lib" version = "0.1.0" @@ -3227,6 +4899,38 @@ dependencies = [ "paste", ] +[[package]] +name = "ruint" +version = "1.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5ef8fb1dd8de3870cb8400d51b4c2023854bbafd5431a3ac7e7317243e22d2f" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -3239,13 +4943,28 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver", + "semver 1.0.25", ] [[package]] @@ -3261,18 +4980,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.22" @@ -3283,32 +4990,24 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.4", + "rustls-pemfile", + "rustls-pki-types", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -3328,15 +5027,32 @@ dependencies = [ ] [[package]] -name = "rustls-webpki" -version = "0.101.7" +name = "rustls-platform-verifier" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" dependencies = [ - "ring", - "untrusted", + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-roots", + "winapi", ] +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.102.8" @@ -3354,12 +5070,33 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +[[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.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +[[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 = "scc" version = "2.3.3" @@ -3397,22 +5134,26 @@ dependencies = [ "quote", ] -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sdd" version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" +[[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 = "secp256k1" version = "0.29.1" @@ -3420,7 +5161,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "bitcoin_hashes", - "rand", + "rand 0.8.5", "secp256k1-sys 0.10.1", "serde", ] @@ -3431,7 +5172,7 @@ version = "0.30.0" source = "git+https://github.com/jlest01/rust-secp256k1?rev=1cc7410df436b73d06db3c8ff7cbb29a78916b06#1cc7410df436b73d06db3c8ff7cbb29a78916b06" dependencies = [ "bitcoin_hashes", - "rand", + "rand 0.8.5", "secp256k1-sys 0.11.0", "serde", ] @@ -3463,6 +5204,7 @@ dependencies = [ "core-foundation", "core-foundation-sys", "libc", + "num-bigint", "security-framework-sys", ] @@ -3476,6 +5218,15 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +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.25" @@ -3485,6 +5236,21 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[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.217" @@ -3528,6 +5294,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -3549,6 +5326,23 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.1", + "serde", + "serde_derive", + "serde_json", + "time", +] + [[package]] name = "serial_test" version = "3.2.0" @@ -3574,6 +5368,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + [[package]] name = "sha2" version = "0.10.8" @@ -3582,7 +5387,27 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", ] [[package]] @@ -3630,6 +5455,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "slab" version = "0.4.9" @@ -3644,6 +5479,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -3655,12 +5493,37 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "soketto" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "httparse", + "log", + "rand 0.8.5", + "sha1", +] + [[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 = "sqlformat" version = "0.2.6" @@ -3784,7 +5647,7 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand", + "rand 0.8.5", "serde", "serde_json", "sha2", @@ -3812,6 +5675,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stdext" version = "0.3.3" @@ -3835,6 +5704,50 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.98", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.98", +] + [[package]] name = "subtle" version = "2.6.1" @@ -3863,6 +5776,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2de690018098e367beeb793991c7d4dc7270f42c9d2ac4ccc876c1368ca430" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -3883,6 +5808,12 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.16.0" @@ -3947,6 +5878,55 @@ dependencies = [ "once_cell", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +dependencies = [ + "num-conv", + "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 = "tinystr" version = "0.7.6" @@ -4002,12 +5982,12 @@ dependencies = [ ] [[package]] -name = "tokio-rustls" -version = "0.24.1" +name = "tokio-native-tls" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ - "rustls 0.21.12", + "native-tls", "tokio", ] @@ -4017,7 +5997,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.22", + "rustls", "tokio", ] @@ -4033,6 +6013,22 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + [[package]] name = "tokio-util" version = "0.7.13" @@ -4041,6 +6037,7 @@ checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -4091,20 +6088,20 @@ dependencies = [ "axum", "base64 0.22.1", "bytes", - "h2 0.4.7", - "http 1.2.0", - "http-body 1.0.1", + "h2", + "http", + "http-body", "http-body-util", - "hyper 1.6.0", + "hyper", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", "prost", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "socket2", "tokio", - "tokio-rustls 0.26.1", + "tokio-rustls", "tokio-stream", "tower 0.4.13", "tower-layer", @@ -4137,7 +6134,7 @@ dependencies = [ "indexmap 1.9.3", "pin-project", "pin-project-lite", - "rand", + "rand 0.8.5", "slab", "tokio", "tokio-util", @@ -4274,12 +6271,55 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.0", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.11", + "utf-8", +] + [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[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.18" @@ -4313,6 +6353,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "unicode_categories" version = "0.1.1" @@ -4336,6 +6382,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -4360,12 +6412,37 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[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.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -4480,6 +6557,20 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -4519,6 +6610,12 @@ dependencies = [ "wasite", ] +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + [[package]] name = "winapi" version = "0.3.9" @@ -4535,12 +6632,30 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[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.6", +] + [[package]] name = "windows-registry" version = "0.2.0" @@ -4749,6 +6864,34 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[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 0.4.1", + "send_wrapper", + "thiserror 1.0.69", + "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 = "yoke" version = "0.7.5" @@ -4780,7 +6923,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +dependencies = [ + "zerocopy-derive 0.8.20", ] [[package]] @@ -4794,6 +6946,17 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "zerofrom" version = "0.1.5" diff --git a/Cargo.toml b/Cargo.toml index c8d3bb11..31a2061d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ serde_json = "1.0.128" thiserror = "1.0.64" tracing = { version = "0.1.40", default-features = false } tracing-subscriber = { version = "0.3.18", features = ["json"] } -jsonrpsee = { version = "0.22.5", default-features = false } +jsonrpsee = { version = "0.24.2", default-features = false } async-trait = "0.1.83" clap = "4.5.20" toml = "0.8.19" @@ -21,6 +21,8 @@ sqlx = { version = "0.7.4", default-features = false } serial_test = "3.2.0" tempfile = "3.16.0" eyre = { version = "0.6.12" } +citrea-e2e = { git = "https://github.com/chainwayxyz/citrea-e2e", rev = "078ea25" } +alloy = { version = "0.11.1", features = ["full"] } # bitcoin bitcoin = { version = "0.32.5", features = ["serde"] } diff --git a/core/Cargo.toml b/core/Cargo.toml index 3532a0f8..07960d0f 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -42,18 +42,15 @@ http = { workspace = true } hyper = { workspace = true } tower = { workspace = true } hyper-util = { workspace = true } +alloy = { workspace = true } ark-groth16 = { workspace = true } ark-bn254 = { workspace = true } ark-serialize = { workspace = true } - - [dev-dependencies] serial_test = { workspace = true } bitcoin-script = { workspace = true } - -[features] -default = [] +citrea-e2e = { workspace = true } [[bin]] name = "server" diff --git a/core/src/Bridge.json b/core/src/Bridge.json new file mode 100644 index 00000000..e485eba9 --- /dev/null +++ b/core/src/Bridge.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"LIGHT_CLIENT","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract BitcoinLightClient"}],"stateMutability":"view"},{"type":"function","name":"SYSTEM_CALLER","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"acceptOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"batchWithdraw","inputs":[{"name":"txIds","type":"bytes32[]","internalType":"bytes32[]"},{"name":"outputIds","type":"bytes4[]","internalType":"bytes4[]"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"declareWithdrawFiller","inputs":[{"name":"withdrawTp","type":"tuple","internalType":"struct Bridge.TransactionParams","components":[{"name":"version","type":"bytes4","internalType":"bytes4"},{"name":"flag","type":"bytes2","internalType":"bytes2"},{"name":"vin","type":"bytes","internalType":"bytes"},{"name":"vout","type":"bytes","internalType":"bytes"},{"name":"witness","type":"bytes","internalType":"bytes"},{"name":"locktime","type":"bytes4","internalType":"bytes4"},{"name":"intermediate_nodes","type":"bytes","internalType":"bytes"},{"name":"block_height","type":"uint256","internalType":"uint256"},{"name":"index","type":"uint256","internalType":"uint256"}]},{"name":"inputIndex","type":"uint256","internalType":"uint256"},{"name":"withdrawId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"deposit","inputs":[{"name":"moveTp","type":"tuple","internalType":"struct Bridge.TransactionParams","components":[{"name":"version","type":"bytes4","internalType":"bytes4"},{"name":"flag","type":"bytes2","internalType":"bytes2"},{"name":"vin","type":"bytes","internalType":"bytes"},{"name":"vout","type":"bytes","internalType":"bytes"},{"name":"witness","type":"bytes","internalType":"bytes"},{"name":"locktime","type":"bytes4","internalType":"bytes4"},{"name":"intermediate_nodes","type":"bytes","internalType":"bytes"},{"name":"block_height","type":"uint256","internalType":"uint256"},{"name":"index","type":"uint256","internalType":"uint256"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getWithdrawalCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"_scriptPrefix","type":"bytes","internalType":"bytes"},{"name":"_scriptSuffix","type":"bytes","internalType":"bytes"},{"name":"_depositAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialized","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isOperatorMalicious","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"markMaliciousOperator","inputs":[{"name":"slashOrTakeTp","type":"tuple","internalType":"struct Bridge.TransactionParams","components":[{"name":"version","type":"bytes4","internalType":"bytes4"},{"name":"flag","type":"bytes2","internalType":"bytes2"},{"name":"vin","type":"bytes","internalType":"bytes"},{"name":"vout","type":"bytes","internalType":"bytes"},{"name":"witness","type":"bytes","internalType":"bytes"},{"name":"locktime","type":"bytes4","internalType":"bytes4"},{"name":"intermediate_nodes","type":"bytes","internalType":"bytes"},{"name":"block_height","type":"uint256","internalType":"uint256"},{"name":"index","type":"uint256","internalType":"uint256"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"operator","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pendingOwner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"scriptPrefix","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"scriptSuffix","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"setDepositScript","inputs":[{"name":"_scriptPrefix","type":"bytes","internalType":"bytes"},{"name":"_scriptSuffix","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setOperator","inputs":[{"name":"_operator","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setSlashOrTakeScript","inputs":[{"name":"_slashOrTakeScript","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"slashOrTakeScript","inputs":[],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"txIdToDepositId","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[{"name":"txId","type":"bytes32","internalType":"bytes32"},{"name":"outputId","type":"bytes4","internalType":"bytes4"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"withdrawFillers","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdrawalUTXOs","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"txId","type":"bytes32","internalType":"bytes32"},{"name":"outputId","type":"bytes4","internalType":"bytes4"}],"stateMutability":"view"},{"type":"event","name":"Deposit","inputs":[{"name":"wtxId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"txId","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"depositId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DepositScriptUpdate","inputs":[{"name":"scriptPrefix","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"scriptSuffix","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"MaliciousOperatorMarked","inputs":[{"name":"operatorId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorUpdated","inputs":[{"name":"oldOperator","type":"address","indexed":false,"internalType":"address"},{"name":"newOperator","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferStarted","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"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":"SlashOrTakeScriptUpdate","inputs":[{"name":"slashOrTakeScript","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"WithdrawFillerDeclared","inputs":[{"name":"withdrawId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"withdrawFillerId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Withdrawal","inputs":[{"name":"utxo","type":"tuple","indexed":false,"internalType":"struct Bridge.UTXO","components":[{"name":"txId","type":"bytes32","internalType":"bytes32"},{"name":"outputId","type":"bytes4","internalType":"bytes4"}]},{"name":"index","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"timestamp","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"InvalidInitialization","inputs":[]},{"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"}]}],"bytecode":{"object":"0x6080604052348015600f57600080fd5b506132828061001f6000396000f3fe60806040526004361061019c5760003560e01c80638786dba7116100ec578063d761753e1161008a578063e613ae0011610064578063e613ae001461048e578063f119a9bd146104a9578063f2fde38b146104c9578063f8e655d2146104e957600080fd5b8063d761753e14610431578063dd95c7c614610459578063e30c39781461047957600080fd5b8063a41c5cf3116100c6578063a41c5cf3146103af578063b3ab15fb146103c4578063bafa9eb2146103e4578063c045577b1461040457600080fd5b80638786dba71461037257806387f8bf56146103855780638da5cb5b1461039a57600080fd5b8063570ca73511610159578063715018a611610133578063715018a61461031357806374ab4a8314610328578063781952a81461034857806379ba50971461035d57600080fd5b8063570ca735146102945780635d3e3176146102d15780635e3cc740146102f357600080fd5b806311e53a01146101a1578063158ef93e146101e1578063198546231461020b5780634126013714610220578063419759f514610240578063471ba1e314610256575b600080fd5b3480156101ad57600080fd5b506101ce6101bc3660046129ee565b60276020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101ed57600080fd5b506000546101fb9060ff1681565b60405190151581526020016101d8565b61021e610219366004612a4b565b610509565b005b34801561022c57600080fd5b5061021e61023b366004612afb565b6106e2565b34801561024c57600080fd5b506101ce60215481565b34801561026257600080fd5b506102766102713660046129ee565b6108ef565b604080519283526001600160e01b03199091166020830152016101d8565b3480156102a057600080fd5b506000546102b99061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101d8565b3480156102dd57600080fd5b506102e6610920565b6040516101d89190612b96565b3480156102ff57600080fd5b5061021e61030e366004612be2565b6109ae565b34801561031f57600080fd5b5061021e610d65565b34801561033457600080fd5b5061021e610343366004612c1e565b610d79565b34801561035457600080fd5b506026546101ce565b34801561036957600080fd5b5061021e610f4c565b61021e610380366004612c88565b610f94565b34801561039157600080fd5b506102e66110bb565b3480156103a657600080fd5b506102b96110c8565b3480156103bb57600080fd5b506102e66110fd565b3480156103d057600080fd5b5061021e6103df366004612cb4565b61110a565b3480156103f057600080fd5b506101fb6103ff3660046129ee565b61117b565b34801561041057600080fd5b506101ce61041f3660046129ee565b60286020526000908152604090205481565b34801561043d57600080fd5b506102b973deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b34801561046557600080fd5b5061021e610474366004612be2565b6111a6565b34801561048557600080fd5b506102b9611606565b34801561049a57600080fd5b506102b96001603160981b0181565b3480156104b557600080fd5b5061021e6104c4366004612cdd565b61162f565b3480156104d557600080fd5b5061021e6104e4366004612cb4565b6116a3565b3480156104f557600080fd5b5061021e610504366004612d1e565b611728565b82811461054f5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064015b60405180910390fd5b60215461055d908490612d97565b34146105a55760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b60265460005b848110156106da57600060405180604001604052808888858181106105d2576105d2612dae565b9050602002013581526020018686858181106105f0576105f0612dae565b90506020020160208101906106059190612dc4565b6001600160e01b03191690526026805460018101825560009190915281517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a359460029092029182015560208201517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909101805463ffffffff191660e09290921c91909117905590507f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada816106b98486612ddf565b426040516106c993929190612df2565b60405180910390a1506001016105ab565b505050505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146107455760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610546565b60005460ff16156107985760405162461bcd60e51b815260206004820152601f60248201527f436f6e747261637420697320616c726561647920696e697469616c697a6564006044820152606401610546565b806000036107e85760405162461bcd60e51b815260206004820152601a60248201527f4465706f73697420616d6f756e742063616e6e6f7420626520300000000000006044820152606401610546565b60008490036108095760405162461bcd60e51b815260040161054690612e20565b6000805460ff191660011790556023610823858783612ef0565b506024610831838583612ef0565b50602181905560008054610100600160a81b03191674deaddeaddeaddeaddeaddeaddeaddeaddeaddead001781556040805191825273deaddeaddeaddeaddeaddeaddeaddeaddeaddead60208301527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a17f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc858585856040516108e09493929190612fd8565b60405180910390a15050505050565b602681815481106108ff57600080fd5b60009182526020909120600290910201805460019091015490915060e01b82565b6025805461092d90612e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612e6d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b505050505081565b6109b7816117a2565b5060009050610a066109cc606084018461300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ac592505050565b915060009050610a63610a1c606085018561300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a5e925060019150869050613050565b611adc565b90506000610a7082611c54565b90506000610a88610a8383836020611cd6565b611d99565b90506000610aa9610a836020808651610aa19190613050565b869190611cd6565b600083815260276020526040812054919250819003610b015760405162461bcd60e51b815260206004820152601460248201527311195c1bdcda5d08191bc81b9bdd08195e1a5cdd60621b6044820152606401610546565b6000610b4d610b1360808a018a61300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250611e1e915050565b90506000610b5c826001611f01565b9050600060258054610b6d90612e6d565b915060009050610b7e838284611cd6565b9050610c148160258054610b9190612e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e6d565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050612085565b610c605760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736c6173684f7254616b65207363726970740000000000006044820152606401610546565b6000602881610c70600189613050565b815260200190815260200160002054905060008160001480610c9a5750610c968861215c565b8214155b905080610ce95760405162461bcd60e51b815260206004820152601960248201527f4f70657261746f72206973206e6f74206d616c6963696f7573000000000000006044820152606401610546565b600180896103e88110610cfe57610cfe612dae565b602091828204019190066101000a81548160ff0219169083151502179055507ff918cdaebea74c5a8c3b02d7404c162f507551b158202cedcba9b6a74eabdff288604051610d4e91815260200190565b60405180910390a150505050505050505050505050565b610d6d612169565b610d77600061219b565b565b610d82836117a2565b5060009050610dd3610d97604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506121d7915050565b90506000610de08261232a565b90506000610ded83612337565b9050600060268581548110610e0457610e04612dae565b60009182526020918290206040805180820190915260029290920201805480835260019091015460e01b6001600160e01b03191692820192909252915083148015610e665750816001600160e01b03191681602001516001600160e01b031916145b610ea65760405162461bcd60e51b81526020600482015260116024820152706e6f74206d61746368696e67205554584f60781b6044820152606401610546565b6000610eb86109cc60608a018a61300a565b915060009050610ece610a1c60608b018b61300a565b90506000610edb82611c54565b90506000610ee882611d99565b9050610ef38161215c565b60008a8152602860209081526040918290209290925580518b81529182018390527feedf47c2f61b040827944fd45e44ef6d742354b34e1af7dd99a56f444ec79347910160405180910390a15050505050505050505050565b3380610f56611606565b6001600160a01b031614610f885760405163118cdaa760e01b81526001600160a01b0382166004820152602401610546565b610f918161219b565b50565b6021543414610fdf5760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b6040805180820182528381526001600160e01b03198316602082019081526026805460018101825560009190915282517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594600283029081019190915591517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909201805463ffffffff191660e09390931c9290921790915591519091907f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada906110ad90849084904290612df2565b60405180910390a150505050565b6024805461092d90612e6d565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6023805461092d90612e6d565b611112612169565b60008054610100600160a81b0319166101006001600160a01b038481168281029390931793849055604080519290940416815260208101919091527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a150565b6001816103e8811061118c57600080fd5b60209182820401919006915054906101000a900460ff1681565b60005461010090046001600160a01b031633146112055760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f7420746865206f70657261746f720000000000006044820152606401610546565b600080611211836117a2565b915091508060011461125e5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481bdb99481a5b9c1d5d08185b1b1bddd95960521b6044820152606401610546565b60006113096112706020860186612dc4565b61127d604087018761300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112bf92505050606088018861300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113049250505060c0890160a08a01612dc4565b612344565b6000818152602760205260409020549091501561135d5760405162461bcd60e51b81526020600482015260126024820152711d1e125908185b1c9958591e481cdc195b9d60721b6044820152606401610546565b60226000815461136c90613063565b9182905550600082815260276020526040812091909155611393610b13608087018761300a565b905060006113a082611ac5565b915050806003146113eb5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207769746e657373206974656d7360581b6044820152606401610546565b60006113f8836001611f01565b905060006023805461140990612e6d565b91506000905061141a838284611cd6565b905061142d8160238054610b9190612e6d565b6114725760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590819195c1bdcda5d081cd8dc9a5c1d60521b6044820152606401610546565b60006114a66024805461148490612e6d565b86516114909250613050565b6024805461149d90612e6d565b87929150611cd6565b90506114b98160248054610b9190612e6d565b6114fd5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840e6c6e4d2e0e840e6eaccccd2f605b1b6044820152606401610546565b600061150885612374565b602254604080518d8152602081018c90526001600160a01b038416818301524260608201526080810192909252519192507fa82453ca34121b3ecb910d957824e27c5dc6465315949facd15fb72886490058919081900360a00190a16021546040516000916001600160a01b038416918381818185875af1925050503d80600081146115b0576040519150601f19603f3d011682016040523d82523d6000602084013e6115b5565b606091505b50509050806115f85760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610546565b505050505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c006110ed565b611637612169565b60008190036116585760405162461bcd60e51b815260040161054690612e20565b6025611665828483612ef0565b507f8578c80bdea3ff51431011ed88db9cb415de2cf64f9ed5e7137288268cbdeb2c828260405161169792919061307c565b60405180910390a15050565b6116ab612169565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556116ef6110c8565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b611730612169565b60008390036117515760405162461bcd60e51b815260040161054690612e20565b602361175e848683612ef0565b50602461176c828483612ef0565b507f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc848484846040516110ad9493929190612fd8565b600080806118026117b66020860186612dc4565b6117c66040870160208801613090565b6117d3604088018861300a565b6117e060608a018a61300a565b6117ed60808c018c61300a565b6117fd60c08e0160a08f01612dc4565b6123aa565b905061184e611814604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123de92505050565b61189a5760405162461bcd60e51b815260206004820152601d60248201527f56696e206973206e6f742070726f7065726c7920666f726d61747465640000006044820152606401610546565b6118e46118aa606086018661300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061248292505050565b6119305760405162461bcd60e51b815260206004820152601e60248201527f566f7574206973206e6f742070726f7065726c7920666f726d617474656400006044820152606401610546565b60006119426109cc604087018761300a565b91506119929050611956608087018761300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250612519915050565b6119e85760405162461bcd60e51b815260206004820152602160248201527f5769746e657373206973206e6f742070726f7065726c7920666f726d617474656044820152601960fa1b6064820152608401610546565b6001603160981b01634ffd344a60e087013584611a0860c08a018a61300a565b8a61010001356040518663ffffffff1660e01b8152600401611a2e9594939291906130ba565b602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906130ec565b611abb5760405162461bcd60e51b815260206004820152601b60248201527f5472616e73616374696f6e206973206e6f7420696e20626c6f636b00000000006044820152606401610546565b9094909350915050565b600080611ad383600061258e565b91509150915091565b6060600080611aea85611ac5565b909250905060018201611b0f5760405162461bcd60e51b81526004016105469061310e565b808410611b525760405162461bcd60e51b81526020600482015260116024820152702b37baba103932b0b21037bb32b9393ab760791b6044820152606401610546565b600080611b60846001612ddf565b905060005b86811015611bde57611b778883612730565b92506000198303611bca5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611bd48383612ddf565b9150600101611b65565b50611be98782612730565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611c47878284611cd6565b9450505050505b92915050565b606081600981518110611c6957611c69612dae565b6020910101516001600160f81b031916603560f91b14611c9757505060408051602081019091526000815290565b600082600a81518110611cac57611cac612dae565b01602001516001600160f81b031981169150611ccf908490600b9060f81c611cd6565b9392505050565b606081600003611cf55750604080516020810190915260008152611ccf565b6000611d018385612ddf565b90508381118015611d13575080855110155b611d555760405162461bcd60e51b8152602060048201526013602482015272536c696365206f7574206f6620626f756e647360681b6044820152606401610546565b604051915082604083010160405282825283850182038460208701018481015b80821015611d8e57815183830152602082019150611d75565b505050509392505050565b60008151600003611dac57506000919050565b81516020811115611e0a5760405162461bcd60e51b815260206004820152602260248201527f42797465732063616e6e6f74206265206d6f7265207468616e20333220627974604482015261657360f01b6064820152608401610546565b60209283015192036008029190911c919050565b606060008060005b84811015611e9757611e388683612794565b92506000198303611e835760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611e8d8383612ddf565b9150600101611e26565b50611ea28582612794565b91506000198203611eed5760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611ef8858284611cd6565b95945050505050565b6060600080611f0f85611ac5565b909250905060018201611f345760405162461bcd60e51b81526004016105469061310e565b808410611f765760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b600080611f84846001612ddf565b905060005b8681101561200f57611f9b888361258e565b909550925060018301611fe55760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b82611ff1866001612ddf565b611ffb9190612ddf565b6120059083612ddf565b9150600101611f89565b5061201a878261258e565b9094509150600182016120645760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b611c47816120728685612ddf565b61207d906001612ddf565b899190611cd6565b8151815160009190811461209d576000915050611c4e565b60206000805b8383116120d357505084810151848201516020909201918082146120ce576000945050505050611c4e565b6120a3565b60006120e0602085613050565b90505b8481101561214e578681815181106120fd576120fd612dae565b602001015160f81c60f81b6001600160f81b03191688828151811061212457612124612dae565b01602001516001600160f81b0319161461214657600095505050505050611c4e565b6001016120e3565b506001979650505050505050565b6000611c4e826001612ddf565b336121726110c8565b6001600160a01b031614610d775760405163118cdaa760e01b8152336004820152602401610546565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556121d382612836565b5050565b60606000806121e585611ac5565b90925090506001820161220a5760405162461bcd60e51b81526004016105469061310e565b80841061224c5760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b60008061225a846001612ddf565b905060005b868110156122d25761227188836128a7565b925060001983036122be5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6122c88383612ddf565b915060010161225f565b506122dd87826128a7565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6020810151600090611c4e565b6000611c4e8260206128f0565b6000611ef8858585856040516020016123609493929190613150565b6040516020818303038152906040526128ff565b6000806023805461238490612e6d565b91506000905061239684836014611cd6565b61239f906131ad565b60601c949350505050565b60006123d08a8a8a8a8a8a8a8a8a60405160200161236099989796959493929190613200565b9a9950505050505050505050565b60008060006123ec84611ac5565b90925090508015806123ff575060001982145b1561240e575060009392505050565b600061241b836001612ddf565b905060005b82811015612475578551821061243c5750600095945050505050565b600061244887846128a7565b90506000198103612460575060009695505050505050565b61246a8184612ddf565b925050600101612420565b5093519093149392505050565b600080600061249084611ac5565b90925090508015806124a3575060001982145b156124b2575060009392505050565b60006124bf836001612ddf565b905060005b8281101561247557855182106124e05750600095945050505050565b60006124ec8784612730565b90506000198103612504575060009695505050505050565b61250e8184612ddf565b9250506001016124c4565b60008160000361252b57506000611c4e565b6000805b83811015612582578451821061254a57600092505050611c4e565b60006125568684612794565b9050600019810361256d5760009350505050611c4e565b6125778184612ddf565b92505060010161252f565b50835114905092915050565b600080600061259d8585612926565b90508060ff166000036125d25760008585815181106125be576125be612dae565b016020015190935060f81c91506127299050565b836125de826001613269565b60ff166125eb9190612ddf565b855110156126025760001960009250925050612729565b60008160ff166002036126465761263b612627612620876001612ddf565b88906128f0565b62ffff0060e882901c1660f89190911c1790565b61ffff16905061271f565b8160ff1660040361269557612688612662612620876001612ddf565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b63ffffffff16905061271f565b8160ff1660080361271f576127136126b1612620876001612ddf565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b6001600160401b031666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b6001600160401b031690505b60ff909116925090505b9250929050565b600061273d826009612ddf565b8351101561274e5750600019611c4e565b60008061276585612760866008612ddf565b61258e565b90925090506001820161277e5760001992505050611c4e565b8061278a836009612ddf565b611ef89190612ddf565b60008060006127a3858561258e565b9092509050600182016127bc5760001992505050611c4e565b6000806127ca846001612ddf565b905060005b8381101561282b576127e588612760848a612ddf565b9095509250600183016128015760001995505050505050611c4e565b8261280d866001612ddf565b6128179190612ddf565b6128219083612ddf565b91506001016127cf565b509695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60008060006128b685856129ac565b9092509050600182016128cf5760001992505050611c4e565b806128db836025612ddf565b6128e59190612ddf565b611ef8906004612ddf565b6000611ccf8383016020015190565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b600082828151811061293a5761293a612dae565b016020015160f81c60ff0361295157506008611c4e565b82828151811061296357612963612dae565b016020015160f81c60fe0361297a57506004611c4e565b82828151811061298c5761298c612dae565b016020015160f81c60fd036129a357506002611c4e565b50600092915050565b6000806129ba836025612ddf565b845110156129cf575060001990506000612729565b6000806129e186612760876024612ddf565b9097909650945050505050565b600060208284031215612a0057600080fd5b5035919050565b60008083601f840112612a1957600080fd5b5081356001600160401b03811115612a3057600080fd5b6020830191508360208260051b850101111561272957600080fd5b60008060008060408587031215612a6157600080fd5b84356001600160401b03811115612a7757600080fd5b612a8387828801612a07565b90955093505060208501356001600160401b03811115612aa257600080fd5b612aae87828801612a07565b95989497509550505050565b60008083601f840112612acc57600080fd5b5081356001600160401b03811115612ae357600080fd5b60208301915083602082850101111561272957600080fd5b600080600080600060608688031215612b1357600080fd5b85356001600160401b03811115612b2957600080fd5b612b3588828901612aba565b90965094505060208601356001600160401b03811115612b5457600080fd5b612b6088828901612aba565b96999598509660400135949350505050565b60005b83811015612b8d578181015183820152602001612b75565b50506000910152565b6020815260008251806020840152612bb5816040850160208701612b72565b601f01601f19169190910160400192915050565b60006101208284031215612bdc57600080fd5b50919050565b600060208284031215612bf457600080fd5b81356001600160401b03811115612c0a57600080fd5b612c1684828501612bc9565b949350505050565b600080600060608486031215612c3357600080fd5b83356001600160401b03811115612c4957600080fd5b612c5586828701612bc9565b9660208601359650604090950135949350505050565b80356001600160e01b031981168114612c8357600080fd5b919050565b60008060408385031215612c9b57600080fd5b82359150612cab60208401612c6b565b90509250929050565b600060208284031215612cc657600080fd5b81356001600160a01b0381168114611ccf57600080fd5b60008060208385031215612cf057600080fd5b82356001600160401b03811115612d0657600080fd5b612d1285828601612aba565b90969095509350505050565b60008060008060408587031215612d3457600080fd5b84356001600160401b03811115612d4a57600080fd5b612d5687828801612aba565b90955093505060208501356001600160401b03811115612d7557600080fd5b612aae87828801612aba565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417611c4e57611c4e612d81565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612dd657600080fd5b611ccf82612c6b565b80820180821115611c4e57611c4e612d81565b835181526020938401516001600160e01b031916938101939093526040830191909152606082015260800190565b6020808252601e908201527f4465706f736974207363726970742063616e6e6f7420626520656d7074790000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680612e8157607f821691505b602082108103612bdc57634e487b7160e01b600052602260045260246000fd5b601f821115612eeb57806000526020600020601f840160051c81016020851015612ec85750805b601f840160051c820191505b81811015612ee85760008155600101612ed4565b50505b505050565b6001600160401b03831115612f0757612f07612e57565b612f1b83612f158354612e6d565b83612ea1565b6000601f841160018114612f4f5760008515612f375750838201355b600019600387901b1c1916600186901b178355612ee8565b600083815260209020601f19861690835b82811015612f805786850135825560209485019460019092019101612f60565b5086821015612f9d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000612fec604083018688612faf565b8281036020840152612fff818587612faf565b979650505050505050565b6000808335601e1984360301811261302157600080fd5b8301803591506001600160401b0382111561303b57600080fd5b60200191503681900382131561272957600080fd5b81810381811115611c4e57611c4e612d81565b60006001820161307557613075612d81565b5060010190565b602081526000612c16602083018486612faf565b6000602082840312156130a257600080fd5b81356001600160f01b031981168114611ccf57600080fd5b8581528460208201526080604082015260006130da608083018587612faf565b90508260608301529695505050505050565b6000602082840312156130fe57600080fd5b81518015158114611ccf57600080fd5b60208082526022908201527f52656164206f76657272756e20647572696e6720566172496e742070617273696040820152616e6760f01b606082015260800190565b6001600160e01b0319851681528351600090613173816004850160208901612b72565b84519083019061318a816004840160208901612b72565b6001600160e01b0319949094169301600481019390935250506008019392505050565b805160208201516bffffffffffffffffffffffff198116919060148210156131f9576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b6001600160e01b03198a1681526001600160f01b031989166004820152868860068301376000878201600681016000815287898237506000908701600601908152848682376001600160e01b031993909316929093019182525060040198975050505050505050565b60ff8181168382160190811115611c4e57611c4e612d8156","sourceMap":"430:14139:46:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361061019c5760003560e01c80638786dba7116100ec578063d761753e1161008a578063e613ae0011610064578063e613ae001461048e578063f119a9bd146104a9578063f2fde38b146104c9578063f8e655d2146104e957600080fd5b8063d761753e14610431578063dd95c7c614610459578063e30c39781461047957600080fd5b8063a41c5cf3116100c6578063a41c5cf3146103af578063b3ab15fb146103c4578063bafa9eb2146103e4578063c045577b1461040457600080fd5b80638786dba71461037257806387f8bf56146103855780638da5cb5b1461039a57600080fd5b8063570ca73511610159578063715018a611610133578063715018a61461031357806374ab4a8314610328578063781952a81461034857806379ba50971461035d57600080fd5b8063570ca735146102945780635d3e3176146102d15780635e3cc740146102f357600080fd5b806311e53a01146101a1578063158ef93e146101e1578063198546231461020b5780634126013714610220578063419759f514610240578063471ba1e314610256575b600080fd5b3480156101ad57600080fd5b506101ce6101bc3660046129ee565b60276020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101ed57600080fd5b506000546101fb9060ff1681565b60405190151581526020016101d8565b61021e610219366004612a4b565b610509565b005b34801561022c57600080fd5b5061021e61023b366004612afb565b6106e2565b34801561024c57600080fd5b506101ce60215481565b34801561026257600080fd5b506102766102713660046129ee565b6108ef565b604080519283526001600160e01b03199091166020830152016101d8565b3480156102a057600080fd5b506000546102b99061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101d8565b3480156102dd57600080fd5b506102e6610920565b6040516101d89190612b96565b3480156102ff57600080fd5b5061021e61030e366004612be2565b6109ae565b34801561031f57600080fd5b5061021e610d65565b34801561033457600080fd5b5061021e610343366004612c1e565b610d79565b34801561035457600080fd5b506026546101ce565b34801561036957600080fd5b5061021e610f4c565b61021e610380366004612c88565b610f94565b34801561039157600080fd5b506102e66110bb565b3480156103a657600080fd5b506102b96110c8565b3480156103bb57600080fd5b506102e66110fd565b3480156103d057600080fd5b5061021e6103df366004612cb4565b61110a565b3480156103f057600080fd5b506101fb6103ff3660046129ee565b61117b565b34801561041057600080fd5b506101ce61041f3660046129ee565b60286020526000908152604090205481565b34801561043d57600080fd5b506102b973deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b34801561046557600080fd5b5061021e610474366004612be2565b6111a6565b34801561048557600080fd5b506102b9611606565b34801561049a57600080fd5b506102b96001603160981b0181565b3480156104b557600080fd5b5061021e6104c4366004612cdd565b61162f565b3480156104d557600080fd5b5061021e6104e4366004612cb4565b6116a3565b3480156104f557600080fd5b5061021e610504366004612d1e565b611728565b82811461054f5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064015b60405180910390fd5b60215461055d908490612d97565b34146105a55760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b60265460005b848110156106da57600060405180604001604052808888858181106105d2576105d2612dae565b9050602002013581526020018686858181106105f0576105f0612dae565b90506020020160208101906106059190612dc4565b6001600160e01b03191690526026805460018101825560009190915281517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a359460029092029182015560208201517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909101805463ffffffff191660e09290921c91909117905590507f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada816106b98486612ddf565b426040516106c993929190612df2565b60405180910390a1506001016105ab565b505050505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146107455760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610546565b60005460ff16156107985760405162461bcd60e51b815260206004820152601f60248201527f436f6e747261637420697320616c726561647920696e697469616c697a6564006044820152606401610546565b806000036107e85760405162461bcd60e51b815260206004820152601a60248201527f4465706f73697420616d6f756e742063616e6e6f7420626520300000000000006044820152606401610546565b60008490036108095760405162461bcd60e51b815260040161054690612e20565b6000805460ff191660011790556023610823858783612ef0565b506024610831838583612ef0565b50602181905560008054610100600160a81b03191674deaddeaddeaddeaddeaddeaddeaddeaddeaddead001781556040805191825273deaddeaddeaddeaddeaddeaddeaddeaddeaddead60208301527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a17f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc858585856040516108e09493929190612fd8565b60405180910390a15050505050565b602681815481106108ff57600080fd5b60009182526020909120600290910201805460019091015490915060e01b82565b6025805461092d90612e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612e6d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b505050505081565b6109b7816117a2565b5060009050610a066109cc606084018461300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ac592505050565b915060009050610a63610a1c606085018561300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a5e925060019150869050613050565b611adc565b90506000610a7082611c54565b90506000610a88610a8383836020611cd6565b611d99565b90506000610aa9610a836020808651610aa19190613050565b869190611cd6565b600083815260276020526040812054919250819003610b015760405162461bcd60e51b815260206004820152601460248201527311195c1bdcda5d08191bc81b9bdd08195e1a5cdd60621b6044820152606401610546565b6000610b4d610b1360808a018a61300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250611e1e915050565b90506000610b5c826001611f01565b9050600060258054610b6d90612e6d565b915060009050610b7e838284611cd6565b9050610c148160258054610b9190612e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e6d565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050612085565b610c605760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736c6173684f7254616b65207363726970740000000000006044820152606401610546565b6000602881610c70600189613050565b815260200190815260200160002054905060008160001480610c9a5750610c968861215c565b8214155b905080610ce95760405162461bcd60e51b815260206004820152601960248201527f4f70657261746f72206973206e6f74206d616c6963696f7573000000000000006044820152606401610546565b600180896103e88110610cfe57610cfe612dae565b602091828204019190066101000a81548160ff0219169083151502179055507ff918cdaebea74c5a8c3b02d7404c162f507551b158202cedcba9b6a74eabdff288604051610d4e91815260200190565b60405180910390a150505050505050505050505050565b610d6d612169565b610d77600061219b565b565b610d82836117a2565b5060009050610dd3610d97604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506121d7915050565b90506000610de08261232a565b90506000610ded83612337565b9050600060268581548110610e0457610e04612dae565b60009182526020918290206040805180820190915260029290920201805480835260019091015460e01b6001600160e01b03191692820192909252915083148015610e665750816001600160e01b03191681602001516001600160e01b031916145b610ea65760405162461bcd60e51b81526020600482015260116024820152706e6f74206d61746368696e67205554584f60781b6044820152606401610546565b6000610eb86109cc60608a018a61300a565b915060009050610ece610a1c60608b018b61300a565b90506000610edb82611c54565b90506000610ee882611d99565b9050610ef38161215c565b60008a8152602860209081526040918290209290925580518b81529182018390527feedf47c2f61b040827944fd45e44ef6d742354b34e1af7dd99a56f444ec79347910160405180910390a15050505050505050505050565b3380610f56611606565b6001600160a01b031614610f885760405163118cdaa760e01b81526001600160a01b0382166004820152602401610546565b610f918161219b565b50565b6021543414610fdf5760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b6040805180820182528381526001600160e01b03198316602082019081526026805460018101825560009190915282517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594600283029081019190915591517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909201805463ffffffff191660e09390931c9290921790915591519091907f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada906110ad90849084904290612df2565b60405180910390a150505050565b6024805461092d90612e6d565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6023805461092d90612e6d565b611112612169565b60008054610100600160a81b0319166101006001600160a01b038481168281029390931793849055604080519290940416815260208101919091527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a150565b6001816103e8811061118c57600080fd5b60209182820401919006915054906101000a900460ff1681565b60005461010090046001600160a01b031633146112055760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f7420746865206f70657261746f720000000000006044820152606401610546565b600080611211836117a2565b915091508060011461125e5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481bdb99481a5b9c1d5d08185b1b1bddd95960521b6044820152606401610546565b60006113096112706020860186612dc4565b61127d604087018761300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112bf92505050606088018861300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113049250505060c0890160a08a01612dc4565b612344565b6000818152602760205260409020549091501561135d5760405162461bcd60e51b81526020600482015260126024820152711d1e125908185b1c9958591e481cdc195b9d60721b6044820152606401610546565b60226000815461136c90613063565b9182905550600082815260276020526040812091909155611393610b13608087018761300a565b905060006113a082611ac5565b915050806003146113eb5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207769746e657373206974656d7360581b6044820152606401610546565b60006113f8836001611f01565b905060006023805461140990612e6d565b91506000905061141a838284611cd6565b905061142d8160238054610b9190612e6d565b6114725760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590819195c1bdcda5d081cd8dc9a5c1d60521b6044820152606401610546565b60006114a66024805461148490612e6d565b86516114909250613050565b6024805461149d90612e6d565b87929150611cd6565b90506114b98160248054610b9190612e6d565b6114fd5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840e6c6e4d2e0e840e6eaccccd2f605b1b6044820152606401610546565b600061150885612374565b602254604080518d8152602081018c90526001600160a01b038416818301524260608201526080810192909252519192507fa82453ca34121b3ecb910d957824e27c5dc6465315949facd15fb72886490058919081900360a00190a16021546040516000916001600160a01b038416918381818185875af1925050503d80600081146115b0576040519150601f19603f3d011682016040523d82523d6000602084013e6115b5565b606091505b50509050806115f85760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610546565b505050505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c006110ed565b611637612169565b60008190036116585760405162461bcd60e51b815260040161054690612e20565b6025611665828483612ef0565b507f8578c80bdea3ff51431011ed88db9cb415de2cf64f9ed5e7137288268cbdeb2c828260405161169792919061307c565b60405180910390a15050565b6116ab612169565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556116ef6110c8565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b611730612169565b60008390036117515760405162461bcd60e51b815260040161054690612e20565b602361175e848683612ef0565b50602461176c828483612ef0565b507f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc848484846040516110ad9493929190612fd8565b600080806118026117b66020860186612dc4565b6117c66040870160208801613090565b6117d3604088018861300a565b6117e060608a018a61300a565b6117ed60808c018c61300a565b6117fd60c08e0160a08f01612dc4565b6123aa565b905061184e611814604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123de92505050565b61189a5760405162461bcd60e51b815260206004820152601d60248201527f56696e206973206e6f742070726f7065726c7920666f726d61747465640000006044820152606401610546565b6118e46118aa606086018661300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061248292505050565b6119305760405162461bcd60e51b815260206004820152601e60248201527f566f7574206973206e6f742070726f7065726c7920666f726d617474656400006044820152606401610546565b60006119426109cc604087018761300a565b91506119929050611956608087018761300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250612519915050565b6119e85760405162461bcd60e51b815260206004820152602160248201527f5769746e657373206973206e6f742070726f7065726c7920666f726d617474656044820152601960fa1b6064820152608401610546565b6001603160981b01634ffd344a60e087013584611a0860c08a018a61300a565b8a61010001356040518663ffffffff1660e01b8152600401611a2e9594939291906130ba565b602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906130ec565b611abb5760405162461bcd60e51b815260206004820152601b60248201527f5472616e73616374696f6e206973206e6f7420696e20626c6f636b00000000006044820152606401610546565b9094909350915050565b600080611ad383600061258e565b91509150915091565b6060600080611aea85611ac5565b909250905060018201611b0f5760405162461bcd60e51b81526004016105469061310e565b808410611b525760405162461bcd60e51b81526020600482015260116024820152702b37baba103932b0b21037bb32b9393ab760791b6044820152606401610546565b600080611b60846001612ddf565b905060005b86811015611bde57611b778883612730565b92506000198303611bca5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611bd48383612ddf565b9150600101611b65565b50611be98782612730565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611c47878284611cd6565b9450505050505b92915050565b606081600981518110611c6957611c69612dae565b6020910101516001600160f81b031916603560f91b14611c9757505060408051602081019091526000815290565b600082600a81518110611cac57611cac612dae565b01602001516001600160f81b031981169150611ccf908490600b9060f81c611cd6565b9392505050565b606081600003611cf55750604080516020810190915260008152611ccf565b6000611d018385612ddf565b90508381118015611d13575080855110155b611d555760405162461bcd60e51b8152602060048201526013602482015272536c696365206f7574206f6620626f756e647360681b6044820152606401610546565b604051915082604083010160405282825283850182038460208701018481015b80821015611d8e57815183830152602082019150611d75565b505050509392505050565b60008151600003611dac57506000919050565b81516020811115611e0a5760405162461bcd60e51b815260206004820152602260248201527f42797465732063616e6e6f74206265206d6f7265207468616e20333220627974604482015261657360f01b6064820152608401610546565b60209283015192036008029190911c919050565b606060008060005b84811015611e9757611e388683612794565b92506000198303611e835760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611e8d8383612ddf565b9150600101611e26565b50611ea28582612794565b91506000198203611eed5760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611ef8858284611cd6565b95945050505050565b6060600080611f0f85611ac5565b909250905060018201611f345760405162461bcd60e51b81526004016105469061310e565b808410611f765760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b600080611f84846001612ddf565b905060005b8681101561200f57611f9b888361258e565b909550925060018301611fe55760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b82611ff1866001612ddf565b611ffb9190612ddf565b6120059083612ddf565b9150600101611f89565b5061201a878261258e565b9094509150600182016120645760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b611c47816120728685612ddf565b61207d906001612ddf565b899190611cd6565b8151815160009190811461209d576000915050611c4e565b60206000805b8383116120d357505084810151848201516020909201918082146120ce576000945050505050611c4e565b6120a3565b60006120e0602085613050565b90505b8481101561214e578681815181106120fd576120fd612dae565b602001015160f81c60f81b6001600160f81b03191688828151811061212457612124612dae565b01602001516001600160f81b0319161461214657600095505050505050611c4e565b6001016120e3565b506001979650505050505050565b6000611c4e826001612ddf565b336121726110c8565b6001600160a01b031614610d775760405163118cdaa760e01b8152336004820152602401610546565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556121d382612836565b5050565b60606000806121e585611ac5565b90925090506001820161220a5760405162461bcd60e51b81526004016105469061310e565b80841061224c5760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b60008061225a846001612ddf565b905060005b868110156122d25761227188836128a7565b925060001983036122be5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6122c88383612ddf565b915060010161225f565b506122dd87826128a7565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6020810151600090611c4e565b6000611c4e8260206128f0565b6000611ef8858585856040516020016123609493929190613150565b6040516020818303038152906040526128ff565b6000806023805461238490612e6d565b91506000905061239684836014611cd6565b61239f906131ad565b60601c949350505050565b60006123d08a8a8a8a8a8a8a8a8a60405160200161236099989796959493929190613200565b9a9950505050505050505050565b60008060006123ec84611ac5565b90925090508015806123ff575060001982145b1561240e575060009392505050565b600061241b836001612ddf565b905060005b82811015612475578551821061243c5750600095945050505050565b600061244887846128a7565b90506000198103612460575060009695505050505050565b61246a8184612ddf565b925050600101612420565b5093519093149392505050565b600080600061249084611ac5565b90925090508015806124a3575060001982145b156124b2575060009392505050565b60006124bf836001612ddf565b905060005b8281101561247557855182106124e05750600095945050505050565b60006124ec8784612730565b90506000198103612504575060009695505050505050565b61250e8184612ddf565b9250506001016124c4565b60008160000361252b57506000611c4e565b6000805b83811015612582578451821061254a57600092505050611c4e565b60006125568684612794565b9050600019810361256d5760009350505050611c4e565b6125778184612ddf565b92505060010161252f565b50835114905092915050565b600080600061259d8585612926565b90508060ff166000036125d25760008585815181106125be576125be612dae565b016020015190935060f81c91506127299050565b836125de826001613269565b60ff166125eb9190612ddf565b855110156126025760001960009250925050612729565b60008160ff166002036126465761263b612627612620876001612ddf565b88906128f0565b62ffff0060e882901c1660f89190911c1790565b61ffff16905061271f565b8160ff1660040361269557612688612662612620876001612ddf565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b63ffffffff16905061271f565b8160ff1660080361271f576127136126b1612620876001612ddf565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b6001600160401b031666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b6001600160401b031690505b60ff909116925090505b9250929050565b600061273d826009612ddf565b8351101561274e5750600019611c4e565b60008061276585612760866008612ddf565b61258e565b90925090506001820161277e5760001992505050611c4e565b8061278a836009612ddf565b611ef89190612ddf565b60008060006127a3858561258e565b9092509050600182016127bc5760001992505050611c4e565b6000806127ca846001612ddf565b905060005b8381101561282b576127e588612760848a612ddf565b9095509250600183016128015760001995505050505050611c4e565b8261280d866001612ddf565b6128179190612ddf565b6128219083612ddf565b91506001016127cf565b509695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60008060006128b685856129ac565b9092509050600182016128cf5760001992505050611c4e565b806128db836025612ddf565b6128e59190612ddf565b611ef8906004612ddf565b6000611ccf8383016020015190565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b600082828151811061293a5761293a612dae565b016020015160f81c60ff0361295157506008611c4e565b82828151811061296357612963612dae565b016020015160f81c60fe0361297a57506004611c4e565b82828151811061298c5761298c612dae565b016020015160f81c60fd036129a357506002611c4e565b50600092915050565b6000806129ba836025612ddf565b845110156129cf575060001990506000612729565b6000806129e186612760876024612ddf565b9097909650945050505050565b600060208284031215612a0057600080fd5b5035919050565b60008083601f840112612a1957600080fd5b5081356001600160401b03811115612a3057600080fd5b6020830191508360208260051b850101111561272957600080fd5b60008060008060408587031215612a6157600080fd5b84356001600160401b03811115612a7757600080fd5b612a8387828801612a07565b90955093505060208501356001600160401b03811115612aa257600080fd5b612aae87828801612a07565b95989497509550505050565b60008083601f840112612acc57600080fd5b5081356001600160401b03811115612ae357600080fd5b60208301915083602082850101111561272957600080fd5b600080600080600060608688031215612b1357600080fd5b85356001600160401b03811115612b2957600080fd5b612b3588828901612aba565b90965094505060208601356001600160401b03811115612b5457600080fd5b612b6088828901612aba565b96999598509660400135949350505050565b60005b83811015612b8d578181015183820152602001612b75565b50506000910152565b6020815260008251806020840152612bb5816040850160208701612b72565b601f01601f19169190910160400192915050565b60006101208284031215612bdc57600080fd5b50919050565b600060208284031215612bf457600080fd5b81356001600160401b03811115612c0a57600080fd5b612c1684828501612bc9565b949350505050565b600080600060608486031215612c3357600080fd5b83356001600160401b03811115612c4957600080fd5b612c5586828701612bc9565b9660208601359650604090950135949350505050565b80356001600160e01b031981168114612c8357600080fd5b919050565b60008060408385031215612c9b57600080fd5b82359150612cab60208401612c6b565b90509250929050565b600060208284031215612cc657600080fd5b81356001600160a01b0381168114611ccf57600080fd5b60008060208385031215612cf057600080fd5b82356001600160401b03811115612d0657600080fd5b612d1285828601612aba565b90969095509350505050565b60008060008060408587031215612d3457600080fd5b84356001600160401b03811115612d4a57600080fd5b612d5687828801612aba565b90955093505060208501356001600160401b03811115612d7557600080fd5b612aae87828801612aba565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417611c4e57611c4e612d81565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612dd657600080fd5b611ccf82612c6b565b80820180821115611c4e57611c4e612d81565b835181526020938401516001600160e01b031916938101939093526040830191909152606082015260800190565b6020808252601e908201527f4465706f736974207363726970742063616e6e6f7420626520656d7074790000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680612e8157607f821691505b602082108103612bdc57634e487b7160e01b600052602260045260246000fd5b601f821115612eeb57806000526020600020601f840160051c81016020851015612ec85750805b601f840160051c820191505b81811015612ee85760008155600101612ed4565b50505b505050565b6001600160401b03831115612f0757612f07612e57565b612f1b83612f158354612e6d565b83612ea1565b6000601f841160018114612f4f5760008515612f375750838201355b600019600387901b1c1916600186901b178355612ee8565b600083815260209020601f19861690835b82811015612f805786850135825560209485019460019092019101612f60565b5086821015612f9d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000612fec604083018688612faf565b8281036020840152612fff818587612faf565b979650505050505050565b6000808335601e1984360301811261302157600080fd5b8301803591506001600160401b0382111561303b57600080fd5b60200191503681900382131561272957600080fd5b81810381811115611c4e57611c4e612d81565b60006001820161307557613075612d81565b5060010190565b602081526000612c16602083018486612faf565b6000602082840312156130a257600080fd5b81356001600160f01b031981168114611ccf57600080fd5b8581528460208201526080604082015260006130da608083018587612faf565b90508260608301529695505050505050565b6000602082840312156130fe57600080fd5b81518015158114611ccf57600080fd5b60208082526022908201527f52656164206f76657272756e20647572696e6720566172496e742070617273696040820152616e6760f01b606082015260800190565b6001600160e01b0319851681528351600090613173816004850160208901612b72565b84519083019061318a816004840160208901612b72565b6001600160e01b0319949094169301600481019390935250506008019392505050565b805160208201516bffffffffffffffffffffffff198116919060148210156131f9576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b6001600160e01b03198a1681526001600160f01b031989166004820152868860068301376000878201600681016000815287898237506000908701600601908152848682376001600160e01b031993909316929093019182525060040198975050505050505050565b60ff8181168382160190811115611c4e57611c4e612d8156","sourceMap":"430:14139:46:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1392:50;;;;;;;;;;-1:-1:-1;1392:50:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;391:25:58;;;379:2;364:18;1392:50:46;;;;;;;;1094:23;;;;;;;;;;-1:-1:-1;1094:23:46;;;;;;;;;;;592:14:58;;585:22;567:41;;555:2;540:18;1094:23:46;427:187:58;7652:595:46;;;;;;:::i;:::-;;:::i;:::-;;2630:769;;;;;;;;;;-1:-1:-1;2630:769:46;;;;;:::i;:::-;;:::i;1195:28::-;;;;;;;;;;;;;;;;1357:29;;;;;;;;;;-1:-1:-1;1357:29:46;;;;;:::i;:::-;;:::i;:::-;;;;3349:25:58;;;-1:-1:-1;;;;;;3410:33:58;;;3405:2;3390:18;;3383:61;3322:18;1357:29:46;3177:273:58;1123:23:46;;;;;;;;;;-1:-1:-1;1123:23:46;;;;;;;-1:-1:-1;;;;;1123:23:46;;;;;;-1:-1:-1;;;;;3619:32:58;;;3601:51;;3589:2;3574:18;1123:23:46;3455:203:58;1321:30:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10319:1463::-;;;;;;;;;;-1:-1:-1;10319:1463:46;;;;;:::i;:::-;;:::i;3155:101:29:-;;;;;;;;;;;;;:::i;9080:966:46:-;;;;;;;;;;-1:-1:-1;9080:966:46;;;;;:::i;:::-;;:::i;8310:108::-;;;;;;;;;;-1:-1:-1;8389:15:46;:22;8310:108;;2774:229:28;;;;;;;;;;;;;:::i;6936:385:46:-;;;;;;:::i;:::-;;:::i;1290:25::-;;;;;;;;;;;;;:::i;2441:144:29:-;;;;;;;;;;;;;:::i;1259:25:46:-;;;;;;;;;;;;;:::i;8561:147::-;;;;;;;;;;-1:-1:-1;8561:147:46;;;;;:::i;:::-;;:::i;1152:37::-;;;;;;;;;;-1:-1:-1;1152:37:46;;;;;:::i;:::-;;:::i;1448:50::-;;;;;;;;;;-1:-1:-1;1448:50:46;;;;;:::i;:::-;;;;;;;;;;;;;;996:91;;;;;;;;;;;;1044:42;996:91;;4826:1772;;;;;;;;;;-1:-1:-1;4826:1772:46;;;;;:::i;:::-;;:::i;1680:168:28:-;;;;;;;;;;;;;:::i;869:121:46:-;;;;;;;;;;;;-1:-1:-1;;;;;869:121:46;;4318:282;;;;;;;;;;-1:-1:-1;4318:282:46;;;;;:::i;:::-;;:::i;2041:247:28:-;;;;;;;;;;-1:-1:-1;2041:247:28;;;;;:::i;:::-;;:::i;3799:332:46:-;;;;;;;;;;-1:-1:-1;3799:332:46;;;;;:::i;:::-;;:::i;7652:595::-;7765:32;;;7757:60;;;;-1:-1:-1;;;7757:60:46;;7827:2:58;7757:60:46;;;7809:21:58;7866:2;7846:18;;;7839:30;-1:-1:-1;;;7885:18:58;;;7878:45;7940:18;;7757:60:46;;;;;;;;;7848:13;;:28;;7864:5;;7848:28;:::i;:::-;7835:9;:41;7827:77;;;;-1:-1:-1;;;7827:77:46;;8476:2:58;7827:77:46;;;8458:21:58;8515:2;8495:18;;;8488:30;-1:-1:-1;;;8534:18:58;;;8527:53;8597:18;;7827:77:46;8274:347:58;7827:77:46;7930:15;:22;7914:13;7962:279;7979:16;;;7962:279;;;8016:16;8035:92;;;;;;;;8064:5;;8070:1;8064:8;;;;;;;:::i;:::-;;;;;;;8035:92;;;;8100:9;;8110:1;8100:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;8035:92:46;;;8141:15;:26;;;;;;;-1:-1:-1;8141:26:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8141:26:46;;;;;;;;;;;;;-1:-1:-1;8186:44:46;8141:26;8203:9;8211:1;8203:5;:9;:::i;:::-;8214:15;8186:44;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;7997:3:46;;7962:279;;;;7747:500;7652:595;;;;:::o;2630:769::-;2057:10;1044:42;2057:27;2049:71;;;;-1:-1:-1;;;2049:71:46;;9747:2:58;2049:71:46;;;9729:21:58;9786:2;9766:18;;;9759:30;9825:33;9805:18;;;9798:61;9876:18;;2049:71:46;9545:355:58;2049:71:46;2773:11:::1;::::0;::::1;;2772:12;2764:56;;;::::0;-1:-1:-1;;;2764:56:46;;10107:2:58;2764:56:46::1;::::0;::::1;10089:21:58::0;10146:2;10126:18;;;10119:30;10185:33;10165:18;;;10158:61;10236:18;;2764:56:46::1;9905:355:58::0;2764:56:46::1;2838:14;2856:1;2838:19:::0;2830:58:::1;;;::::0;-1:-1:-1;;;2830:58:46;;10467:2:58;2830:58:46::1;::::0;::::1;10449:21:58::0;10506:2;10486:18;;;10479:30;10545:28;10525:18;;;10518:56;10591:18;;2830:58:46::1;10265:350:58::0;2830:58:46::1;2930:1;2906:25:::0;;;2898:68:::1;;;;-1:-1:-1::0;;;2898:68:46::1;;;;;;;:::i;:::-;2977:11;:18:::0;;-1:-1:-1;;2977:18:46::1;2991:4;2977:18;::::0;;3005:12:::1;:28;3020:13:::0;;3005:12;:28:::1;:::i;:::-;-1:-1:-1::0;3043:12:46::1;:28;3058:13:::0;;3043:12;:28:::1;:::i;:::-;-1:-1:-1::0;3081:13:46::1;:30:::0;;;3246:8:::1;:24:::0;;-1:-1:-1;;;;;;3246:24:46::1;::::0;::::1;::::0;;3286:42:::1;::::0;;13695:51:58;;;1044:42:46::1;13777:2:58::0;13762:18;;13755:60;3286:42:46::1;::::0;13668:18:58;3286:42:46::1;;;;;;;3343:49;3363:13;;3378;;3343:49;;;;;;;;;:::i;:::-;;;;;;;;2630:769:::0;;;;;:::o;1357:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1357:29:46;;;:::o;1321:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10319:1463::-;10411:40;10437:13;10411:25;:40::i;:::-;-1:-1:-1;10473:13:46;;-1:-1:-1;10490:40:46;10511:18;;;;:13;:18;:::i;:::-;10490:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10490:20:46;;-1:-1:-1;;;10490:40:46:i;:::-;10470:60;-1:-1:-1;10540:19:46;;-1:-1:-1;10562:60:46;10592:18;;;;:13;:18;:::i;:::-;10562:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10612:9:46;;-1:-1:-1;10620:1:46;;-1:-1:-1;10612:5:46;;-1:-1:-1;10612:9:46;:::i;:::-;10562:29;:60::i;:::-;10540:82;;10632:25;10660:36;10689:6;10660:28;:36::i;:::-;10632:64;-1:-1:-1;10706:16:46;10725:41;10740:25;10632:64;10706:16;10762:2;10740:18;:25::i;:::-;10725:14;:41::i;:::-;10706:60;;10776:18;10805:64;10820:48;10839:2;10865;10843:12;:19;:24;;;;:::i;:::-;10820:12;;:48;:18;:48::i;10805:64::-;10797:73;10900:25;;;:15;:25;;;;;;10797:73;;-1:-1:-1;10943:14:46;;;10935:47;;;;-1:-1:-1;;;10935:47:46;;15394:2:58;10935:47:46;;;15376:21:58;15433:2;15413:18;;;15406:30;-1:-1:-1;;;15452:18:58;;;15445:50;15512:18;;10935:47:46;15192:344:58;10935:47:46;10992:21;11016:60;11051:21;;;;:13;:21;:::i;:::-;11016:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11016:60:46;-1:-1:-1;11016:34:46;;-1:-1:-1;;11016:60:46:i;:::-;10992:84;;11086:19;11108:48;11144:8;11154:1;11108:35;:48::i;:::-;11086:70;;11180:11;11194:17;:24;;;;;:::i;:::-;;-1:-1:-1;11228:31:46;;-1:-1:-1;11262:20:46;:6;11228:31;11194:24;11262:12;:20::i;:::-;11228:54;;11300:51;11313:18;11333:17;11300:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:51::i;:::-;11292:90;;;;-1:-1:-1;;;11292:90:46;;15743:2:58;11292:90:46;;;15725:21:58;15782:2;15762:18;;;15755:30;15821:28;15801:18;;;15794:56;15867:18;;11292:90:46;15541:350:58;11292:90:46;11392:24;11419:15;11392:24;11435:13;11447:1;11435:9;:13;:::i;:::-;11419:30;;;;;;;;;;;;11392:57;;11520:16;11539;11559:1;11539:21;:78;;;;11584:33;11606:10;11584:21;:33::i;:::-;11564:16;:53;;11539:78;11520:97;;11635:11;11627:49;;;;-1:-1:-1;;;11627:49:46;;16098:2:58;11627:49:46;;;16080:21:58;16137:2;16117:18;;;16110:30;16176:27;16156:18;;;16149:55;16221:18;;11627:49:46;15896:349:58;11627:49:46;11720:4;11686:19;11706:10;11686:31;;;;;;;:::i;:::-;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;11740:35;11764:10;11740:35;;;;391:25:58;;379:2;364:18;;245:177;11740:35:46;;;;;;;;10401:1381;;;;;;;;;;;;10319:1463;:::o;3155:101:29:-;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;9080:966:46:-;9209:37;9235:10;9209:25;:37::i;:::-;-1:-1:-1;9256:18:46;;-1:-1:-1;9277:56:46;9306:14;;;;:10;:14;:::i;:::-;9277:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9322:10:46;;-1:-1:-1;9277:28:46;;-1:-1:-1;;9277:56:46:i;:::-;9256:77;;9343:12;9358:34;9386:5;9358:27;:34::i;:::-;9343:49;;9402:12;9417:32;9443:5;9417:25;:32::i;:::-;9402:47;;9459:16;9478:15;9494:10;9478:27;;;;;;;;:::i;:::-;;;;;;;;;;9459:46;;;;;;;;;9478:27;;;;;;9459:46;;;;;;;;;;;;-1:-1:-1;;;;;;9459:46:46;;;;;;;;;-1:-1:-1;9523:17:46;;:43;;;;;9561:5;-1:-1:-1;;;;;9544:22:46;;:4;:13;;;-1:-1:-1;;;;;9544:22:46;;;9523:43;9515:73;;;;-1:-1:-1;;;9515:73:46;;16452:2:58;9515:73:46;;;16434:21:58;16491:2;16471:18;;;16464:30;-1:-1:-1;;;16510:18:58;;;16503:47;16567:18;;9515:73:46;16250:341:58;9515:73:46;9602:13;9619:37;9640:15;;;;:10;:15;:::i;9619:37::-;9599:57;-1:-1:-1;9666:19:46;;-1:-1:-1;9688:57:46;9718:15;;;;:10;:15;:::i;9688:57::-;9666:79;;9755:25;9783:36;9812:6;9783:28;:36::i;:::-;9755:64;;9829:24;9864:28;9879:12;9864:14;:28::i;:::-;9856:37;-1:-1:-1;9933:39:46;9856:37;9933:21;:39::i;:::-;9903:27;;;;:15;:27;;;;;;;;;:69;;;;9987:52;;16770:25:58;;;16811:18;;;16804:34;;;9987:52:46;;16743:18:58;9987:52:46;;;;;;;9199:847;;;;;;;;9080:966;;;:::o;2774:229:28:-;966:10:31;;2869:14:28;:12;:14::i;:::-;-1:-1:-1;;;;;2869:24:28;;2865:96;;2916:34;;-1:-1:-1;;;2916:34:28;;-1:-1:-1;;;;;3619:32:58;;2916:34:28;;;3601:51:58;3574:18;;2916:34:28;3455:203:58;2865:96:28;2970:26;2989:6;2970:18;:26::i;:::-;2816:187;2774:229::o;6936:385:46:-;7033:13;;7020:9;:26;7012:62;;;;-1:-1:-1;;;7012:62:46;;8476:2:58;7012:62:46;;;8458:21:58;8515:2;8495:18;;;8488:30;-1:-1:-1;;;8534:18:58;;;8527:53;8597:18;;7012:62:46;8274:347:58;7012:62:46;7103:72;;;;;;;;;;;-1:-1:-1;;;;;;7103:72:46;;;;;;;;7201:15;:22;;7233:26;;;;;-1:-1:-1;7233:26:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7233:26:46;;;;;;;;;;;;;7274:40;;7103:72;;7201:22;7274:40;;;;7103:72;;7201:22;;7298:15;;7274:40;:::i;:::-;;;;;;;;7002:319;;6936:385;;:::o;1290:25::-;;;;;;;:::i;2441:144:29:-;2487:7;;1313:22;2533:20;2570:8;-1:-1:-1;;;;;2570:8:29;;2441:144;-1:-1:-1;;2441:144:29:o;1259:25:46:-;;;;;;;:::i;8561:147::-;2334:13:29;:11;:13::i;:::-;8630:8:46::1;:20:::0;;-1:-1:-1;;;;;;8630:20:46::1;;-1:-1:-1::0;;;;;8630:20:46;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;8665:36:::1;::::0;;8681:8;;;::::1;;13695:51:58::0;;13777:2;13762:18;;13755:60;;;;8665:36:46::1;::::0;13668:18:58;8665:36:46::1;;;;;;;8561:147:::0;:::o;1152:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4826:1772::-;2200:8;;;;;-1:-1:-1;;;;;2200:8:46;2186:10;:22;2178:61;;;;-1:-1:-1;;;2178:61:46;;17051:2:58;2178:61:46;;;17033:21:58;17090:2;17070:18;;;17063:30;17129:28;17109:18;;;17102:56;17175:18;;2178:61:46;16849:350:58;2178:61:46;5263:13:::1;5278:12:::0;5294:33:::1;5320:6;5294:25;:33::i;:::-;5262:65;;;;5345:4;5353:1;5345:9;5337:44;;;::::0;-1:-1:-1;;;5337:44:46;;17406:2:58;5337:44:46::1;::::0;::::1;17388:21:58::0;17445:2;17425:18;;;17418:30;-1:-1:-1;;;17464:18:58;;;17457:52;17526:18;;5337:44:46::1;17204:346:58::0;5337:44:46::1;5391:12;5406:83;5432:14;;::::0;::::1;:6:::0;:14:::1;:::i;:::-;5448:10;;::::0;::::1;:6:::0;:10:::1;:::i;:::-;5406:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;5460:11:46::1;::::0;-1:-1:-1;;;5460:11:46::1;::::0;::::1;::::0;::::1;:::i;:::-;5406:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;5473:15:46::1;::::0;-1:-1:-1;;;5473:15:46;;;::::1;::::0;::::1;;:::i;:::-;5406:25;:83::i;:::-;5508:21;::::0;;;:15:::1;:21;::::0;;;;;5391:98;;-1:-1:-1;5508:26:46;5500:57:::1;;;::::0;-1:-1:-1;;;5500:57:46;;17757:2:58;5500:57:46::1;::::0;::::1;17739:21:58::0;17796:2;17776:18;;;17769:30;-1:-1:-1;;;17815:18:58;;;17808:48;17873:18;;5500:57:46::1;17555:342:58::0;5500:57:46::1;5593:16;;5591:18;;;;;:::i;:::-;::::0;;;;-1:-1:-1;5567:21:46::1;::::0;;;:15:::1;:21;::::0;;;;:42;;;;5652:53:::1;5687:14;;::::0;::::1;:6:::0;:14:::1;:::i;5652:53::-;5628:77;;5718:14;5736:30;5757:8;5736:20;:30::i;:::-;5715:51;;;5784:6;5794:1;5784:11;5776:45;;;::::0;-1:-1:-1;;;5776:45:46;;18244:2:58;5776:45:46::1;::::0;::::1;18226:21:58::0;18283:2;18263:18;;;18256:30;-1:-1:-1;;;18302:18:58;;;18295:51;18363:18;;5776:45:46::1;18042:345:58::0;5776:45:46::1;5867:19;5889:48;5925:8;5935:1;5889:35;:48::i;:::-;5867:70;;5961:11;5975:12;:19;;;;;:::i;:::-;::::0;-1:-1:-1;6004:26:46::1;::::0;-1:-1:-1;6033:20:46::1;:6:::0;6004:26;5975:19;6033:12:::1;:20::i;:::-;6004:49;;6071:41;6084:13;6099:12;6071:41;;;;;:::i;:::-;6063:76;;;::::0;-1:-1:-1;;;6063:76:46;;18594:2:58;6063:76:46::1;::::0;::::1;18576:21:58::0;18633:2;18613:18;;;18606:30;-1:-1:-1;;;18652:18:58;;;18645:52;18714:18;;6063:76:46::1;18392:346:58::0;6063:76:46::1;6149:26;6178:70;6207:12;:19;;;;;:::i;:::-;6191:13:::0;;:35:::1;::::0;-1:-1:-1;6191:35:46::1;:::i;:::-;6228:12;:19;;;;;:::i;:::-;6178:6:::0;;:70;-1:-1:-1;6178:12:46::1;:70::i;:::-;6149:99;;6266:41;6279:13;6294:12;6266:41;;;;;:::i;:::-;6258:75;;;::::0;-1:-1:-1;;;6258:75:46;;18945:2:58;6258:75:46::1;::::0;::::1;18927:21:58::0;18984:2;18964:18;;;18957:30;-1:-1:-1;;;19003:18:58;;;18996:51;19064:18;;6258:75:46::1;18743:345:58::0;6258:75:46::1;6344:17;6364:31;6388:6;6364:23;:31::i;:::-;6459:16;::::0;6410:66:::1;::::0;;19352:25:58;;;19408:2;19393:18;;19386:34;;;-1:-1:-1;;;;;19456:32:58;;19436:18;;;19429:60;6442:15:46::1;19520:2:58::0;19505:18;;19498:34;19563:3;19548:19;;19541:35;;;;6410:66:46;19456:32:58;;-1:-1:-1;6410:66:46::1;::::0;;;;;19339:3:58;6410:66:46;;::::1;6528:13;::::0;6506:40:::1;::::0;6488:12:::1;::::0;-1:-1:-1;;;;;6506:14:46;::::1;::::0;6488:12;6506:40;6488:12;6506:40;6528:13;6506:14;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6487:59;;;6564:7;6556:35;;;::::0;-1:-1:-1;;;6556:35:46;;19999:2:58;6556:35:46::1;::::0;::::1;19981:21:58::0;20038:2;20018:18;;;20011:30;-1:-1:-1;;;20057:18:58;;;20050:45;20112:18;;6556:35:46::1;19797:339:58::0;6556:35:46::1;4915:1683;;;;;;;;;;;4826:1772:::0;:::o;1680:168:28:-;1733:7;;1318:27;1784:25;1187:174;4318:282:46;2334:13:29;:11;:13::i;:::-;4449:1:46::1;4420:30:::0;;;4412:73:::1;;;;-1:-1:-1::0;;;4412:73:46::1;;;;;;;:::i;:::-;4496:17;:38;4516:18:::0;;4496:17;:38:::1;:::i;:::-;;4550:43;4574:18;;4550:43;;;;;;;:::i;:::-;;;;;;;;4318:282:::0;;:::o;2041:247:28:-;2334:13:29;:11;:13::i;:::-;1318:27:28;2197:26;;-1:-1:-1;;;;;;2197:26:28::1;-1:-1:-1::0;;;;;2197:26:28;::::1;::::0;;::::1;::::0;;2263:7:::1;:5;:7::i;:::-;-1:-1:-1::0;;;;;2238:43:28::1;;;;;;;;;;;2120:168;2041:247:::0;:::o;3799:332:46:-;2334:13:29;:11;:13::i;:::-;3946:1:46::1;3922:25:::0;;;3914:68:::1;;;;-1:-1:-1::0;;;3914:68:46::1;;;;;;;:::i;:::-;3993:12;:28;4008:13:::0;;3993:12;:28:::1;:::i;:::-;-1:-1:-1::0;4031:12:46::1;:28;4046:13:::0;;4031:12;:28:::1;:::i;:::-;;4075:49;4095:13;;4110;;4075:49;;;;;;;;;:::i;12050:779::-:0;12139:7;;;12183:90;12211:10;;;;:2;:10;:::i;:::-;12223:7;;;;;;;;:::i;:::-;12232:6;;;;:2;:6;:::i;:::-;12240:7;;;;:2;:7;:::i;:::-;12249:10;;;;:2;:10;:::i;:::-;12261:11;;;;;;;;:::i;:::-;12183:27;:90::i;:::-;12167:106;-1:-1:-1;12291:28:46;12312:6;;;;:2;:6;:::i;:::-;12291:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12291:20:46;;-1:-1:-1;;;12291:28:46:i;:::-;12283:70;;;;-1:-1:-1;;;12283:70:46;;20878:2:58;12283:70:46;;;20860:21:58;20917:2;20897:18;;;20890:30;20956:31;20936:18;;;20929:59;21005:18;;12283:70:46;20676:353:58;12283:70:46;12371:30;12393:7;;;;:2;:7;:::i;:::-;12371:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12371:21:46;;-1:-1:-1;;;12371:30:46:i;:::-;12363:73;;;;-1:-1:-1;;;12363:73:46;;21236:2:58;12363:73:46;;;21218:21:58;21275:2;21255:18;;;21248:30;21314:32;21294:18;;;21287:60;21364:18;;12363:73:46;21034:354:58;12363:73:46;12458:12;12474:28;12495:6;;;;:2;:6;:::i;12474:28::-;12455:47;-1:-1:-1;12571:46:46;;-1:-1:-1;12600:10:46;;;;:2;:10;:::i;:::-;12571:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12612:4:46;;-1:-1:-1;12571:28:46;;-1:-1:-1;;12571:46:46:i;:::-;12563:92;;;;-1:-1:-1;;;12563:92:46;;21595:2:58;12563:92:46;;;21577:21:58;21634:2;21614:18;;;21607:30;21673:34;21653:18;;;21646:62;-1:-1:-1;;;21724:18:58;;;21717:31;21765:19;;12563:92:46;21393:397:58;12563:92:46;-1:-1:-1;;;;;12674:28:46;12703:15;;;;12720:5;12727:21;;;;12703:2;12727:21;:::i;:::-;12750:2;:8;;;12674:85;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12666:125;;;;-1:-1:-1;;;12666:125:46;;22743:2:58;12666:125:46;;;22725:21:58;22782:2;22762:18;;;22755:30;22821:29;22801:18;;;22794:57;22868:18;;12666:125:46;22541:351:58;12666:125:46;12810:5;;12817:4;;-1:-1:-1;12050:779:46;-1:-1:-1;;12050:779:46:o;2414:123:1:-;2475:7;2484;2510:20;2524:2;2528:1;2510:13;:20::i;:::-;2503:27;;;;2414:123;;;:::o;21812:827::-;21901:12;21925:22;21957:14;22009:18;22021:5;22009:11;:18::i;:::-;21982:45;;-1:-1:-1;21982:45:1;-1:-1:-1;22045:29:1;;;22037:76;;;;-1:-1:-1;;;22037:76:1;;;;;;;:::i;:::-;22140:6;22131;:15;22123:45;;;;-1:-1:-1;;;22123:45:1;;23502:2:58;22123:45:1;;;23484:21:58;23541:2;23521:18;;;23514:30;-1:-1:-1;;;23560:18:58;;;23553:47;23617:18;;22123:45:1;23300:341:58;22123:45:1;22179:12;;22223:18;22227:14;22223:1;:18;:::i;:::-;22205:36;;22257:10;22252:213;22278:6;22273:2;:11;22252:213;;;22314:39;22338:5;22345:7;22314:23;:39::i;:::-;22307:46;;-1:-1:-1;;22375:4:1;:19;22367:58;;;;-1:-1:-1;;;22367:58:1;;23848:2:58;22367:58:1;;;23830:21:58;23887:2;23867:18;;;23860:30;23926:28;23906:18;;;23899:56;23972:18;;22367:58:1;23646:350:58;22367:58:1;22439:15;22450:4;22439:15;;:::i;:::-;;-1:-1:-1;22286:5:1;;22252:213;;;;22482:39;22506:5;22513:7;22482:23;:39::i;:::-;22475:46;;-1:-1:-1;;22539:4:1;:19;22531:58;;;;-1:-1:-1;;;22531:58:1;;23848:2:58;22531:58:1;;;23830:21:58;23887:2;23867:18;;;23860:30;23926:28;23906:18;;;23899:56;23972:18;;22531:58:1;23646:350:58;22531:58:1;22606:26;:5;22618:7;22627:4;22606:11;:26::i;:::-;22599:33;;;;;;21812:827;;;;;:::o;24241:267::-;24315:12;24343:7;24351:1;24343:10;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;24343:10:1;-1:-1:-1;;;24343:21:1;24339:64;;-1:-1:-1;;24380:12:1;;;;;;;;;-1:-1:-1;24380:12:1;;;24241:267::o;24339:64::-;24412:15;24430:7;24438:2;24430:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;24430:11:1;;;-1:-1:-1;24458:43:1;;:7;;24472:2;;24430:11;;24458:13;:43::i;:::-;24451:50;24241:267;-1:-1:-1;;;24241:267:1:o;10344:924:2:-;10431:16;10463:7;10474:1;10463:12;10459:55;;-1:-1:-1;10491:12:2;;;;;;;;;-1:-1:-1;10491:12:2;;;;10459:55;10523:9;10535:16;10544:7;10535:6;:16;:::i;:::-;10523:28;;10576:6;10569:4;:13;:38;;;;;10603:4;10586:6;:13;:21;;10569:38;10561:70;;;;-1:-1:-1;;;10561:70:2;;24203:2:58;10561:70:2;;;24185:21:58;24242:2;24222:18;;;24215:30;-1:-1:-1;;;24261:18:58;;;24254:49;24320:18;;10561:70:2;24001:343:58;10561:70:2;10768:4;10762:11;10755:18;;10817:7;10812:2;10807:3;10803:12;10799:26;10793:4;10786:40;10851:7;10846:3;10839:20;10978:6;10970;10966:19;10961:3;10957:29;11054:6;11049:2;11041:6;11037:15;11033:28;11098:7;11093:3;11089:17;11000:252;11129:3;11124;11121:12;11000:252;;;11233:3;11227:10;11220:4;11215:3;11211:14;11204:34;11168:2;11163:3;11159:12;11152:19;;11000:252;;;11004:116;;;10651:611;10344:924;;;;;:::o;14115:452:46:-;14184:14;14214:7;:14;14232:1;14214:19;14210:60;;-1:-1:-1;14256:3:46;;14115:452;-1:-1:-1;14115:452:46:o;14210:60::-;14296:14;;14338:2;14328:12;;;14320:59;;;;-1:-1:-1;;;14320:59:46;;24551:2:58;14320:59:46;;;24533:21:58;24590:2;24570:18;;;24563:30;24629:34;24609:18;;;24602:62;-1:-1:-1;;;24680:18:58;;;24673:32;24722:19;;14320:59:46;24349:398:58;14320:59:46;14463:2;14450:16;;;14444:23;14488:15;;14540:1;14530:12;14526:25;;;;;;-1:-1:-1;14115:452:46:o;3420:579:0:-;3513:12;3537;3563:15;3598:10;3593:221;3619:6;3614:2;:11;3593:221;;;3655:43;3680:8;3690:7;3655:24;:43::i;:::-;3648:50;;-1:-1:-1;;3720:4:0;:28;3712:62;;;;-1:-1:-1;;;3712:62:0;;24954:2:58;3712:62:0;;;24936:21:58;24993:2;24973:18;;;24966:30;-1:-1:-1;;;25012:18:58;;;25005:51;25073:18;;3712:62:0;24752:345:58;3712:62:0;3788:15;3799:4;3788:15;;:::i;:::-;;-1:-1:-1;3627:5:0;;3593:221;;;;3831:43;3856:8;3866:7;3831:24;:43::i;:::-;3824:50;;-1:-1:-1;;3892:4:0;:28;3884:62;;;;-1:-1:-1;;;3884:62:0;;24954:2:58;3884:62:0;;;24936:21:58;24993:2;24973:18;;;24966:30;-1:-1:-1;;;25012:18:58;;;25005:51;25073:18;;3884:62:0;24752:345:58;3884:62:0;3963:29;:8;3978:7;3987:4;3963:14;:29::i;:::-;3956:36;3420:579;-1:-1:-1;;;;;3420:579:0:o;4360:974::-;4454:12;4478:22;4510:15;4572:30;4593:8;4572:20;:30::i;:::-;4544:58;;-1:-1:-1;4544:58:0;-1:-1:-1;4620:38:0;;;4612:85;;;;-1:-1:-1;;;4612:85:0;;;;;;;:::i;:::-;4724:7;4715:6;:16;4707:45;;;;-1:-1:-1;;;4707:45:0;;25304:2:58;4707:45:0;;;25286:21:58;25343:2;25323:18;;;25316:30;-1:-1:-1;;;25362:18:58;;;25355:46;25418:18;;4707:45:0;25102:340:58;4707:45:0;4763:16;;4811:18;4815:14;4811:1;:18;:::i;:::-;4793:36;;4845:9;4840:263;4864:6;4860:1;:10;4840:263;;;4920:41;4943:8;4953:7;4920:22;:41::i;:::-;4891:70;;-1:-1:-1;4891:70:0;-1:-1:-1;4983:32:0;;;4975:63;;;;-1:-1:-1;;;4975:63:0;;25649:2:58;4975:63:0;;;25631:21:58;25688:2;25668:18;;;25661:30;-1:-1:-1;;;25707:18:58;;;25700:48;25765:18;;4975:63:0;25447:342:58;4975:63:0;5084:8;5063:18;5067:14;5063:1;:18;:::i;:::-;:29;;;;:::i;:::-;5052:40;;;;:::i;:::-;;-1:-1:-1;4872:3:0;;4840:263;;;;5142:41;5165:8;5175:7;5142:22;:41::i;:::-;5113:70;;-1:-1:-1;5113:70:0;-1:-1:-1;5201:32:0;;;5193:63;;;;-1:-1:-1;;;5193:63:0;;25649:2:58;5193:63:0;;;25631:21:58;25688:2;25668:18;;;25661:30;-1:-1:-1;;;25707:18:58;;;25700:48;25765:18;;5193:63:0;25447:342:58;5193:63:0;5273:54;5288:7;5297:25;5308:14;5297:8;:25;:::i;:::-;:29;;5325:1;5297:29;:::i;:::-;5273:8;;:54;:14;:54::i;13335:774:46:-;13449:8;;13478;;13412:11;;13449:8;13471:15;;13467:58;;13509:5;13502:12;;;;;13467:58;13552:2;13535:14;;13612:289;13629:3;13619:6;:13;13612:289;;-1:-1:-1;;13691:14:46;;;13685:21;13740:14;;;13734:21;13794:2;13782:15;;;;13828:16;;;13824:67;;13871:5;13864:12;;;;;;;;13824:67;13612:289;;;13958:6;13967:11;13976:2;13967:6;:11;:::i;:::-;13958:20;;13953:128;13984:3;13980:1;:7;13953:128;;;14020:1;14022;14020:4;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;14012:12:46;;:1;14014;14012:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;14012:4:46;:12;14008:63;;14051:5;14044:12;;;;;;;;;14008:63;13989:3;;13953:128;;;-1:-1:-1;14098:4:46;;13335:774;-1:-1:-1;;;;;;;13335:774:46:o;11923:121::-;11997:7;12023:14;:10;12036:1;12023:14;:::i;2658:162:29:-;966:10:31;2717:7:29;:5;:7::i;:::-;-1:-1:-1;;;;;2717:23:29;;2713:101;;2763:40;;-1:-1:-1;;;2763:40:29;;966:10:31;2763:40:29;;;3601:51:58;3574:18;;2763:40:29;3455:203:58;2472:222:28;1318:27;2621:22;;-1:-1:-1;;;;;;2621:22:28;;;2653:34;2678:8;2653:24;:34::i;:::-;2544:150;2472:222;:::o;11841:818:1:-;11928:12;11952:22;11984:13;12034:17;12046:4;12034:11;:17::i;:::-;12008:43;;-1:-1:-1;12008:43:1;-1:-1:-1;12069:29:1;;;12061:76;;;;-1:-1:-1;;;12061:76:1;;;;;;;:::i;:::-;12164:5;12155:6;:14;12147:43;;;;-1:-1:-1;;;12147:43:1;;25304:2:58;12147:43:1;;;25286:21:58;25343:2;25323:18;;;25316:30;-1:-1:-1;;;25362:18:58;;;25355:46;25418:18;;12147:43:1;25102:340:58;12147:43:1;12201:12;;12245:18;12249:14;12245:1;:18;:::i;:::-;12227:36;;12279:10;12274:217;12300:6;12295:2;:11;12274:217;;;12336:37;12359:4;12365:7;12336:22;:37::i;:::-;12329:44;;-1:-1:-1;;12395:4:1;:19;12387:55;;;;-1:-1:-1;;;12387:55:1;;25996:2:58;12387:55:1;;;25978:21:58;26035:2;26015:18;;;26008:30;-1:-1:-1;;;26054:18:58;;;26047:53;26117:18;;12387:55:1;25794:347:58;12387:55:1;12466:14;12476:4;12466:7;:14;:::i;:::-;12456:24;-1:-1:-1;12308:5:1;;12274:217;;;;12508:37;12531:4;12537:7;12508:22;:37::i;:::-;12501:44;;-1:-1:-1;;12563:4:1;:19;12555:55;;;;-1:-1:-1;;;12555:55:1;;25996:2:58;12555:55:1;;;25978:21:58;26035:2;26015:18;;;26008:30;-1:-1:-1;;;26054:18:58;;;26047:53;26117:18;;12555:55:1;25794:347:58;18631:122:1;12566:2:2;12550:28;;12544:35;18703:7:1;;18729:17;12417:178:2;19454:119:1;19524:6;19549:17;:6;19563:2;19549:13;:17::i;2637:355:4:-;2795:7;2921:64;2938:8;2948:4;2954:5;2961:9;2921:50;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:62;:64::i;12835:240:46:-;12913:7;12932:14;12949:12;:19;;;;;:::i;:::-;;-1:-1:-1;12978:13:46;;-1:-1:-1;13002:25:46;:7;12949:19;13024:2;13002:13;:25::i;:::-;12994:34;;;:::i;:::-;13053:14;;;12835:240;-1:-1:-1;;;;12835:240:46:o;431:320:0:-;643:7;669:75;686:7;695:4;701:3;;706:4;;712:7;;721:8;669:61;;;;;;;;;;;;;;;;:::i;:75::-;662:82;431:320;-1:-1:-1;;;;;;;;;;431:320:0:o;27793:991:1:-;27856:4;27872:22;27904:13;27954:17;27966:4;27954:11;:17::i;:::-;27928:43;;-1:-1:-1;27928:43:1;-1:-1:-1;28050:10:1;;;:43;;;-1:-1:-1;;28064:14:1;:29;28050:43;28046:86;;;-1:-1:-1;28116:5:1;;27793:991;-1:-1:-1;;;27793:991:1:o;28046:86::-;28142:15;28160:18;28164:14;28160:1;:18;:::i;:::-;28142:36;;28194:9;28189:492;28213:5;28209:1;:9;28189:492;;;28312:4;:11;28301:7;:22;28297:73;;-1:-1:-1;28350:5:1;;27793:991;-1:-1:-1;;;;;27793:991:1:o;28297:73::-;28445:16;28464:37;28487:4;28493:7;28464:22;:37::i;:::-;28445:56;;-1:-1:-1;;28519:8:1;:23;28515:74;;-1:-1:-1;28569:5:1;;27793:991;-1:-1:-1;;;;;;27793:991:1:o;28515:74::-;28651:19;28662:8;28651:19;;:::i;:::-;;-1:-1:-1;;28220:3:1;;28189:492;;;-1:-1:-1;28766:11:1;;28755:22;;;;;-1:-1:-1;;;27793:991:1:o;29056:1004::-;29121:4;29137:22;29169:14;29221:18;29233:5;29221:11;:18::i;:::-;29194:45;;-1:-1:-1;29194:45:1;-1:-1:-1;29319:11:1;;;:44;;;-1:-1:-1;;29334:14:1;:29;29319:44;29315:87;;;-1:-1:-1;29386:5:1;;29056:1004;-1:-1:-1;;;29056:1004:1:o;29315:87::-;29412:15;29430:18;29434:14;29430:1;:18;:::i;:::-;29412:36;;29464:9;29459:497;29483:6;29479:1;:10;29459:497;;;29583:5;:12;29572:7;:23;29568:74;;-1:-1:-1;29622:5:1;;29056:1004;-1:-1:-1;;;;;29056:1004:1:o;29568:74::-;29766:16;29785:39;29809:5;29816:7;29785:23;:39::i;:::-;29766:58;;-1:-1:-1;;29842:8:1;:23;29838:74;;-1:-1:-1;29892:5:1;;29056:1004;-1:-1:-1;;;;;;29056:1004:1:o;29838:74::-;29926:19;29937:8;29926:19;;:::i;:::-;;-1:-1:-1;;29491:3:1;;29459:497;;1060:871:0;1147:4;1222:6;1232:1;1222:11;1218:54;;-1:-1:-1;1256:5:0;1249:12;;1218:54;1282:15;1317:9;1312:512;1336:6;1332:1;:10;1312:512;;;1436:8;:15;1425:7;:26;1421:77;;1478:5;1471:12;;;;;;1421:77;1573:16;1592:43;1617:8;1627:7;1592:24;:43::i;:::-;1573:62;;-1:-1:-1;;1653:8:0;:32;1649:83;;1712:5;1705:12;;;;;;;1649:83;1794:19;1805:8;1794:19;;:::i;:::-;;-1:-1:-1;;1344:3:0;;1312:512;;;-1:-1:-1;1909:15:0;;1898:26;;-1:-1:-1;1060:871:0;;;;:::o;2999:704:1:-;3075:7;3084;3103:14;3120:36;3148:2;3152:3;3120:27;:36::i;:::-;3103:53;;3171:8;:13;;3183:1;3171:13;3167:70;;3208:1;3217:2;3220:3;3217:7;;;;;;;;:::i;:::-;;;;;3200:26;;-1:-1:-1;3217:7:1;;;-1:-1:-1;3200:26:1;;-1:-1:-1;3200:26:1;3167:70;3277:3;3262:12;3266:8;3262:1;:12;:::i;:::-;:18;;;;;;:::i;:::-;3250:2;:9;:30;3246:84;;;-1:-1:-1;;3317:1:1;3296:23;;;;;;;3246:84;3339:15;3368:8;:13;;3380:1;3368:13;3364:297;;3407:41;3428:18;3438:7;3442:3;3438:1;:7;:::i;:::-;3428:2;;:9;:18::i;:::-;7042:7;;;;;;7054;;;;;7041:21;;6959:110;3407:41;3397:51;;;;3364:297;;;3469:8;:13;;3481:1;3469:13;3465:196;;3508:41;3529:18;3539:7;3543:3;3539:1;:7;:::i;3529:18::-;6397:21;;;;;;6402:10;6360:6;;;;;6359:21;;;;6358:61;6485:2;6480:7;;;6468;;;6467:21;;6238:257;3508:41;3498:51;;;;3465:196;;;3570:8;:13;;3582:1;3570:13;3566:95;;3609:41;3630:18;3640:7;3644:3;3640:1;:7;:::i;3630:18::-;3623:26;;5965:22;5866:1;5793:6;;;5965:22;;;;5838:29;;;;5965:22;;;;5992:2;5964:30;;;-1:-1:-1;;;;;6056:7:1;5843:18;5792:29;;;;5838;;;;5791:77;;;;5918:7;;;5969:18;5917:30;6056:7;6061:2;6044:7;;;6056;;;6043:21;;5671:400;3609:41;-1:-1:-1;;;;;3599:51:1;;;3566:95;3670:26;;;;;-1:-1:-1;3688:7:1;-1:-1:-1;2999:704:1;;;;;;:::o;20911:536::-;21002:7;21042;21046:3;21042:1;:7;:::i;:::-;21025;:14;:24;21021:73;;;-1:-1:-1;;;21065:18:1;;21021:73;21103:22;;21212:31;21226:7;21235;21239:3;21235:1;:7;:::i;:::-;21212:13;:31::i;:::-;21172:71;;-1:-1:-1;21172:71:1;-1:-1:-1;21258:29:1;;;21254:78;;-1:-1:-1;;21303:18:1;;;;;;21254:78;21421:19;21396:22;21404:14;21396:5;:22;:::i;:::-;:44;;;;:::i;2254:783:0:-;2347:7;2366:22;2398:20;2470:37;2493:8;2503:3;2470:22;:37::i;:::-;2437:70;;-1:-1:-1;2437:70:0;-1:-1:-1;2521:38:0;;;2517:96;;-1:-1:-1;;2575:27:0;;;;;;2517:96;2623:16;;2667:18;2671:14;2667:1;:18;:::i;:::-;2649:36;;2701:9;2696:310;2720:12;2716:1;:16;2696:310;;;2782:47;2805:8;2815:13;2821:7;2815:3;:13;:::i;2782:47::-;2753:76;;-1:-1:-1;2753:76:0;-1:-1:-1;2847:32:0;;;2843:98;;-1:-1:-1;;2899:27:0;;;;;;;;;2843:98;2987:8;2966:18;2970:14;2966:1;:18;:::i;:::-;:29;;;;:::i;:::-;2955:40;;;;:::i;:::-;;-1:-1:-1;2734:3:0;;2696:310;;;-1:-1:-1;3023:7:0;2254:783;-1:-1:-1;;;;;;2254:783:0:o;3774:248:29:-;1313:22;3923:8;;-1:-1:-1;;;;;;3941:19:29;;-1:-1:-1;;;;;3941:19:29;;;;;;;;3975:40;;3923:8;;;;;3975:40;;3847:24;;3975:40;3837:185;;3774:248;:::o;14980:394:1:-;15069:7;15088:22;15120:21;15185:34;15207:6;15215:3;15185:21;:34::i;:::-;15151:68;;-1:-1:-1;15151:68:1;-1:-1:-1;15233:29:1;;;15229:78;;-1:-1:-1;;15278:18:1;;;;;;15229:78;15350:13;15324:23;15333:14;15324:6;:23;:::i;:::-;:39;;;;:::i;:::-;:43;;15366:1;15324:43;:::i;13081:136:2:-;13154:6;13186:23;13194:6;13202;12550:28;12566:2;12550:28;12544:35;;12417:178;9609:335:1;9670:11;9835:2;9829:4;9824:2;9818:9;9813:2;9809;9805:11;9802:1;9795:5;9784:54;9780:59;9893:2;9887:4;9883:2;9877:4;9874:1;9867:5;9856:40;-1:-1:-1;;9923:4:1;9917:11;;9609:335;-1:-1:-1;9609:335:1:o;1550:446::-;1640:5;1667:2;1670:3;1667:7;;;;;;;;:::i;:::-;;;;;;;1661:14;:22;1657:93;;-1:-1:-1;1706:1:1;1699:8;;1657:93;1769:2;1772:3;1769:7;;;;;;;;:::i;:::-;;;;;;;1781:4;1763:22;1759:93;;-1:-1:-1;1808:1:1;1801:8;;1759:93;1871:2;1874:3;1871:7;;;;;;;;:::i;:::-;;;;;;;1883:4;1865:22;1861:93;;-1:-1:-1;1910:1:1;1903:8;;1861:93;-1:-1:-1;1971:1:1;1550:446;;;;:::o;13785:388::-;13873:7;;13921:8;13926:3;13921:2;:8;:::i;:::-;13905:6;:13;:24;13901:78;;;-1:-1:-1;;;654:66:1;-1:-1:-1;13966:1:1;13945:23;;13901:78;13989:22;;14086:31;14100:6;14108:8;:3;14114:2;14108:8;:::i;14086:31::-;14052:65;;;;-1:-1:-1;13785:388:1;-1:-1:-1;;;;;13785:388:1:o;14:226:58:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;187:23:58;;14:226;-1:-1:-1;14:226:58:o;619:367::-;682:8;692:6;746:3;739:4;731:6;727:17;723:27;713:55;;764:1;761;754:12;713:55;-1:-1:-1;787:20:58;;-1:-1:-1;;;;;819:30:58;;816:50;;;862:1;859;852:12;816:50;899:4;891:6;887:17;875:29;;959:3;952:4;942:6;939:1;935:14;927:6;923:27;919:38;916:47;913:67;;;976:1;973;966:12;991:767;1112:6;1120;1128;1136;1189:2;1177:9;1168:7;1164:23;1160:32;1157:52;;;1205:1;1202;1195:12;1157:52;1245:9;1232:23;-1:-1:-1;;;;;1270:6:58;1267:30;1264:50;;;1310:1;1307;1300:12;1264:50;1349:70;1411:7;1402:6;1391:9;1387:22;1349:70;:::i;:::-;1438:8;;-1:-1:-1;1323:96:58;-1:-1:-1;;1526:2:58;1511:18;;1498:32;-1:-1:-1;;;;;1542:32:58;;1539:52;;;1587:1;1584;1577:12;1539:52;1626:72;1690:7;1679:8;1668:9;1664:24;1626:72;:::i;:::-;991:767;;;;-1:-1:-1;1717:8:58;-1:-1:-1;;;;991:767:58:o;1763:347::-;1814:8;1824:6;1878:3;1871:4;1863:6;1859:17;1855:27;1845:55;;1896:1;1893;1886:12;1845:55;-1:-1:-1;1919:20:58;;-1:-1:-1;;;;;1951:30:58;;1948:50;;;1994:1;1991;1984:12;1948:50;2031:4;2023:6;2019:17;2007:29;;2083:3;2076:4;2067:6;2059;2055:19;2051:30;2048:39;2045:59;;;2100:1;2097;2090:12;2115:826;2214:6;2222;2230;2238;2246;2299:2;2287:9;2278:7;2274:23;2270:32;2267:52;;;2315:1;2312;2305:12;2267:52;2355:9;2342:23;-1:-1:-1;;;;;2380:6:58;2377:30;2374:50;;;2420:1;2417;2410:12;2374:50;2459:58;2509:7;2500:6;2489:9;2485:22;2459:58;:::i;:::-;2536:8;;-1:-1:-1;2433:84:58;-1:-1:-1;;2624:2:58;2609:18;;2596:32;-1:-1:-1;;;;;2640:32:58;;2637:52;;;2685:1;2682;2675:12;2637:52;2724:60;2776:7;2765:8;2754:9;2750:24;2724:60;:::i;:::-;2115:826;;;;-1:-1:-1;2803:8:58;2907:2;2892:18;2879:32;;2115:826;-1:-1:-1;;;;2115:826:58:o;3663:250::-;3748:1;3758:113;3772:6;3769:1;3766:13;3758:113;;;3848:11;;;3842:18;3829:11;;;3822:39;3794:2;3787:10;3758:113;;;-1:-1:-1;;3905:1:58;3887:16;;3880:27;3663:250::o;3918:394::-;4065:2;4054:9;4047:21;4028:4;4097:6;4091:13;4140:6;4135:2;4124:9;4120:18;4113:34;4156:79;4228:6;4223:2;4212:9;4208:18;4203:2;4195:6;4191:15;4156:79;:::i;:::-;4296:2;4275:15;-1:-1:-1;;4271:29:58;4256:45;;;;4303:2;4252:54;;3918:394;-1:-1:-1;;3918:394:58:o;4317:166::-;4387:5;4432:3;4423:6;4418:3;4414:16;4410:26;4407:46;;;4449:1;4446;4439:12;4407:46;-1:-1:-1;4471:6:58;4317:166;-1:-1:-1;4317:166:58:o;4488:377::-;4585:6;4638:2;4626:9;4617:7;4613:23;4609:32;4606:52;;;4654:1;4651;4644:12;4606:52;4694:9;4681:23;-1:-1:-1;;;;;4719:6:58;4716:30;4713:50;;;4759:1;4756;4749:12;4713:50;4782:77;4851:7;4842:6;4831:9;4827:22;4782:77;:::i;:::-;4772:87;4488:377;-1:-1:-1;;;;4488:377:58:o;4870:611::-;4985:6;4993;5001;5054:2;5042:9;5033:7;5029:23;5025:32;5022:52;;;5070:1;5067;5060:12;5022:52;5110:9;5097:23;-1:-1:-1;;;;;5135:6:58;5132:30;5129:50;;;5175:1;5172;5165:12;5129:50;5198:77;5267:7;5258:6;5247:9;5243:22;5198:77;:::i;:::-;5188:87;5344:2;5329:18;;5316:32;;-1:-1:-1;5445:2:58;5430:18;;;5417:32;;4870:611;-1:-1:-1;;;;4870:611:58:o;5486:173::-;5553:20;;-1:-1:-1;;;;;;5602:32:58;;5592:43;;5582:71;;5649:1;5646;5639:12;5582:71;5486:173;;;:::o;5664:298::-;5731:6;5739;5792:2;5780:9;5771:7;5767:23;5763:32;5760:52;;;5808:1;5805;5798:12;5760:52;5853:23;;;-1:-1:-1;5919:37:58;5952:2;5937:18;;5919:37;:::i;:::-;5909:47;;5664:298;;;;;:::o;5967:286::-;6026:6;6079:2;6067:9;6058:7;6054:23;6050:32;6047:52;;;6095:1;6092;6085:12;6047:52;6121:23;;-1:-1:-1;;;;;6173:31:58;;6163:42;;6153:70;;6219:1;6216;6209:12;6494:409;6564:6;6572;6625:2;6613:9;6604:7;6600:23;6596:32;6593:52;;;6641:1;6638;6631:12;6593:52;6681:9;6668:23;-1:-1:-1;;;;;6706:6:58;6703:30;6700:50;;;6746:1;6743;6736:12;6700:50;6785:58;6835:7;6826:6;6815:9;6811:22;6785:58;:::i;:::-;6862:8;;6759:84;;-1:-1:-1;6494:409:58;-1:-1:-1;;;;6494:409:58:o;6908:712::-;6998:6;7006;7014;7022;7075:2;7063:9;7054:7;7050:23;7046:32;7043:52;;;7091:1;7088;7081:12;7043:52;7131:9;7118:23;-1:-1:-1;;;;;7156:6:58;7153:30;7150:50;;;7196:1;7193;7186:12;7150:50;7235:58;7285:7;7276:6;7265:9;7261:22;7235:58;:::i;:::-;7312:8;;-1:-1:-1;7209:84:58;-1:-1:-1;;7400:2:58;7385:18;;7372:32;-1:-1:-1;;;;;7416:32:58;;7413:52;;;7461:1;7458;7451:12;7413:52;7500:60;7552:7;7541:8;7530:9;7526:24;7500:60;:::i;7969:127::-;8030:10;8025:3;8021:20;8018:1;8011:31;8061:4;8058:1;8051:15;8085:4;8082:1;8075:15;8101:168;8174:9;;;8205;;8222:15;;;8216:22;;8202:37;8192:71;;8243:18;;:::i;8626:127::-;8687:10;8682:3;8678:20;8675:1;8668:31;8718:4;8715:1;8708:15;8742:4;8739:1;8732:15;8758:184;8816:6;8869:2;8857:9;8848:7;8844:23;8840:32;8837:52;;;8885:1;8882;8875:12;8837:52;8908:28;8926:9;8908:28;:::i;8947:125::-;9012:9;;;9033:10;;;9030:36;;;9046:18;;:::i;9077:463::-;9344:13;;9326:32;;9418:4;9406:17;;;9400:24;-1:-1:-1;;;;;;9396:51:58;9374:20;;;9367:81;;;;9479:2;9464:18;;9457:34;;;;9522:2;9507:18;;9500:34;9313:3;9298:19;;9077:463::o;10620:354::-;10822:2;10804:21;;;10861:2;10841:18;;;10834:30;10900:32;10895:2;10880:18;;10873:60;10965:2;10950:18;;10620:354::o;10979:127::-;11040:10;11035:3;11031:20;11028:1;11021:31;11071:4;11068:1;11061:15;11095:4;11092:1;11085:15;11111:380;11190:1;11186:12;;;;11233;;;11254:61;;11308:4;11300:6;11296:17;11286:27;;11254:61;11361:2;11353:6;11350:14;11330:18;11327:38;11324:161;;11407:10;11402:3;11398:20;11395:1;11388:31;11442:4;11439:1;11432:15;11470:4;11467:1;11460:15;11621:517;11722:2;11717:3;11714:11;11711:421;;;11758:5;11755:1;11748:16;11802:4;11799:1;11789:18;11872:2;11860:10;11856:19;11853:1;11849:27;11843:4;11839:38;11908:4;11896:10;11893:20;11890:47;;;-1:-1:-1;11931:4:58;11890:47;11986:2;11981:3;11977:12;11974:1;11970:20;11964:4;11960:31;11950:41;;12041:81;12059:2;12052:5;12049:13;12041:81;;;12118:1;12104:16;;12085:1;12074:13;12041:81;;;12045:3;;11711:421;11621:517;;;:::o;12314:1202::-;-1:-1:-1;;;;;12431:3:58;12428:27;12425:53;;;12458:18;;:::i;:::-;12487:93;12576:3;12536:38;12568:4;12562:11;12536:38;:::i;:::-;12530:4;12487:93;:::i;:::-;12606:1;12631:2;12626:3;12623:11;12648:1;12643:615;;;;13302:1;13319:3;13316:93;;;-1:-1:-1;13375:19:58;;;13362:33;13316:93;-1:-1:-1;;12271:1:58;12267:11;;;12263:24;12259:29;12249:40;12295:1;12291:11;;;12246:57;13422:78;;12616:894;;12643:615;11568:1;11561:14;;;11605:4;11592:18;;-1:-1:-1;;12679:17:58;;;12779:9;12801:229;12815:7;12812:1;12809:14;12801:229;;;12904:19;;;12891:33;12876:49;;13011:4;12996:20;;;;12964:1;12952:14;;;;12831:12;12801:229;;;12805:3;13058;13049:7;13046:16;13043:159;;;13182:1;13178:6;13172:3;13166;13163:1;13159:11;13155:21;13151:34;13147:39;13134:9;13129:3;13125:19;13112:33;13108:79;13100:6;13093:95;13043:159;;;13245:1;13239:3;13236:1;13232:11;13228:19;13222:4;13215:33;12616:894;;12314:1202;;;:::o;13826:266::-;13914:6;13909:3;13902:19;13966:6;13959:5;13952:4;13947:3;13943:14;13930:43;-1:-1:-1;14018:1:58;13993:16;;;14011:4;13989:27;;;13982:38;;;;14074:2;14053:15;;;-1:-1:-1;;14049:29:58;14040:39;;;14036:50;;13826:266::o;14097:431::-;14310:2;14299:9;14292:21;14273:4;14336:61;14393:2;14382:9;14378:18;14370:6;14362;14336:61;:::i;:::-;14445:9;14437:6;14433:22;14428:2;14417:9;14413:18;14406:50;14473:49;14515:6;14507;14499;14473:49;:::i;:::-;14465:57;14097:431;-1:-1:-1;;;;;;;14097:431:58:o;14533:521::-;14610:4;14616:6;14676:11;14663:25;14770:2;14766:7;14755:8;14739:14;14735:29;14731:43;14711:18;14707:68;14697:96;;14789:1;14786;14779:12;14697:96;14816:33;;14868:20;;;-1:-1:-1;;;;;;14900:30:58;;14897:50;;;14943:1;14940;14933:12;14897:50;14976:4;14964:17;;-1:-1:-1;15007:14:58;15003:27;;;14993:38;;14990:58;;;15044:1;15041;15034:12;15059:128;15126:9;;;15147:11;;;15144:37;;;15161:18;;:::i;17902:135::-;17941:3;17962:17;;;17959:43;;17982:18;;:::i;:::-;-1:-1:-1;18029:1:58;18018:13;;17902:135::o;20141:244::-;20298:2;20287:9;20280:21;20261:4;20318:61;20375:2;20364:9;20360:18;20352:6;20344;20318:61;:::i;20390:281::-;20448:6;20501:2;20489:9;20480:7;20476:23;20472:32;20469:52;;;20517:1;20514;20507:12;20469:52;20543:23;;-1:-1:-1;;;;;;20595:27:58;;20585:38;;20575:66;;20637:1;20634;20627:12;21795:459;22036:6;22025:9;22018:25;22079:6;22074:2;22063:9;22059:18;22052:34;22122:3;22117:2;22106:9;22102:18;22095:31;21999:4;22143:62;22200:3;22189:9;22185:19;22177:6;22169;22143:62;:::i;:::-;22135:70;;22241:6;22236:2;22225:9;22221:18;22214:34;21795:459;;;;;;;;:::o;22259:277::-;22326:6;22379:2;22367:9;22358:7;22354:23;22350:32;22347:52;;;22395:1;22392;22385:12;22347:52;22427:9;22421:16;22480:5;22473:13;22466:21;22459:5;22456:32;22446:60;;22502:1;22499;22492:12;22897:398;23099:2;23081:21;;;23138:2;23118:18;;;23111:30;23177:34;23172:2;23157:18;;23150:62;-1:-1:-1;;;23243:2:58;23228:18;;23221:32;23285:3;23270:19;;22897:398::o;26146:706::-;-1:-1:-1;;;;;;26403:33:58;;26391:46;;26460:13;;26373:3;;26482:74;26460:13;26545:1;26536:11;;26529:4;26517:17;;26482:74;:::i;:::-;26616:13;;26575:16;;;;26638:75;26616:13;26700:1;26692:10;;26685:4;26673:17;;26638:75;:::i;:::-;-1:-1:-1;;;;;;26783:33:58;;;;26739:17;;26758:1;26735:25;;26769:48;;;;-1:-1:-1;;26833:13:58;;;26146:706;-1:-1:-1;;;26146:706:58:o;26857:412::-;26975:12;;27023:4;27012:16;;27006:23;-1:-1:-1;;27047:40:58;;;26975:12;27110:2;27099:14;;27096:167;;;27225:26;27221:31;27190:26;27186:31;27176:6;27172:2;27168:15;27165:1;27161:23;27157:61;27153:2;27149:70;27145:108;27136:117;;27096:167;;;26857:412;;;:::o;27274:853::-;-1:-1:-1;;;;;;27633:33:58;;27621:46;;-1:-1:-1;;;;;;27696:28:58;;27692:1;27683:11;;27676:49;27768:6;27760;27756:1;27747:11;;27734:41;27603:3;27803:6;27798:3;27794:16;27837:1;27833:2;27829:10;27859:1;27855:2;27848:13;27895:6;27887;27883:2;27870:32;-1:-1:-1;27964:1:58;27925:15;;;27942:1;27921:23;27953:13;;;28000:6;27992;27921:23;27975:32;-1:-1:-1;;;;;;28061:33:58;;;;28026:15;;;;28050:45;;;-1:-1:-1;28119:1:58;28111:10;;27274:853;-1:-1:-1;;;;;;;;27274:853:58:o;28132:148::-;28220:4;28199:12;;;28213;;;28195:31;;28238:13;;28235:39;;;28254:18;;:::i","linkReferences":{}},"methodIdentifiers":{"LIGHT_CLIENT()":"e613ae00","SYSTEM_CALLER()":"d761753e","acceptOwnership()":"79ba5097","batchWithdraw(bytes32[],bytes4[])":"19854623","declareWithdrawFiller((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256),uint256,uint256)":"74ab4a83","deposit((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))":"dd95c7c6","depositAmount()":"419759f5","getWithdrawalCount()":"781952a8","initialize(bytes,bytes,uint256)":"41260137","initialized()":"158ef93e","isOperatorMalicious(uint256)":"bafa9eb2","markMaliciousOperator((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))":"5e3cc740","operator()":"570ca735","owner()":"8da5cb5b","pendingOwner()":"e30c3978","renounceOwnership()":"715018a6","scriptPrefix()":"a41c5cf3","scriptSuffix()":"87f8bf56","setDepositScript(bytes,bytes)":"f8e655d2","setOperator(address)":"b3ab15fb","setSlashOrTakeScript(bytes)":"f119a9bd","slashOrTakeScript()":"5d3e3176","transferOwnership(address)":"f2fde38b","txIdToDepositId(bytes32)":"11e53a01","withdraw(bytes32,bytes4)":"8786dba7","withdrawFillers(uint256)":"c045577b","withdrawalUTXOs(uint256)":"471ba1e3"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"InvalidInitialization\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"wtxId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"depositId\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"scriptPrefix\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"scriptSuffix\",\"type\":\"bytes\"}],\"name\":\"DepositScriptUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"operatorId\",\"type\":\"uint256\"}],\"name\":\"MaliciousOperatorMarked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldOperator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newOperator\",\"type\":\"address\"}],\"name\":\"OperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"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\":false,\"internalType\":\"bytes\",\"name\":\"slashOrTakeScript\",\"type\":\"bytes\"}],\"name\":\"SlashOrTakeScriptUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"withdrawFillerId\",\"type\":\"uint256\"}],\"name\":\"WithdrawFillerDeclared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"txId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"outputId\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"struct Bridge.UTXO\",\"name\":\"utxo\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LIGHT_CLIENT\",\"outputs\":[{\"internalType\":\"contract BitcoinLightClient\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SYSTEM_CALLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"txIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes4[]\",\"name\":\"outputIds\",\"type\":\"bytes4[]\"}],\"name\":\"batchWithdraw\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"version\",\"type\":\"bytes4\"},{\"internalType\":\"bytes2\",\"name\":\"flag\",\"type\":\"bytes2\"},{\"internalType\":\"bytes\",\"name\":\"vin\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"vout\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"witness\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"locktime\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"intermediate_nodes\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"block_height\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"internalType\":\"struct Bridge.TransactionParams\",\"name\":\"withdrawTp\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"inputIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawId\",\"type\":\"uint256\"}],\"name\":\"declareWithdrawFiller\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"version\",\"type\":\"bytes4\"},{\"internalType\":\"bytes2\",\"name\":\"flag\",\"type\":\"bytes2\"},{\"internalType\":\"bytes\",\"name\":\"vin\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"vout\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"witness\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"locktime\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"intermediate_nodes\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"block_height\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"internalType\":\"struct Bridge.TransactionParams\",\"name\":\"moveTp\",\"type\":\"tuple\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWithdrawalCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_scriptPrefix\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_scriptSuffix\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_depositAmount\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"isOperatorMalicious\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes4\",\"name\":\"version\",\"type\":\"bytes4\"},{\"internalType\":\"bytes2\",\"name\":\"flag\",\"type\":\"bytes2\"},{\"internalType\":\"bytes\",\"name\":\"vin\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"vout\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"witness\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"locktime\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"intermediate_nodes\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"block_height\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"internalType\":\"struct Bridge.TransactionParams\",\"name\":\"slashOrTakeTp\",\"type\":\"tuple\"}],\"name\":\"markMaliciousOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"operator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"scriptPrefix\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"scriptSuffix\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_scriptPrefix\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_scriptSuffix\",\"type\":\"bytes\"}],\"name\":\"setDepositScript\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"}],\"name\":\"setOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_slashOrTakeScript\",\"type\":\"bytes\"}],\"name\":\"setSlashOrTakeScript\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"slashOrTakeScript\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"txIdToDepositId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"txId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"outputId\",\"type\":\"bytes4\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawFillers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawalUTXOs\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"txId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes4\",\"name\":\"outputId\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Citrea\",\"errors\":{\"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.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"batchWithdraw(bytes32[],bytes4[])\":{\"details\":\"Takes in multiple Bitcoin addresses as recipient addresses should be unique\",\"params\":{\"outputIds\":\"the outputIds of the outputs in the withdrawal transactions\",\"txIds\":\"the txIds of the withdrawal transactions on Bitcoin\"}},\"declareWithdrawFiller((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256),uint256,uint256)\":{\"params\":{\"inputIndex\":\"Index of the input that is the withdrawal UTXO (withdrawing user's ANYONECANPAY)\",\"withdrawId\":\"ID of the withdrawal action\",\"withdrawTp\":\"Transaction parameters of the withdrawal transaction on Bitcoin\"}},\"deposit((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))\":{\"params\":{\"moveTp\":\"Transaction parameters of the move transaction on Bitcoin\"}},\"getWithdrawalCount()\":{\"returns\":{\"_0\":\"The count of withdrawals happened so far\"}},\"initialize(bytes,bytes,uint256)\":{\"params\":{\"_depositAmount\":\"The CBTC amount that can be deposited and withdrawn\",\"_scriptPrefix\":\"First part of the deposit script expected in the witness field for all L1 deposits \",\"_scriptSuffix\":\"The suffix of the deposit script that follows the receiver address\"}},\"markMaliciousOperator((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))\":{\"params\":{\"slashOrTakeTp\":\"Transaction parameters of the slashOrTake transaction on Bitcoin\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"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.\"},\"setDepositScript(bytes,bytes)\":{\"details\":\"Deposit script contains a fixed script that checks signatures of verifiers and pushes EVM address of the receiver\",\"params\":{\"_scriptPrefix\":\"The new deposit script prefix\",\"_scriptSuffix\":\"The part of the deposit script that succeeds the receiver address\"}},\"setOperator(address)\":{\"params\":{\"_operator\":\"Address of the privileged operator\"}},\"setSlashOrTakeScript(bytes)\":{\"params\":{\"_slashOrTakeScript\":\"The slashOrTake script\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"withdraw(bytes32,bytes4)\":{\"params\":{\"outputId\":\"The outputId of the output in the withdrawal transaction\",\"txId\":\"The txId of the withdrawal transaction on Bitcoin\"}}},\"title\":\"Bridge contract for the Citrea end of Citrea <> Bitcoin bridge\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchWithdraw(bytes32[],bytes4[])\":{\"notice\":\"Batch version of `withdraw` that can accept multiple cBTC\"},\"declareWithdrawFiller((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256),uint256,uint256)\":{\"notice\":\"Stores the filler of a certain withdrawal after the a user's withdrawal is covered on Bitcoin side\"},\"deposit((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))\":{\"notice\":\"Checks if the deposit amount is sent to the bridge multisig on Bitcoin, and if so, sends the deposit amount to the receiver\"},\"initialize(bytes,bytes,uint256)\":{\"notice\":\"Initializes the bridge contract and sets the deposit script\"},\"markMaliciousOperator((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))\":{\"notice\":\"Marks an operator as malicious if the operator burned their slashOrTake transaction as if they filled a withdrawal even though they didn't fill a withdrawal\"},\"setDepositScript(bytes,bytes)\":{\"notice\":\"Sets the expected deposit script of the deposit transaction on Bitcoin, contained in the witness\"},\"setOperator(address)\":{\"notice\":\"Sets the operator address that can process user deposits\"},\"setSlashOrTakeScript(bytes)\":{\"notice\":\"Sets the slashOrTake script that is expected in the witness field of the slashOrTake transaction on Bitcoin\"},\"withdraw(bytes32,bytes4)\":{\"notice\":\"Accepts 1 cBTC from the sender and inserts this withdrawal request of 1 BTC on Bitcoin into the withdrawals array so that later on can be processed by the operator \"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/Bridge.sol\":\"Bridge\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/\",\":bitcoin-spv/=lib/bitcoin-spv/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts/contracts/\"]},\"sources\":{\"lib/WitnessUtils.sol\":{\"keccak256\":\"0x0b0d59b4e73d6f5b4bbf1032f72bb15c2f1548c2ee319b80ae9e4c22576a70af\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://8499a5fc520941cb1b970637850cabfbc2d5a51abed824886063420c686b57de\",\"dweb:/ipfs/QmaLYLJ36PyFAaP3MgvFWW3knDsSUtVfCfs7Lp7oYFPZ1w\"]},\"lib/bitcoin-spv/solidity/contracts/BTCUtils.sol\":{\"keccak256\":\"0x439eaa97e9239705f3d31e8d39dccbad32311f1f119e295d53c65e0ae3c5a5fc\",\"urls\":[\"bzz-raw://976a361a89c21afc44b5e0a552271d9288b12cf34a9925c25f3c6975ece4e667\",\"dweb:/ipfs/QmNTb4eJyxV5iZj8RJGFBGSKXWsuvoMYqLLBgk16dhWePH\"]},\"lib/bitcoin-spv/solidity/contracts/BytesLib.sol\":{\"keccak256\":\"0x43e0f3b3b23c861bd031588bf410dfdd02e2af17941a89aa38d70e534e0380d1\",\"urls\":[\"bzz-raw://76011d699a8b229dbfdc698b3ece658daad9d96778e86d679aa576bc966209d6\",\"dweb:/ipfs/QmRZEWAeRQtsTUvfzEd1jb2wAqpTNR5KAme92gBRn4SYiT\"]},\"lib/bitcoin-spv/solidity/contracts/SafeMath.sol\":{\"keccak256\":\"0x35930d982394c7ffde439b82e5e696c5b21a6f09699d44861dfe409ef64084a3\",\"urls\":[\"bzz-raw://090e9d78755d4916fa2f5f5d8f9fd2fc59bfc5a25a5e91636a92c4c07aee9c6b\",\"dweb:/ipfs/QmXfz4TPDvgnuYz9eS5AL87GfCLxHQZJV1Y8ieJU9M8yTe\"]},\"lib/bitcoin-spv/solidity/contracts/ValidateSPV.sol\":{\"keccak256\":\"0xce3febbf3ad3a7ff8a8effd0c7ccaf7ccfa2719578b537d49ea196f0bae8062b\",\"urls\":[\"bzz-raw://5f18942483bf20507ae6c0abb5421df96b1aebb7af15f541bda8470f6277312a\",\"dweb:/ipfs/QmPzEpA8w5k6pVFadm3UCLqNdxFAjPwP9Lpi5HMQsQg52J\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0xbca4a4f66d98028293dba695851d1b20d3e0ba2fff7453fb241f192fa3fc6b6f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://013b3cfd9d1e34dad409c3b9a340860e8651e61cda509de33599fb5102f62fe7\",\"dweb:/ipfs/QmTVjDKofM9Nst8w8LAA3HHgi1eCnGYBpFb7Nbat71e2xz\"]},\"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/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"src/BitcoinLightClient.sol\":{\"keccak256\":\"0xddfe39aa55912ca37e57d5bc3a5ddea5b18c12980e03c16d0149e0ed8a49fca1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3c0f5bd6cbcdaeb577bdad15a63f96c21ecadc32d171de0e9d0c205635ff292e\",\"dweb:/ipfs/QmYhvEgXLoHque74UvHVGkARMptehwX5ekUEUcaZJuo3H2\"]},\"src/Bridge.sol\":{\"keccak256\":\"0xb9c48d4e58cab14b0cbb4932234c1e84143ca3bdf67ba1b985af4b26de8e845e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b25ff320f3e6becded6328f05027344197ead447f2ea5bcb060e795ae5999069\",\"dweb:/ipfs/QmaK736wv3SRmHkEJowc1jy9vhVkUeGtqG5oUugCf3dHPb\"]},\"src/interfaces/IBitcoinLightClient.sol\":{\"keccak256\":\"0xd299a79b3aec00e07839b7dcbed21d3d7d50e26c0149e730170f7761202552ca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d8cfcbc8fe666020b8a707d062e296dcf159737645a8c677975bad71b456b4ad\",\"dweb:/ipfs/QmSuDCXJFYpRpTXdiWVVwvm69yzmTZj7zMLmRPNazRR4dj\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.27+commit.40a35a09"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"InvalidInitialization"},{"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":[{"internalType":"bytes32","name":"wtxId","type":"bytes32","indexed":false},{"internalType":"bytes32","name":"txId","type":"bytes32","indexed":false},{"internalType":"address","name":"recipient","type":"address","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false},{"internalType":"uint256","name":"depositId","type":"uint256","indexed":false}],"type":"event","name":"Deposit","anonymous":false},{"inputs":[{"internalType":"bytes","name":"scriptPrefix","type":"bytes","indexed":false},{"internalType":"bytes","name":"scriptSuffix","type":"bytes","indexed":false}],"type":"event","name":"DepositScriptUpdate","anonymous":false},{"inputs":[{"internalType":"uint64","name":"version","type":"uint64","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"uint256","name":"operatorId","type":"uint256","indexed":false}],"type":"event","name":"MaliciousOperatorMarked","anonymous":false},{"inputs":[{"internalType":"address","name":"oldOperator","type":"address","indexed":false},{"internalType":"address","name":"newOperator","type":"address","indexed":false}],"type":"event","name":"OperatorUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferStarted","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":"bytes","name":"slashOrTakeScript","type":"bytes","indexed":false}],"type":"event","name":"SlashOrTakeScriptUpdate","anonymous":false},{"inputs":[{"internalType":"uint256","name":"withdrawId","type":"uint256","indexed":false},{"internalType":"uint256","name":"withdrawFillerId","type":"uint256","indexed":false}],"type":"event","name":"WithdrawFillerDeclared","anonymous":false},{"inputs":[{"internalType":"struct Bridge.UTXO","name":"utxo","type":"tuple","components":[{"internalType":"bytes32","name":"txId","type":"bytes32"},{"internalType":"bytes4","name":"outputId","type":"bytes4"}],"indexed":false},{"internalType":"uint256","name":"index","type":"uint256","indexed":false},{"internalType":"uint256","name":"timestamp","type":"uint256","indexed":false}],"type":"event","name":"Withdrawal","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"LIGHT_CLIENT","outputs":[{"internalType":"contract BitcoinLightClient","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SYSTEM_CALLER","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"acceptOwnership"},{"inputs":[{"internalType":"bytes32[]","name":"txIds","type":"bytes32[]"},{"internalType":"bytes4[]","name":"outputIds","type":"bytes4[]"}],"stateMutability":"payable","type":"function","name":"batchWithdraw"},{"inputs":[{"internalType":"struct Bridge.TransactionParams","name":"withdrawTp","type":"tuple","components":[{"internalType":"bytes4","name":"version","type":"bytes4"},{"internalType":"bytes2","name":"flag","type":"bytes2"},{"internalType":"bytes","name":"vin","type":"bytes"},{"internalType":"bytes","name":"vout","type":"bytes"},{"internalType":"bytes","name":"witness","type":"bytes"},{"internalType":"bytes4","name":"locktime","type":"bytes4"},{"internalType":"bytes","name":"intermediate_nodes","type":"bytes"},{"internalType":"uint256","name":"block_height","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}]},{"internalType":"uint256","name":"inputIndex","type":"uint256"},{"internalType":"uint256","name":"withdrawId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"declareWithdrawFiller"},{"inputs":[{"internalType":"struct Bridge.TransactionParams","name":"moveTp","type":"tuple","components":[{"internalType":"bytes4","name":"version","type":"bytes4"},{"internalType":"bytes2","name":"flag","type":"bytes2"},{"internalType":"bytes","name":"vin","type":"bytes"},{"internalType":"bytes","name":"vout","type":"bytes"},{"internalType":"bytes","name":"witness","type":"bytes"},{"internalType":"bytes4","name":"locktime","type":"bytes4"},{"internalType":"bytes","name":"intermediate_nodes","type":"bytes"},{"internalType":"uint256","name":"block_height","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}]}],"stateMutability":"nonpayable","type":"function","name":"deposit"},{"inputs":[],"stateMutability":"view","type":"function","name":"depositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getWithdrawalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes","name":"_scriptPrefix","type":"bytes"},{"internalType":"bytes","name":"_scriptSuffix","type":"bytes"},{"internalType":"uint256","name":"_depositAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"isOperatorMalicious","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct Bridge.TransactionParams","name":"slashOrTakeTp","type":"tuple","components":[{"internalType":"bytes4","name":"version","type":"bytes4"},{"internalType":"bytes2","name":"flag","type":"bytes2"},{"internalType":"bytes","name":"vin","type":"bytes"},{"internalType":"bytes","name":"vout","type":"bytes"},{"internalType":"bytes","name":"witness","type":"bytes"},{"internalType":"bytes4","name":"locktime","type":"bytes4"},{"internalType":"bytes","name":"intermediate_nodes","type":"bytes"},{"internalType":"uint256","name":"block_height","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}]}],"stateMutability":"nonpayable","type":"function","name":"markMaliciousOperator"},{"inputs":[],"stateMutability":"view","type":"function","name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[],"stateMutability":"view","type":"function","name":"scriptPrefix","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"scriptSuffix","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes","name":"_scriptPrefix","type":"bytes"},{"internalType":"bytes","name":"_scriptSuffix","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setDepositScript"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setOperator"},{"inputs":[{"internalType":"bytes","name":"_slashOrTakeScript","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"setSlashOrTakeScript"},{"inputs":[],"stateMutability":"view","type":"function","name":"slashOrTakeScript","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"txIdToDepositId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"bytes32","name":"txId","type":"bytes32"},{"internalType":"bytes4","name":"outputId","type":"bytes4"}],"stateMutability":"payable","type":"function","name":"withdraw"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"withdrawFillers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"withdrawalUTXOs","outputs":[{"internalType":"bytes32","name":"txId","type":"bytes32"},{"internalType":"bytes4","name":"outputId","type":"bytes4"}]}],"devdoc":{"kind":"dev","methods":{"acceptOwnership()":{"details":"The new owner accepts the ownership transfer."},"batchWithdraw(bytes32[],bytes4[])":{"details":"Takes in multiple Bitcoin addresses as recipient addresses should be unique","params":{"outputIds":"the outputIds of the outputs in the withdrawal transactions","txIds":"the txIds of the withdrawal transactions on Bitcoin"}},"declareWithdrawFiller((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256),uint256,uint256)":{"params":{"inputIndex":"Index of the input that is the withdrawal UTXO (withdrawing user's ANYONECANPAY)","withdrawId":"ID of the withdrawal action","withdrawTp":"Transaction parameters of the withdrawal transaction on Bitcoin"}},"deposit((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))":{"params":{"moveTp":"Transaction parameters of the move transaction on Bitcoin"}},"getWithdrawalCount()":{"returns":{"_0":"The count of withdrawals happened so far"}},"initialize(bytes,bytes,uint256)":{"params":{"_depositAmount":"The CBTC amount that can be deposited and withdrawn","_scriptPrefix":"First part of the deposit script expected in the witness field for all L1 deposits ","_scriptSuffix":"The suffix of the deposit script that follows the receiver address"}},"markMaliciousOperator((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))":{"params":{"slashOrTakeTp":"Transaction parameters of the slashOrTake transaction on Bitcoin"}},"owner()":{"details":"Returns the address of the current owner."},"pendingOwner()":{"details":"Returns the address of the pending owner."},"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."},"setDepositScript(bytes,bytes)":{"details":"Deposit script contains a fixed script that checks signatures of verifiers and pushes EVM address of the receiver","params":{"_scriptPrefix":"The new deposit script prefix","_scriptSuffix":"The part of the deposit script that succeeds the receiver address"}},"setOperator(address)":{"params":{"_operator":"Address of the privileged operator"}},"setSlashOrTakeScript(bytes)":{"params":{"_slashOrTakeScript":"The slashOrTake script"}},"transferOwnership(address)":{"details":"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner."},"withdraw(bytes32,bytes4)":{"params":{"outputId":"The outputId of the output in the withdrawal transaction","txId":"The txId of the withdrawal transaction on Bitcoin"}}},"version":1},"userdoc":{"kind":"user","methods":{"batchWithdraw(bytes32[],bytes4[])":{"notice":"Batch version of `withdraw` that can accept multiple cBTC"},"declareWithdrawFiller((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256),uint256,uint256)":{"notice":"Stores the filler of a certain withdrawal after the a user's withdrawal is covered on Bitcoin side"},"deposit((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))":{"notice":"Checks if the deposit amount is sent to the bridge multisig on Bitcoin, and if so, sends the deposit amount to the receiver"},"initialize(bytes,bytes,uint256)":{"notice":"Initializes the bridge contract and sets the deposit script"},"markMaliciousOperator((bytes4,bytes2,bytes,bytes,bytes,bytes4,bytes,uint256,uint256))":{"notice":"Marks an operator as malicious if the operator burned their slashOrTake transaction as if they filled a withdrawal even though they didn't fill a withdrawal"},"setDepositScript(bytes,bytes)":{"notice":"Sets the expected deposit script of the deposit transaction on Bitcoin, contained in the witness"},"setOperator(address)":{"notice":"Sets the operator address that can process user deposits"},"setSlashOrTakeScript(bytes)":{"notice":"Sets the slashOrTake script that is expected in the witness field of the slashOrTake transaction on Bitcoin"},"withdraw(bytes32,bytes4)":{"notice":"Accepts 1 cBTC from the sender and inserts this withdrawal request of 1 BTC on Bitcoin into the withdrawals array so that later on can be processed by the operator "}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/","bitcoin-spv/=lib/bitcoin-spv/","ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/openzeppelin-contracts/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"none","appendCBOR":false},"compilationTarget":{"src/Bridge.sol":"Bridge"},"evmVersion":"paris","libraries":{}},"sources":{"lib/WitnessUtils.sol":{"keccak256":"0x0b0d59b4e73d6f5b4bbf1032f72bb15c2f1548c2ee319b80ae9e4c22576a70af","urls":["bzz-raw://8499a5fc520941cb1b970637850cabfbc2d5a51abed824886063420c686b57de","dweb:/ipfs/QmaLYLJ36PyFAaP3MgvFWW3knDsSUtVfCfs7Lp7oYFPZ1w"],"license":"LGPL-3.0-or-later"},"lib/bitcoin-spv/solidity/contracts/BTCUtils.sol":{"keccak256":"0x439eaa97e9239705f3d31e8d39dccbad32311f1f119e295d53c65e0ae3c5a5fc","urls":["bzz-raw://976a361a89c21afc44b5e0a552271d9288b12cf34a9925c25f3c6975ece4e667","dweb:/ipfs/QmNTb4eJyxV5iZj8RJGFBGSKXWsuvoMYqLLBgk16dhWePH"],"license":null},"lib/bitcoin-spv/solidity/contracts/BytesLib.sol":{"keccak256":"0x43e0f3b3b23c861bd031588bf410dfdd02e2af17941a89aa38d70e534e0380d1","urls":["bzz-raw://76011d699a8b229dbfdc698b3ece658daad9d96778e86d679aa576bc966209d6","dweb:/ipfs/QmRZEWAeRQtsTUvfzEd1jb2wAqpTNR5KAme92gBRn4SYiT"],"license":null},"lib/bitcoin-spv/solidity/contracts/SafeMath.sol":{"keccak256":"0x35930d982394c7ffde439b82e5e696c5b21a6f09699d44861dfe409ef64084a3","urls":["bzz-raw://090e9d78755d4916fa2f5f5d8f9fd2fc59bfc5a25a5e91636a92c4c07aee9c6b","dweb:/ipfs/QmXfz4TPDvgnuYz9eS5AL87GfCLxHQZJV1Y8ieJU9M8yTe"],"license":null},"lib/bitcoin-spv/solidity/contracts/ValidateSPV.sol":{"keccak256":"0xce3febbf3ad3a7ff8a8effd0c7ccaf7ccfa2719578b537d49ea196f0bae8062b","urls":["bzz-raw://5f18942483bf20507ae6c0abb5421df96b1aebb7af15f541bda8470f6277312a","dweb:/ipfs/QmPzEpA8w5k6pVFadm3UCLqNdxFAjPwP9Lpi5HMQsQg52J"],"license":null},"lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol":{"keccak256":"0xbca4a4f66d98028293dba695851d1b20d3e0ba2fff7453fb241f192fa3fc6b6f","urls":["bzz-raw://013b3cfd9d1e34dad409c3b9a340860e8651e61cda509de33599fb5102f62fe7","dweb:/ipfs/QmTVjDKofM9Nst8w8LAA3HHgi1eCnGYBpFb7Nbat71e2xz"],"license":"MIT"},"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/utils/ContextUpgradeable.sol":{"keccak256":"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397","urls":["bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9","dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV"],"license":"MIT"},"src/BitcoinLightClient.sol":{"keccak256":"0xddfe39aa55912ca37e57d5bc3a5ddea5b18c12980e03c16d0149e0ed8a49fca1","urls":["bzz-raw://3c0f5bd6cbcdaeb577bdad15a63f96c21ecadc32d171de0e9d0c205635ff292e","dweb:/ipfs/QmYhvEgXLoHque74UvHVGkARMptehwX5ekUEUcaZJuo3H2"],"license":"MIT"},"src/Bridge.sol":{"keccak256":"0xb9c48d4e58cab14b0cbb4932234c1e84143ca3bdf67ba1b985af4b26de8e845e","urls":["bzz-raw://b25ff320f3e6becded6328f05027344197ead447f2ea5bcb060e795ae5999069","dweb:/ipfs/QmaK736wv3SRmHkEJowc1jy9vhVkUeGtqG5oUugCf3dHPb"],"license":"UNLICENSED"},"src/interfaces/IBitcoinLightClient.sol":{"keccak256":"0xd299a79b3aec00e07839b7dcbed21d3d7d50e26c0149e730170f7761202552ca","urls":["bzz-raw://d8cfcbc8fe666020b8a707d062e296dcf159737645a8c677975bad71b456b4ad","dweb:/ipfs/QmSuDCXJFYpRpTXdiWVVwvm69yzmTZj7zMLmRPNazRR4dj"],"license":"MIT"}},"version":1},"id":46} diff --git a/core/src/builder/transaction/creator.rs b/core/src/builder/transaction/creator.rs index d5974940..986533f3 100644 --- a/core/src/builder/transaction/creator.rs +++ b/core/src/builder/transaction/creator.rs @@ -565,10 +565,11 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn test_deposit_and_sign_txs() { - let config = create_test_config_with_thread_name(None).await; + let mut config = create_test_config_with_thread_name(None).await; + let _regtest = create_regtest_rpc(&mut config).await; let paramset = config.protocol_paramset(); - let (mut verifiers, mut operators, mut aggregator, mut watchtowers, _regtest) = + let (mut verifiers, mut operators, mut aggregator, mut watchtowers, _cleanup) = create_actors(&config).await; tracing::info!("Setting up aggregator"); diff --git a/core/src/citrea.rs b/core/src/citrea.rs new file mode 100644 index 00000000..1e62149c --- /dev/null +++ b/core/src/citrea.rs @@ -0,0 +1,125 @@ +//! # Citrea Related Utilities + +use crate::errors::BridgeError; +use alloy::{ + network::EthereumWallet, + primitives::U256, + providers::{ + fillers::{ + BlobGasFiller, ChainIdFiller, FillProvider, GasFiller, JoinFill, NonceFiller, + WalletFiller, + }, + ProviderBuilder, RootProvider, + }, + signers::{local::PrivateKeySigner, Signer}, + sol, + transports::http::reqwest::Url, +}; +use bitcoin::{hashes::Hash, OutPoint, Txid}; + +pub const CITREA_CHAIN_ID: u64 = 5655; +pub const LIGHT_CLIENT_ADDRESS: &str = "0x3100000000000000000000000000000000000001"; +pub const BRIDGE_CONTRACT_ADDRESS: &str = "0x3100000000000000000000000000000000000002"; +pub const SATS_TO_WEI_MULTIPLIER: u64 = 10_000_000_000; + +// Codegen from ABI file to interact with the contract. +sol!( + #[allow(missing_docs)] + #[sol(rpc)] + BRIDGE_CONTRACT, + "src/Bridge.json" +); + +// Ugly typedefs. +type Contract = BRIDGE_CONTRACT::BRIDGE_CONTRACTInstance< + (), + FillProvider< + JoinFill< + JoinFill< + alloy::providers::Identity, + JoinFill>>, + >, + WalletFiller, + >, + RootProvider, + >, +>; +type Provider = FillProvider< + JoinFill< + JoinFill< + alloy::providers::Identity, + JoinFill>>, + >, + WalletFiller, + >, + RootProvider, +>; + +/// Citrea contract client is responsible for creating contracts and interacting +/// with the EVM. +#[derive(Clone, Debug)] +pub struct CitreaContractClient { + pub wallet_address: alloy::primitives::Address, + pub provider: Provider, + pub contract: Contract, +} + +impl CitreaContractClient { + /// # Parameters + /// + /// - `citrea_rpc_url`: URL of the Citrea RPC. + /// - `secret_key`: Etherium secret key of the EVM user. If not give, dummy + /// secret key is used (wallet is not required). + pub fn new(citrea_rpc_url: Url, secret_key: Option) -> Result { + let secret_key = secret_key.unwrap_or(["01"; 32].concat()); + + let key = secret_key + .parse::() + .map_err(|e| BridgeError::Error(format!("Can't parse secret key: {:?}", e)))? + .with_chain_id(Some(CITREA_CHAIN_ID)); + let wallet_address = key.address(); + + let provider = ProviderBuilder::new() + .wallet(EthereumWallet::from(key)) + .on_http(citrea_rpc_url); + + let contract = BRIDGE_CONTRACT::new( + BRIDGE_CONTRACT_ADDRESS.parse().map_err(|e| { + BridgeError::Error(format!("Can't create bridge contract address {:?}", e)) + })?, + provider.clone(), + ); + + Ok(CitreaContractClient { + wallet_address, + provider, + contract, + }) + } + + /// Fetches an UTXO from Citrea for the given withdrawal with the index. + /// + /// # Parameters + /// + /// - `provider`: Provider to interact with the Ethereum network. + /// - `withdrawal_index`: Index of the withdrawal. + /// + /// # Returns + /// + /// - [`OutPoint`]: UTXO for the given withdrawal. + pub async fn withdrawal_utxos(&self, withdrawal_index: u64) -> Result { + let withdrawal_utxo = self + .contract + .withdrawalUTXOs(U256::from(withdrawal_index)) + .call() + .await?; + + let txid = withdrawal_utxo.txId.0; + let txid = Txid::from_slice(txid.as_slice())?; + + let vout = withdrawal_utxo.outputId.0; + let vout = u32::from_be_bytes(vout); + + Ok(OutPoint { txid, vout }) + } +} diff --git a/core/src/errors.rs b/core/src/errors.rs index d0cae05e..af417a54 100644 --- a/core/src/errors.rs +++ b/core/src/errors.rs @@ -342,6 +342,9 @@ pub enum BridgeError { /// 0: Data name, 1: Error message #[error("Error while sending {0} data: {1}")] SendError(&'static str, String), + + #[error("Error while creating contract: {0}")] + AlloyContract(#[from] alloy::contract::Error), } impl From for ErrorObject<'static> { diff --git a/core/src/lib.rs b/core/src/lib.rs index 266e01cb..8155c82f 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -13,6 +13,7 @@ pub mod aggregator; pub mod bitcoin_syncer; pub mod bitvm_client; pub mod builder; +pub mod citrea; pub mod cli; pub mod config; pub mod constants; diff --git a/core/src/operator.rs b/core/src/operator.rs index f3910e7c..bae535b4 100644 --- a/core/src/operator.rs +++ b/core/src/operator.rs @@ -8,6 +8,7 @@ use crate::builder::transaction::{ create_round_txhandlers, DepositData, KickoffWinternitzKeys, OperatorData, TransactionType, TxHandler, }; +use crate::citrea::CitreaContractClient; use crate::config::BridgeConfig; use crate::database::Database; use crate::database::DatabaseTransaction; @@ -19,6 +20,7 @@ use crate::tx_sender::{ ActivatedWithOutpoint, ActivatedWithTxid, FeePayingType, TxDataForLogging, TxSender, }; use crate::{builder, UTXO}; +use alloy::transports::http::reqwest::Url; use bitcoin::consensus::deserialize; use bitcoin::hashes::Hash; use bitcoin::secp256k1::schnorr::Signature; @@ -50,6 +52,7 @@ pub struct Operator { pub(crate) reimburse_addr: Address, pub tx_sender: TxSender, pub citrea_client: Option, + pub citrea_contract_client: Option, } impl Operator { @@ -119,6 +122,16 @@ impl Operator { }; dbtx.commit().await?; + let citrea_contract_client = if !config.citrea_rpc_url.is_empty() { + Some(CitreaContractClient::new( + Url::parse(&config.citrea_rpc_url).map_err(|e| { + BridgeError::Error(format!("Can't parse Citrea RPC URL: {:?}", e)) + })?, + None, + )?) + } else { + None + }; let citrea_client = if !config.citrea_rpc_url.is_empty() { Some(HttpClientBuilder::default().build(config.citrea_rpc_url.clone())?) } else { @@ -141,6 +154,7 @@ impl Operator { collateral_funding_outpoint, tx_sender, citrea_client, + citrea_contract_client, reimburse_addr, }) } @@ -328,23 +342,12 @@ impl Operator { }; // Check Citrea for the withdrawal state. - if let Some(citrea_client) = &self.citrea_client { - // See: https://gist.github.com/okkothejawa/a9379b02a16dada07a2b85cbbd3c1e80 - let params = rpc_params![ - json!({ - "to": "0x3100000000000000000000000000000000000002", - "data": format!("0x471ba1e300000000000000000000000000000000000000000000000000000000{}", - hex::encode(withdrawal_index.to_be_bytes())), - }), - "latest" - ]; - let response: String = citrea_client.request("eth_call", params).await?; - - let txid_response = &response[2..66]; - let txid = hex::decode(txid_response).map_err(|e| BridgeError::Error(e.to_string()))?; - // txid.reverse(); // TODO: we should need to reverse this, test this with declareWithdrawalFiller + if let Some(citrea_contract_client) = &self.citrea_contract_client { + let txid = citrea_contract_client + .withdrawal_utxos(withdrawal_index.into()) + .await? + .txid; - let txid = Txid::from_slice(&txid)?; if txid != input_utxo.outpoint.txid || 0 != input_utxo.outpoint.vout { // TODO: Fix this, vout can be different from 0 as well return Err(BridgeError::InvalidInputUTXO( diff --git a/core/src/rpc/aggregator.rs b/core/src/rpc/aggregator.rs index 9e58f958..9bb0b988 100644 --- a/core/src/rpc/aggregator.rs +++ b/core/src/rpc/aggregator.rs @@ -883,7 +883,6 @@ impl ClementineAggregator for Aggregator { mod tests { use crate::actor::Actor; use crate::musig2::AggregateFromPublicKeys; - use crate::rpc::clementine::{self}; use crate::{builder, EVMAddress}; use crate::{rpc::clementine::DepositParams, test::common::*}; @@ -895,9 +894,10 @@ mod tests { #[tokio::test] async fn aggregator_double_setup_fail() { - let config = create_test_config_with_thread_name(None).await; + let mut config = create_test_config_with_thread_name(None).await; + let _regtest = create_regtest_rpc(&mut config).await; - let (_, _, mut aggregator, _, _regtest) = create_actors(&config).await; + let (_, _, mut aggregator, _, _cleanup) = create_actors(&config).await; aggregator .setup(tonic::Request::new(clementine::Empty {})) @@ -915,7 +915,7 @@ mod tests { async fn aggregator_setup_and_deposit() { let config = create_test_config_with_thread_name(None).await; - let (_, _, mut aggregator, _, _regtest) = create_actors(&config).await; + let (_, _, mut aggregator, _, _cleanup) = create_actors(&config).await; tracing::info!("Setting up aggregator"); let start = std::time::Instant::now(); @@ -951,10 +951,11 @@ mod tests { #[tokio::test(flavor = "multi_thread")] async fn aggregator_deposit_movetx_lands_onchain() { - let config = create_test_config_with_thread_name(None).await; - let (_verifiers, _operators, mut aggregator, _watchtowers, regtest) = - create_actors(&config).await; + let mut config = create_test_config_with_thread_name(None).await; + let regtest = create_regtest_rpc(&mut config).await; let rpc = regtest.rpc(); + let (_verifiers, _operators, mut aggregator, _watchtowers, _cleanup) = + create_actors(&config).await; let evm_address = EVMAddress([1u8; 20]); let signer = Actor::new( diff --git a/core/src/rpc/verifier.rs b/core/src/rpc/verifier.rs index ebc0c5d0..79271dcd 100644 --- a/core/src/rpc/verifier.rs +++ b/core/src/rpc/verifier.rs @@ -250,7 +250,7 @@ impl ClementineVerifier for Verifier { req: Request>, ) -> Result, Status> { let mut in_stream = req.into_inner(); - tracing::debug!("In verifier {} deposit_finalize()", self.idx); + tracing::trace!("In verifier {} deposit_finalize()", self.idx); let (sig_tx, sig_rx) = mpsc::channel(1280); let (agg_nonce_tx, agg_nonce_rx) = mpsc::channel(1); @@ -263,7 +263,7 @@ impl ClementineVerifier for Verifier { } _ => Err(Status::internal("Expected DepositOutpoint"))?, }; - tracing::debug!( + tracing::trace!( "verifier {} got DepositSignFirstParam in deposit_finalize()", self.idx ); diff --git a/core/src/servers.rs b/core/src/servers.rs index 89a6ba64..4a067fad 100644 --- a/core/src/servers.rs +++ b/core/src/servers.rs @@ -158,13 +158,6 @@ pub async fn create_verifier_grpc_server( pub async fn create_operator_grpc_server( config: BridgeConfig, ) -> Result<(std::net::SocketAddr, oneshot::Sender<()>), BridgeError> { - let _rpc = ExtendedRpc::connect( - config.bitcoin_rpc_url.clone(), - config.bitcoin_rpc_user.clone(), - config.bitcoin_rpc_password.clone(), - ) - .await?; - tracing::info!( "config host and port are: {} and {}", config.host, diff --git a/core/src/test/common/citrea/bitcoin_merkle.rs b/core/src/test/common/citrea/bitcoin_merkle.rs new file mode 100644 index 00000000..f380d96d --- /dev/null +++ b/core/src/test/common/citrea/bitcoin_merkle.rs @@ -0,0 +1,174 @@ +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BitcoinMerkleTree { + depth: u32, + nodes: Vec>, +} + +pub fn calculate_double_sha256(input: &[u8]) -> [u8; 32] { + let mut hasher = Sha256::default(); + hasher.update(input); + let result = hasher.finalize_reset(); + hasher.update(result); + hasher.finalize().into() +} + +impl BitcoinMerkleTree { + pub fn new(transactions: Vec<[u8; 32]>) -> Self { + // assert!(depth > 0, "Depth must be greater than 0"); + // assert!(depth <= 254, "Depth must be less than or equal to 254"); + // assert!( + // u32::pow(2, (depth) as u32) >= transactions.len() as u32, + // "Too many transactions for this depth" + // ); + let depth = (transactions.len() - 1).ilog(2) + 1; + let mut tree = BitcoinMerkleTree { + depth, + nodes: vec![], + }; + + // Populate leaf nodes + tree.nodes.push(vec![]); + for tx in transactions.iter() { + tree.nodes[0].push(*tx); + } + + // Construct the tree + let mut curr_level_offset: usize = 1; + let mut prev_level_size = transactions.len(); + let mut prev_level_index_offset = 0; + let mut preimage: [u8; 64] = [0; 64]; + while prev_level_size > 1 { + // println!("curr_level_offset: {}", curr_level_offset); + // println!("prev_level_size: {}", prev_level_size); + // println!("prev_level_index_offset: {}", prev_level_index_offset); + tree.nodes.push(vec![]); + for i in 0..(prev_level_size / 2) { + preimage[..32].copy_from_slice( + &tree.nodes[curr_level_offset - 1_usize][prev_level_index_offset + i * 2], + ); + preimage[32..].copy_from_slice( + &tree.nodes[curr_level_offset - 1][prev_level_index_offset + i * 2 + 1], + ); + let combined_hash = calculate_double_sha256(&preimage); + tree.nodes[curr_level_offset].push(combined_hash); + } + if prev_level_size % 2 == 1 { + let mut preimage: [u8; 64] = [0; 64]; + preimage[..32].copy_from_slice( + &tree.nodes[curr_level_offset - 1] + [prev_level_index_offset + prev_level_size - 1], + ); + preimage[32..].copy_from_slice( + &tree.nodes[curr_level_offset - 1] + [prev_level_index_offset + prev_level_size - 1], + ); + let combined_hash = calculate_double_sha256(&preimage); + tree.nodes[curr_level_offset].push(combined_hash); + } + curr_level_offset += 1; + prev_level_size = (prev_level_size + 1) / 2; + prev_level_index_offset = 0; + } + tree + } + + // Returns the Merkle root + pub fn root(&self) -> [u8; 32] { + self.nodes[self.nodes.len() - 1][0] + } + + pub fn _get_element(&self, level: u32, index: u32) -> [u8; 32] { + self.nodes[level as usize][index as usize] + } + + pub fn get_idx_path(&self, index: u32) -> Vec<[u8; 32]> { + assert!(index < self.nodes[0].len() as u32, "Index out of bounds"); + let mut path = vec![]; + let mut level = 0; + let mut i = index; + while level < self.nodes.len() as u32 - 1 { + if i % 2 == 1 { + path.push(self.nodes[level as usize][i as usize - 1]); + } else if (self.nodes[level as usize].len() - 1) as u32 == i { + path.push(self.nodes[level as usize][i as usize]); + } else { + path.push(self.nodes[level as usize][(i + 1) as usize]); + } + + level += 1; + i /= 2; + } + + path + } + + // pub fn verify_tx_merkle_proof(&self, idx: u32, merkle_proof: Vec<[u8; 32]>) { + // let tx_id = self.nodes[0][idx as usize]; + // let mut preimage: [u8; 64] = [0; 64]; + // let mut combined_hash: [u8; 32] = tx_id.clone(); + // let mut index = idx; + // let mut level: u32 = 0; + // while level < self.depth { + // if index % 2 == 0 { + // preimage[..32].copy_from_slice(&combined_hash); + // preimage[32..].copy_from_slice(&merkle_proof[level as usize]); + // combined_hash = calculate_double_sha256(&preimage); + // } else { + // preimage[..32].copy_from_slice(&merkle_proof[level as usize]); + // preimage[32..].copy_from_slice(&combined_hash); + // combined_hash = calculate_double_sha256(&preimage); + // } + // level += 1; + // index = index / 2; + // } + // assert_eq!(combined_hash, self.root()); + // } + + pub fn calculate_root_with_merkle_proof( + &self, + txid: [u8; 32], + idx: u32, + merkle_proof: Vec<[u8; 32]>, + ) -> [u8; 32] { + let mut preimage: [u8; 64] = [0; 64]; + let mut combined_hash: [u8; 32] = txid; + let mut index = idx; + let mut level: u32 = 0; + while level < self.depth { + if index % 2 == 0 { + preimage[..32].copy_from_slice(&combined_hash); + preimage[32..].copy_from_slice(&merkle_proof[level as usize]); + combined_hash = calculate_double_sha256(&preimage); + } else { + preimage[..32].copy_from_slice(&merkle_proof[level as usize]); + preimage[32..].copy_from_slice(&combined_hash); + combined_hash = calculate_double_sha256(&preimage); + } + level += 1; + index /= 2; + } + combined_hash + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_merkle_tree() { + let mut transactions: Vec<[u8; 32]> = vec![]; + for i in 0u8..10u8 { + let tx = [i; 32]; + transactions.push(tx); + } + let tree = BitcoinMerkleTree::new(transactions.clone()); + let root = tree.root(); + let idx_path = tree.get_idx_path(0); + let calculated_root = tree.calculate_root_with_merkle_proof(transactions[0], 0, idx_path); + assert_eq!(root, calculated_root); + } +} diff --git a/core/src/test/common/citrea/mod.rs b/core/src/test/common/citrea/mod.rs new file mode 100644 index 00000000..16e7e739 --- /dev/null +++ b/core/src/test/common/citrea/mod.rs @@ -0,0 +1,101 @@ +//! # Citrea Related Utilities + +use crate::config::BridgeConfig; +use citrea_e2e::{ + bitcoin::BitcoinNode, + config::{EmptyConfig, SequencerConfig}, + framework::TestFramework, + node::{Node, NodeKind}, +}; +pub use parameters::*; +pub use requests::*; + +mod bitcoin_merkle; +mod parameters; +mod requests; + +/// Citrea bridge params. This string includes N-of-N public key for the current +/// test setup. If that setup changes, this string should be updated or needs to +/// calculated dynamically. +pub const BRIDGE_PARAMS: &str = "000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000002d4a20423a0b35060e62053765e2aba342f1c242e78d68f5248aca26e703c0c84ca322ac0063066369747265611400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a08000000003b9aca006800000000000000000000000000000000000000000000"; + +/// Citrea e2e hardcoded EVM secret keys. +pub const SECRET_KEYS: [&str; 10] = [ + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", + "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", + "0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a", + "0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba", + "0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e", + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356", + "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97", + "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6", +]; + +/// Citrea e2e hardcoded EVM addresses. +pub const EVM_ADDRESSES: [&str; 10] = [ + "f39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "70997970C51812dc3A010C7d01b50e0d17dc79C8", + "3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "90F79bf6EB2c4f870365E785982E1f101E93b906", + "15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + "9965507D1a55bcC2695C58ba16FB37d819B0A4dc", + "976EA74026E726554dB657fA54763abd0C3a0aa9", + "14dC79964da2C08b23698B3D3cc7Ca32193d9955", + "23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", + "a0Ee7A142d267C1f36714E4a8F75612F20a79720", +]; + +/// Starts typical nodes with typical configs for a test that needs Citrea. +pub async fn start_citrea( + sequencer_config: SequencerConfig, + f: &mut TestFramework, +) -> citrea_e2e::Result<(&Node, &mut Node, &BitcoinNode)> { + let sequencer = f.sequencer.as_ref().expect("Sequencer is present"); + let full_node = f.full_node.as_mut().expect("Full node is present"); + let da = f.bitcoin_nodes.get(0).expect("There is a bitcoin node"); + + let min_soft_confirmations_per_commitment = + sequencer_config.min_soft_confirmations_per_commitment; + + // sequencer_config.test_mode = true; + // sequencer.config.node.test_mode + // for _ in 0..min_soft_confirmations_per_commitment { + // sequencer.client.send_publish_batch_request().await?; + // } + + // Wait for blob inscribe tx to be in mempool + da.wait_mempool_len(1, None).await?; + + da.generate(citrea_e2e::bitcoin::DEFAULT_FINALITY_DEPTH) + .await?; + + full_node + .wait_for_l2_height(min_soft_confirmations_per_commitment, None) + .await?; + + Ok((sequencer, full_node, da)) +} + +/// Updates given config with the values set by the Citrea e2e. +pub fn update_config_with_citrea_e2e_values( + config: &mut BridgeConfig, + da: &citrea_e2e::bitcoin::BitcoinNode, + sequencer: &citrea_e2e::node::Node, +) { + config.bitcoin_rpc_password = da.config.rpc_password.clone(); + config.bitcoin_rpc_user = da.config.rpc_user.clone(); + config.bitcoin_rpc_password = da.config.rpc_password.clone(); + config.bitcoin_rpc_url = format!( + "http://127.0.0.1:{}/wallet/{}", + da.config.rpc_port, + NodeKind::Bitcoin // citrea-e2e internal. + ); + + let citrea_url = format!( + "http://{}:{}", + sequencer.config.rollup.rpc.bind_host, sequencer.config.rollup.rpc.bind_port + ); + config.citrea_rpc_url = citrea_url; +} diff --git a/core/src/test/common/citrea/parameters.rs b/core/src/test/common/citrea/parameters.rs new file mode 100644 index 00000000..98b86248 --- /dev/null +++ b/core/src/test/common/citrea/parameters.rs @@ -0,0 +1,137 @@ +//! # Parameter Builder For Citrea Requests + +use crate::citrea::Bridge::TransactionParams; +use crate::errors::BridgeError; +use crate::test::common::citrea::bitcoin_merkle::BitcoinMerkleTree; +use alloy::primitives::{Bytes, FixedBytes, Uint}; +use bitcoin::consensus::Encodable; +use bitcoin::hashes::Hash; +use bitcoin::{Block, Transaction, Txid}; + +/// Returns merkle proof for a given transaction (via txid) in a block. +fn get_block_merkle_proof( + block: Block, + target_txid: Txid, +) -> Result<(usize, Vec), BridgeError> { + let mut txid_index = 0; + let txids = block + .txdata + .iter() + .enumerate() + .map(|(i, tx)| { + if tx.compute_txid() == target_txid { + txid_index = i; + } + + if i == 0 { + [0; 32] + } else { + let wtxid = tx.compute_wtxid(); + wtxid.as_byte_array().to_owned() + } + }) + .collect::>(); + + let merkle_tree = BitcoinMerkleTree::new(txids.clone()); + let _witness_root = block.witness_root().unwrap(); + let witness_idx_path = merkle_tree.get_idx_path(txid_index.try_into().unwrap()); + + let _root = merkle_tree.calculate_root_with_merkle_proof( + txids[txid_index], + txid_index.try_into().unwrap(), + witness_idx_path.clone(), + ); + + Ok((txid_index, witness_idx_path.into_iter().flatten().collect())) +} + +/// Returns [`TransactionParams`] for a given transaction, which can be later +/// used for deposit and withdrawal operations. +pub fn get_transaction_params( + transaction: Transaction, + block: Block, + block_height: u32, + txid: Txid, +) -> Result { + // Version is in little endian format in Bitcoin. + let version = (transaction.version.0 as u32).to_le_bytes(); + // TODO: Flag should be 0 if no witness elements. Do this in the future if + // needed. + let flag: u16 = 1; + + let vin: Vec = transaction + .input + .iter() + .map(|input| { + let mut encoded_input = Vec::new(); + let mut previous_output = Vec::new(); + input + .previous_output + .consensus_encode(&mut previous_output) + .unwrap(); + let mut script_sig = Vec::new(); + input.script_sig.consensus_encode(&mut script_sig).unwrap(); + let mut sequence = Vec::new(); + input.sequence.consensus_encode(&mut sequence).unwrap(); + + encoded_input.extend(previous_output); + encoded_input.extend(script_sig); + encoded_input.extend(sequence); + + Ok::, BridgeError>(encoded_input) + }) + .collect::, _>>()? + .into_iter() + .flatten() + .collect(); + let vin = [vec![transaction.input.len() as u8], vin].concat(); + + let vout: Vec = transaction + .output + .iter() + .map(|param| { + let mut raw = Vec::new(); + param + .consensus_encode(&mut raw) + .map_err(|e| BridgeError::Error(format!("Can't encode param: {}", e)))?; + + Ok::, BridgeError>(raw) + }) + .collect::, _>>()? + .into_iter() + .flatten() + .collect::>(); + let vout = [vec![transaction.output.len() as u8], vout].concat(); + + let witness: Vec = transaction + .input + .iter() + .map(|param| { + let mut raw = Vec::new(); + param + .witness + .consensus_encode(&mut raw) + .map_err(|e| BridgeError::Error(format!("Can't encode param: {}", e)))?; + + Ok::, BridgeError>(raw) + }) + .collect::, _>>()? + .into_iter() + .flatten() + .collect::>(); + + let locktime: u32 = transaction.lock_time.to_consensus_u32(); + let (index, merkle_proof) = get_block_merkle_proof(block, txid)?; + + Ok(TransactionParams { + version: FixedBytes::from(version), + flag: FixedBytes::from(flag), + vin: Bytes::copy_from_slice(&vin), + vout: Bytes::copy_from_slice(&vout), + witness: Bytes::copy_from_slice(&witness), + locktime: FixedBytes::from(locktime), + intermediate_nodes: Bytes::copy_from_slice(&merkle_proof), + block_height: Uint::from(block_height), + index: Uint::from(index), + }) +} diff --git a/core/src/test/common/citrea/requests.rs b/core/src/test/common/citrea/requests.rs new file mode 100644 index 00000000..9e3000c7 --- /dev/null +++ b/core/src/test/common/citrea/requests.rs @@ -0,0 +1,68 @@ +use crate::citrea::LIGHT_CLIENT_ADDRESS; +use crate::errors::BridgeError; +use crate::test::common::citrea::parameters::get_transaction_params; +use crate::EVMAddress; +use alloy::sol_types::SolValue; +use bitcoin::{Block, Transaction}; +use jsonrpsee::core::client::ClientT; +use jsonrpsee::http_client::HttpClient; +use jsonrpsee::rpc_params; +use serde_json::json; + +pub async fn block_number(client: HttpClient) -> Result { + let params = rpc_params![ + json!({ + "to": LIGHT_CLIENT_ADDRESS, + "data": "0x57e871e7" + }), + "latest" + ]; + + let response: String = client.request("eth_call", params).await?; + + let decoded_hex = hex::decode(&response[2..]).map_err(|e| BridgeError::Error(e.to_string()))?; + let block_number = decoded_hex + .iter() + .rev() + .take(4) + .rev() + .fold(0u32, |acc, &byte| (acc << 8) | byte as u32); + + Ok(block_number) +} + +pub async fn eth_get_balance( + client: HttpClient, + evm_address: EVMAddress, +) -> Result { + let params = rpc_params![evm_address.0, "latest"]; + + let response: String = client.request("eth_getBalance", params).await?; + let ret = u128::from_str_radix(&response[2..], 16) + .map_err(|e| BridgeError::Error(format!("Can't convert hex to int: {}", e)))?; + + Ok(ret) +} + +/// Deposits a transaction to Citrea. This function is different from `contract.deposit` because it +/// won't directly talk with EVM but with Citrea. So that authorization can be done (Citrea will +/// block this call if it isn't an operator). +pub async fn deposit( + client: HttpClient, + block: Block, + block_height: u32, + transaction: Transaction, +) -> Result<(), BridgeError> { + let txid = transaction.compute_txid(); + + let params = get_transaction_params(transaction, block, block_height, txid)?; + + let _response: () = client + .request( + "citrea_sendRawDepositTransaction", + rpc_params!(hex::encode(params.abi_encode())), + ) + .await?; + + Ok(()) +} diff --git a/core/src/test/common/mod.rs b/core/src/test/common/mod.rs index e5b0a057..3d426598 100644 --- a/core/src/test/common/mod.rs +++ b/core/src/test/common/mod.rs @@ -1,10 +1,7 @@ //! # Common Utilities for Integration Tests -#![allow(unused)] - use crate::actor::Actor; use crate::config::BridgeConfig; -use crate::database::Database; use crate::errors::BridgeError; use crate::extended_rpc::ExtendedRpc; use crate::rpc::clementine::clementine_aggregator_client::ClementineAggregatorClient; @@ -12,262 +9,126 @@ use crate::rpc::clementine::clementine_operator_client::ClementineOperatorClient use crate::rpc::clementine::clementine_verifier_client::ClementineVerifierClient; use crate::rpc::clementine::clementine_watchtower_client::ClementineWatchtowerClient; use crate::rpc::clementine::{DepositParams, Empty}; -use crate::servers::{ - create_aggregator_grpc_server, create_operator_grpc_server, create_verifier_grpc_server, - create_watchtower_grpc_server, -}; use crate::EVMAddress; -use crate::{builder, musig2::AggregateFromPublicKeys}; -use bitcoin::OutPoint; +use bitcoin::{OutPoint, Txid}; +use bitcoincore_rpc::RpcApi; pub use test_utils::*; use tonic::transport::Channel; use tonic::Request; +pub mod citrea; mod test_utils; -// pub async fn run_multiple_deposits(test_config_name: &str) { -// let config = create_test_config_with_thread_name(test_config_name, None); -// let rpc = ExtendedRpc::connect( -// config.bitcoin_rpc_url.clone(), -// config.bitcoin_rpc_user.clone(), -// config.bitcoin_rpc_password.clone(), -// ) -// .await; -// let secp = secp256k1::Secp256k1::new(); -// let (verifiers, operators, aggregator) = -// create_verifiers_and_operators("test_config.toml").await; - -// // println!("Operators: {:#?}", operators); -// // println!("Verifiers: {:#?}", verifiers); - -// let secret_key = secp256k1::SecretKey::new(&mut secp256k1::rand::thread_rng()); - -// let signer_address = Actor::new(secret_key, config.winternitz_secret_key, config.protocol_paramset().network) -// .address -// .as_unchecked() -// .clone(); -// let user = User::new(rpc.clone_inner().await.unwrap(), secret_key, config.clone()); - -// let evm_address = EVMAddress([1u8; 20]); -// let deposit_address = user.get_deposit_address(evm_address).unwrap(); This line needs to be converted into get_deposit_address -// let mut deposit_outpoints = Vec::new(); -// for _ in 0..config.operator_num_kickoff_utxos_per_tx + 1 { -// let deposit_outpoint = rpc -// .send_to_address(&deposit_address, config.protocol_paramset().bridge_amount) -// .await -// .unwrap(); - -// rpc.mine_blocks(18).await.unwrap(); - -// let mut pub_nonces = Vec::new(); - -// for (client, _, _) in verifiers.iter() { -// let musig_pub_nonces = client -// .verifier_new_deposit_rpc(deposit_outpoint, signer_address.clone(), evm_address) -// .await -// .unwrap(); - -// pub_nonces.push(musig_pub_nonces); -// } -// let agg_nonces = aggregator -// .0 -// .aggregate_pub_nonces_rpc(pub_nonces) -// .await -// .unwrap(); -// let mut kickoff_utxos = Vec::new(); -// let mut signatures = Vec::new(); - -// for (client, _, _) in operators.iter() { -// let (kickoff_utxo, signature) = client -// .new_deposit_rpc(deposit_outpoint, signer_address.clone(), evm_address) -// .await -// .unwrap(); - -// kickoff_utxos.push(kickoff_utxo); -// signatures.push(signature); -// } - -// println!("Now the verifiers sequence starts"); -// let mut slash_or_take_partial_sigs = Vec::new(); - -// for (client, ..) in verifiers.iter() { -// let (partial_sigs, _) = client -// .operator_kickoffs_generated_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// signatures.clone(), -// agg_nonces.clone(), -// ) -// .await -// .unwrap(); - -// slash_or_take_partial_sigs.push(partial_sigs); -// } - -// let slash_or_take_sigs = aggregator -// .0 -// .aggregate_slash_or_take_sigs_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// agg_nonces[config.num_operators + 1..2 * config.num_operators + 1].to_vec(), -// slash_or_take_partial_sigs, -// ) -// .await -// .unwrap(); -// let mut operator_take_partial_sigs: Vec> = Vec::new(); -// for (client, ..) in verifiers.iter() { -// let partial_sigs = client -// .burn_txs_signed_rpc(deposit_outpoint, vec![], slash_or_take_sigs.clone()) -// .await -// .unwrap(); -// operator_take_partial_sigs.push(partial_sigs); -// } +pub async fn run_multiple_deposits( + config: &mut BridgeConfig, + rpc: ExtendedRpc, + count: usize, +) -> Result< + ( + Vec>, + Vec>, + ClementineAggregatorClient, + Vec>, + ActorsCleanup, + Vec, + Vec, + ), + BridgeError, +> { + let (verifiers, operators, mut aggregator, watchtowers, cleanup) = create_actors(config).await; -// let operator_take_sigs = aggregator -// .0 -// .aggregate_operator_take_sigs_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// agg_nonces[1..config.num_operators + 1].to_vec(), -// operator_take_partial_sigs, -// ) -// .await -// .unwrap(); + let evm_address = EVMAddress([1u8; 20]); + let actor = Actor::new( + config.secret_key, + config.winternitz_secret_key, + config.protocol_paramset().network, + ); + let (deposit_address, _) = get_deposit_address(config, evm_address)?; -// let mut move_tx_partial_sigs = Vec::new(); -// for (client, _, _) in verifiers.iter() { -// let move_tx_partial_sig = client -// .operator_take_txs_signed_rpc(deposit_outpoint, operator_take_sigs.clone()) -// .await -// .unwrap(); -// move_tx_partial_sigs.push(move_tx_partial_sig); -// } + aggregator.setup(Request::new(Empty {})).await?; -// let (move_tx, _) = aggregator -// .0 -// .aggregate_move_tx_sigs_rpc( -// deposit_outpoint, -// signer_address.clone(), -// evm_address, -// agg_nonces[0], -// move_tx_partial_sigs, -// ) -// .await -// .unwrap(); -// let move_tx: Transaction = deserialize_hex(&move_tx).unwrap(); + let mut deposit_outpoints = Vec::new(); + let mut move_txids = Vec::new(); + for _ in 0..count { + let deposit_outpoint: OutPoint = rpc + .send_to_address(&deposit_address, config.protocol_paramset().bridge_amount) + .await?; + rpc.mine_blocks(18).await?; + + let move_txid: Txid = aggregator + .new_deposit(DepositParams { + deposit_outpoint: Some(deposit_outpoint.into()), + evm_address: evm_address.0.to_vec(), + recovery_taproot_address: actor.address.to_string(), + }) + .await? + .into_inner() + .try_into()?; + rpc.mine_blocks(1).await?; + + let start = std::time::Instant::now(); + let timeout = 60; + let _tx = loop { + if start.elapsed() > std::time::Duration::from_secs(timeout) { + panic!("MoveTx did not land onchain within {timeout} seconds"); + } + rpc.mine_blocks(1).await?; + + let tx_result = rpc.client.get_raw_transaction_info(&move_txid, None).await; + + let tx_result = match tx_result { + Ok(tx) => tx, + Err(e) => { + tracing::info!("Waiting for transaction to be on-chain: {}", e); + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + continue; + } + }; + + break tx_result; + }; + + deposit_outpoints.push(deposit_outpoint); + move_txids.push(move_txid); + } -// println!("Move tx weight: {:?}", move_tx.weight()); -// let move_txid = rpc.client.send_raw_transaction(&move_tx).await.unwrap(); -// println!("Move txid: {:?}", move_txid); -// deposit_outpoints.push(deposit_outpoint); -// } -// let withdrawal_address = Address::p2tr( -// &secp, -// secret_key.x_only_public_key(&secp).0, -// None, -// config.protocol_paramset().network, -// ); -// let (user_utxo, user_txout, user_sig) = user -// .generate_withdrawal_transaction_and_signature( -// withdrawal_address.clone(), -// Amount::from_sat( -// config.protocol_paramset().bridge_amount.to_sat() -// - 2 * config.operator_withdrawal_fee_sats.unwrap().to_sat(), -// ), -// ) -// .await -// .unwrap(); This line needs to be converted into generate_withdrawal_transaction_and_signature -// let withdrawal_provide_txid = operators[0] -// .0 -// .new_withdrawal_sig_rpc(0, user_sig, user_utxo, user_txout) -// .await -// .unwrap(); -// println!("Withdrawal provide txid: {:?}", withdrawal_provide_txid); -// let txs_to_be_sent_0 = operators[0] -// .0 -// .withdrawal_proved_on_citrea_rpc(0, deposit_outpoints[0]) -// .await -// .unwrap(); -// assert!(txs_to_be_sent_0.len() == 3); -// let (user_utxo, user_txout, user_sig) = user -// .generate_withdrawal_transaction_and_signature( -// withdrawal_address.clone(), -// Amount::from_sat( -// config.protocol_paramset().bridge_amount.to_sat() -// - 2 * config.operator_withdrawal_fee_sats.unwrap().to_sat(), -// ), -// ) -// .await -// .unwrap(); This line needs to be converted into generate_withdrawal_transaction_and_signature -// let withdrawal_provide_txid = operators[1] -// .0 -// .new_withdrawal_sig_rpc( -// config.operator_num_kickoff_utxos_per_tx as u32 - 1, -// user_sig, -// user_utxo, -// user_txout, -// ) -// .await -// .unwrap(); -// println!("Withdrawal provide txid: {:?}", withdrawal_provide_txid); -// let txs_to_be_sent_penultimate = operators[1] -// .0 -// .withdrawal_proved_on_citrea_rpc( -// config.operator_num_kickoff_utxos_per_tx as u32 - 1, -// deposit_outpoints[config.operator_num_kickoff_utxos_per_tx - 1], -// ) -// .await -// .unwrap(); -// assert!(txs_to_be_sent_penultimate.len() == 3); -// let (user_utxo, user_txout, user_sig) = user -// .generate_withdrawal_transaction_and_signature( -// withdrawal_address.clone(), -// Amount::from_sat( -// config.protocol_paramset().bridge_amount.to_sat() -// - 2 * config.operator_withdrawal_fee_sats.unwrap().to_sat(), -// ), -// ) -// .await -// .unwrap(); This line needs to be converted into generate_withdrawal_transaction_and_signature -// let withdrawal_provide_txid = operators[0] -// .0 -// .new_withdrawal_sig_rpc(2, user_sig, user_utxo, user_txout) -// .await -// .unwrap(); -// println!("Withdrawal provide txid: {:?}", withdrawal_provide_txid); -// let txs_to_be_sent_last = operators[2] -// .0 -// .withdrawal_proved_on_citrea_rpc( -// config.operator_num_kickoff_utxos_per_tx as u32, -// deposit_outpoints[config.operator_num_kickoff_utxos_per_tx], -// ) -// .await -// .unwrap(); -// assert!(txs_to_be_sent_last.len() == 4); -// } + Ok(( + verifiers, + operators, + aggregator, + watchtowers, + cleanup, + deposit_outpoints, + move_txids, + )) +} pub async fn run_single_deposit( - mut config: BridgeConfig, + config: &mut BridgeConfig, + rpc: ExtendedRpc, + evm_address: Option, ) -> Result< ( Vec>, Vec>, ClementineAggregatorClient, Vec>, + ActorsCleanup, OutPoint, + Txid, ), BridgeError, > { - let regtest = create_regtest_rpc(&mut config).await; - let rpc = regtest.rpc().clone(); - - let evm_address = EVMAddress([1u8; 20]); - let (deposit_address, _) = get_deposit_address(&config, evm_address)?; + let (verifiers, operators, mut aggregator, watchtowers, cleanup) = create_actors(config).await; - let (verifiers, operators, mut aggregator, watchtowers, _regtest) = - create_actors(&config).await; + let evm_address = evm_address.unwrap_or(EVMAddress([1u8; 20])); + let actor = Actor::new( + config.secret_key, + config.winternitz_secret_key, + config.protocol_paramset().network, + ); + let (deposit_address, _) = get_deposit_address(config, evm_address)?; - // Start timing setup let setup_start = std::time::Instant::now(); aggregator.setup(Request::new(Empty {})).await?; let setup_elapsed = setup_start.elapsed(); @@ -278,30 +139,48 @@ pub async fn run_single_deposit( .await?; rpc.mine_blocks(18).await?; - // Start timing new_deposit - let new_deposit_start = std::time::Instant::now(); - let _move_tx = aggregator + let move_txid: Txid = aggregator .new_deposit(DepositParams { deposit_outpoint: Some(deposit_outpoint.into()), evm_address: evm_address.0.to_vec(), - recovery_taproot_address: deposit_address.to_string(), + recovery_taproot_address: actor.address.to_string(), }) .await? - .into_inner(); - let new_deposit_elapsed = new_deposit_start.elapsed(); - tracing::info!("New deposit completed in: {:?}", new_deposit_elapsed); - - // let move_tx: Transaction = - // Transaction::consensus_decode(&mut move_tx.raw_tx.as_slice())?; - // let move_txid = rpc.client.send_raw_transaction(&move_tx).await?; - // println!("Move txid: {:?}", move_txid); - // println!("Move tx weight: {:?}", move_tx.weight()); + .into_inner() + .try_into()?; + rpc.mine_blocks(1).await?; + + let start = std::time::Instant::now(); + let timeout = 60; + let _tx = loop { + if start.elapsed() > std::time::Duration::from_secs(timeout) { + panic!("MoveTx did not land onchain within {timeout} seconds"); + } + rpc.mine_blocks(1).await?; + + let tx_result = rpc.client.get_raw_transaction_info(&move_txid, None).await; + + let tx_result = match tx_result { + Ok(tx) => tx, + Err(e) => { + tracing::info!("Waiting for transaction to be on-chain: {}", e); + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + continue; + } + }; + + break tx_result; + }; + + tracing::info!("MoveTx landed onchain: Deposit successful"); Ok(( verifiers, operators, aggregator, watchtowers, + cleanup, deposit_outpoint, + move_txid, )) } diff --git a/core/src/test/common/test_utils.rs b/core/src/test/common/test_utils.rs index 13e5b011..ceed890b 100644 --- a/core/src/test/common/test_utils.rs +++ b/core/src/test/common/test_utils.rs @@ -1,14 +1,4 @@ //! # Testing Utilities -//! -//! This crate provides testing utilities, which are not possible to be included -//! in binaries. -use std::net::TcpListener; -use std::str::FromStr; - -use bitcoin::consensus::serde::With; -use bitcoin::secp256k1::schnorr; -use tokio::sync::oneshot; -use tonic::transport::Channel; use crate::builder::script::SpendPath; use crate::builder::transaction::output::UnspentTxOut; @@ -24,21 +14,19 @@ use crate::servers::{ create_watchtower_unix_server, }; use crate::utils::initialize_logger; -use crate::verifier::Verifier; use crate::{ - actor::Actor, - builder, - config::BridgeConfig, - database::Database, - errors::BridgeError, - extended_rpc::ExtendedRpc, - musig2::AggregateFromPublicKeys, - servers::{ - create_aggregator_grpc_server, create_operator_grpc_server, create_verifier_grpc_server, - create_watchtower_grpc_server, - }, + actor::Actor, builder, config::BridgeConfig, database::Database, errors::BridgeError, + extended_rpc::ExtendedRpc, musig2::AggregateFromPublicKeys, }; use crate::{EVMAddress, UTXO}; +use bitcoin::secp256k1::schnorr; +use std::net::TcpListener; +use tokio::sync::oneshot; +use tonic::transport::Channel; + +/// TODO: This won't block `let _ =`. +#[must_use = "Servers will die if not used"] +pub struct ActorsCleanup(pub (Vec>, tempfile::TempDir)); pub struct WithProcessCleanup( /// Handle to the bitcoind process @@ -110,7 +98,7 @@ pub async fn create_regtest_rpc(config: &mut BridgeConfig) -> WithProcessCleanup get_available_port() }; - config.bitcoin_rpc_url = format!("http://127.0.0.1:{}/wallet/admin", rpc_port); + config.bitcoin_rpc_url = format!("http://127.0.0.1:{}", rpc_port); if bitcoin_rpc_debug && TcpListener::bind(format!("127.0.0.1:{}", rpc_port)).is_err() { // Bitcoind is already running on port 18443, use existing port. @@ -308,18 +296,6 @@ pub async fn initialize_database(config: &BridgeConfig) { .expect("Failed to run schema script"); } -pub struct ActorsCleanup( - Vec>, - tempfile::TempDir, - WithProcessCleanup, -); - -impl ActorsCleanup { - pub fn rpc(&self) -> &ExtendedRpc { - self.2.rpc() - } -} - /// Starts operators, verifiers, aggregator and watchtower servers. /// /// Uses Unix sockets with temporary files for communication between services. @@ -337,13 +313,6 @@ pub async fn create_actors( Vec>, ActorsCleanup, ) { - let regtest = create_regtest_rpc(&mut config.clone()).await; - let rpc = regtest.rpc(); - - // replace config with new rpc - let mut config = config.clone(); - config.bitcoin_rpc_url = rpc.url.clone(); - let all_verifiers_secret_keys = config.all_verifiers_secret_keys.clone().unwrap_or_else(|| { panic!("All secret keys of the verifiers are required for testing"); }); @@ -543,7 +512,7 @@ pub async fn create_actors( operators, aggregator, watchtowers, - ActorsCleanup(shutdown_channels, socket_dir, regtest), + ActorsCleanup((shutdown_channels, socket_dir)), ) } diff --git a/core/src/test/deposit.rs b/core/src/test/deposit.rs index 8315c7e5..195a32cd 100644 --- a/core/src/test/deposit.rs +++ b/core/src/test/deposit.rs @@ -1,276 +1,124 @@ -//! # Deposit Tests - -// use bitcoin::consensus::encode::deserialize_hex; -// use bitcoin::Transaction; -// use clementine_core::actor::Actor; -// use clementine_core::extended_rpc::ExtendedRpc; -// use clementine_core::musig2::MuSigPartialSignature; -// use clementine_core::user::User; -// use clementine_core::EVMAddress; -// use clementine_core::{config::BridgeConfig, database::Database, utils::initialize_logger}; -// use std::{env, thread}; - -// mod common; - -// #[ignore = "We are switching to gRPC"] -// #[tokio::test] -// -// async fn deposit_with_retry_checks() { -// let mut config = create_test_config_with_thread_name(None).await; -// let rpc = ExtendedRpc::connect( -// config.bitcoin_rpc_url.clone(), -// config.bitcoin_rpc_user.clone(), -// config.bitcoin_rpc_password.clone(), -// ) -// .await; - -// let secret_key = secp256k1::SecretKey::new(&mut secp256k1::rand::thread_rng()); -// let signer_address = Actor::new(secret_key, config.winternitz_secret_key, config.protocol_paramset().network) -// .address -// .as_unchecked() -// .clone(); -// let user = User::new(rpc.clone_inner().await.unwrap(), secret_key, config.clone()); - -// let evm_address: EVMAddress = EVMAddress([1u8; 20]); -// let deposit_address = user.get_deposit_address(evm_address).unwrap(); This line needs to be converted into get_deposit_address - -// let deposit_outpoint = rpc -// .send_to_address(&deposit_address, config.protocol_paramset().bridge_amount) -// .await -// .unwrap(); -// rpc.mine_blocks((config.confirmation_threshold + 2).into()) -// .await -// .unwrap(); - -// let (verifiers, operators, aggregator) = -// create_verifiers_and_operators("test_config.toml").await; - -// let agg_nonces = { -// let mut pub_nonces = Vec::new(); - -// for (client, _, _) in verifiers.iter() { -// let musig_pub_nonces = client -// .verifier_new_deposit_rpc(deposit_outpoint, signer_address.clone(), evm_address) -// .await -// .unwrap(); - -// pub_nonces.push(musig_pub_nonces); -// } -// let agg_nonces = aggregator -// .0 -// .aggregate_pub_nonces_rpc(pub_nonces) -// .await -// .unwrap(); - -// let mut pub_nonces_retry = Vec::new(); -// for (client, _, _) in verifiers.iter() { -// let musig_pub_nonces = client -// .verifier_new_deposit_rpc(deposit_outpoint, signer_address.clone(), evm_address) -// .await -// .unwrap(); - -// pub_nonces_retry.push(musig_pub_nonces); -// } -// let agg_nonces_retry = aggregator -// .0 -// .aggregate_pub_nonces_rpc(pub_nonces_retry) -// .await -// .unwrap(); - -// assert_eq!(agg_nonces, agg_nonces_retry); - -// agg_nonces -// }; - -// let (kickoff_utxos, signatures) = { -// let mut kickoff_utxos = Vec::new(); -// let mut signatures = Vec::new(); - -// for (client, _, _) in operators.iter() { -// let (kickoff_utxo, signature) = client -// .new_deposit_rpc(deposit_outpoint, signer_address.clone(), evm_address) -// .await -// .unwrap(); - -// kickoff_utxos.push(kickoff_utxo); -// signatures.push(signature); -// } - -// let mut kickoff_utxos_retry = Vec::new(); -// let mut signatures_retry = Vec::new(); -// for (client, _, _) in operators.iter() { -// let (kickoff_utxo, signature) = client -// .new_deposit_rpc(deposit_outpoint, signer_address.clone(), evm_address) -// .await -// .unwrap(); - -// kickoff_utxos_retry.push(kickoff_utxo); -// signatures_retry.push(signature); -// } - -// assert_eq!(kickoff_utxos, kickoff_utxos_retry); - -// (kickoff_utxos, signatures) -// }; - -// // Operator part is done; Verifier part starts. - -// let slash_or_take_sigs = { -// let mut slash_or_take_partial_sigs = Vec::new(); -// for (client, ..) in verifiers.iter() { -// let (partial_sigs, _) = client -// .operator_kickoffs_generated_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// signatures.clone(), -// agg_nonces.clone(), -// ) -// .await -// .unwrap(); - -// slash_or_take_partial_sigs.push(partial_sigs); -// } -// let slash_or_take_sigs = aggregator -// .0 -// .aggregate_slash_or_take_sigs_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// agg_nonces[config.num_operators + 1..2 * config.num_operators + 1].to_vec(), -// slash_or_take_partial_sigs.clone(), -// ) -// .await -// .unwrap(); - -// let mut slash_or_take_partial_sigs_retry = Vec::new(); -// for (client, ..) in verifiers.iter() { -// let (partial_sigs, _) = client -// .operator_kickoffs_generated_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// signatures.clone(), -// agg_nonces.clone(), -// ) -// .await -// .unwrap(); - -// slash_or_take_partial_sigs_retry.push(partial_sigs); -// } -// let slash_or_take_sigs_retry = aggregator -// .0 -// .aggregate_slash_or_take_sigs_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// agg_nonces[config.num_operators + 1..2 * config.num_operators + 1].to_vec(), -// slash_or_take_partial_sigs_retry.clone(), -// ) -// .await -// .unwrap(); - -// assert_eq!(slash_or_take_partial_sigs, slash_or_take_partial_sigs_retry); -// assert_eq!(slash_or_take_sigs, slash_or_take_sigs_retry); - -// slash_or_take_sigs -// }; - -// let operator_take_sigs = { -// let mut operator_take_partial_sigs: Vec> = Vec::new(); -// for (client, ..) in verifiers.iter() { -// let partial_sigs = client -// .burn_txs_signed_rpc(deposit_outpoint, vec![], slash_or_take_sigs.clone()) -// .await -// .unwrap(); -// operator_take_partial_sigs.push(partial_sigs); -// } -// let operator_take_sigs = aggregator -// .0 -// .aggregate_operator_take_sigs_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// agg_nonces[1..config.num_operators + 1].to_vec(), -// operator_take_partial_sigs, -// ) -// .await -// .unwrap(); - -// let mut operator_take_partial_sigs_retry = Vec::new(); -// for (client, ..) in verifiers.iter() { -// let partial_sigs = client -// .burn_txs_signed_rpc(deposit_outpoint, vec![], slash_or_take_sigs.clone()) -// .await -// .unwrap(); -// operator_take_partial_sigs_retry.push(partial_sigs); -// } -// let operator_take_sigs_retry = aggregator -// .0 -// .aggregate_operator_take_sigs_rpc( -// deposit_outpoint, -// kickoff_utxos.clone(), -// agg_nonces[1..config.num_operators + 1].to_vec(), -// operator_take_partial_sigs_retry, -// ) -// .await -// .unwrap(); - -// assert_eq!(operator_take_sigs, operator_take_sigs_retry); - -// operator_take_sigs -// }; - -// let move_tx_partial_sigs = { -// let mut move_tx_partial_sigs = Vec::new(); -// for (client, _, _) in verifiers.iter() { -// let move_tx_partial_sig = client -// .operator_take_txs_signed_rpc(deposit_outpoint, operator_take_sigs.clone()) -// .await -// .unwrap(); -// move_tx_partial_sigs.push(move_tx_partial_sig); -// } - -// let mut move_tx_partial_sigs_retry = Vec::new(); -// for (client, _, _) in verifiers.iter() { -// let move_tx_partial_sig = client -// .operator_take_txs_signed_rpc(deposit_outpoint, operator_take_sigs.clone()) -// .await -// .unwrap(); -// move_tx_partial_sigs_retry.push(move_tx_partial_sig); -// } - -// assert_eq!(move_tx_partial_sigs, move_tx_partial_sigs_retry); - -// move_tx_partial_sigs -// }; - -// let move_tx = { -// let (move_tx, _) = aggregator -// .0 -// .aggregate_move_tx_sigs_rpc( -// deposit_outpoint, -// signer_address.clone(), -// evm_address, -// agg_nonces[0], -// move_tx_partial_sigs.clone(), -// ) -// .await -// .unwrap(); - -// let (move_tx_retry, _) = aggregator -// .0 -// .aggregate_move_tx_sigs_rpc( -// deposit_outpoint, -// signer_address, -// evm_address, -// agg_nonces[0], -// move_tx_partial_sigs, -// ) -// .await -// .unwrap(); - -// assert_eq!(move_tx, move_tx_retry); - -// move_tx -// }; - -// let move_tx: Transaction = deserialize_hex(&move_tx).unwrap(); - -// println!("Move tx weight: {:?}", move_tx.weight()); -// } +use super::common::citrea::BRIDGE_PARAMS; +use crate::{ + citrea::SATS_TO_WEI_MULTIPLIER, + extended_rpc::ExtendedRpc, + test::common::{ + citrea::{self}, + create_test_config_with_thread_name, run_single_deposit, + }, + EVMAddress, +}; +use async_trait::async_trait; +use bitcoincore_rpc::RpcApi; +use citrea_e2e::{ + config::{BitcoinConfig, SequencerConfig, TestCaseConfig, TestCaseDockerConfig}, + framework::TestFramework, + test_case::{TestCase, TestCaseRunner}, + Result, +}; +use std::{thread::sleep, time::Duration}; + +struct CitreaDeposit; +#[async_trait] +impl TestCase for CitreaDeposit { + fn bitcoin_config() -> BitcoinConfig { + BitcoinConfig { + extra_args: vec![ + "-txindex=1", + "-fallbackfee=0.000001", + "-rpcallowip=0.0.0.0/0", + ], + ..Default::default() + } + } + + fn test_config() -> TestCaseConfig { + TestCaseConfig { + with_batch_prover: false, + with_sequencer: true, + with_full_node: true, + docker: TestCaseDockerConfig { + bitcoin: true, + citrea: true, + }, + ..Default::default() + } + } + + fn sequencer_config() -> SequencerConfig { + SequencerConfig { + test_mode: false, + bridge_initialize_params: BRIDGE_PARAMS.to_string(), + ..Default::default() + } + } + + async fn run_test(&mut self, f: &mut TestFramework) -> Result<()> { + let (sequencer, _full_node, da) = citrea::start_citrea(Self::sequencer_config(), f) + .await + .unwrap(); + + let mut config = create_test_config_with_thread_name(None).await; + citrea::update_config_with_citrea_e2e_values(&mut config, da, sequencer); + + let rpc = ExtendedRpc::connect( + config.bitcoin_rpc_url.clone(), + config.bitcoin_rpc_user.clone(), + config.bitcoin_rpc_password.clone(), + ) + .await?; + + let ( + _verifiers, + _operators, + _aggregator, + _watchtowers, + _cleanup, + _deposit_outpoint, + move_txid, + ) = run_single_deposit(&mut config, rpc.clone(), None).await?; + // Mine blocks, so Citrea can fetch the block that contains the transaction. + rpc.mine_blocks(101).await.unwrap(); + + let tx = rpc.client.get_raw_transaction(&move_txid, None).await?; + let tx_info = rpc + .client + .get_raw_transaction_info(&move_txid, None) + .await?; + let block = rpc.client.get_block(&tx_info.blockhash.unwrap()).await?; + let block_height = rpc.client.get_block_info(&block.block_hash()).await?.height; + + while citrea::block_number(sequencer.client.http_client().clone()).await? + <= block_height.try_into().unwrap() + { + println!("Waiting for block to be mined"); + rpc.mine_blocks(1).await.unwrap(); + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + } + + citrea::deposit( + sequencer.client.http_client().clone(), + block, + block_height.try_into().unwrap(), + tx, + ) + .await?; + + sleep(Duration::from_secs(3)); + let balance = + citrea::eth_get_balance(sequencer.client.http_client().clone(), EVMAddress([1; 20])) + .await + .unwrap(); + assert_eq!( + balance, + (config.protocol_paramset().bridge_amount.to_sat() * SATS_TO_WEI_MULTIPLIER).into() + ); + + Ok(()) + } +} + +#[tokio::test] +async fn citrea_deposit() -> Result<()> { + TestCaseRunner::new(CitreaDeposit).run().await +} diff --git a/core/src/test/full_flow.rs b/core/src/test/full_flow.rs index f60cd946..b678a198 100644 --- a/core/src/test/full_flow.rs +++ b/core/src/test/full_flow.rs @@ -18,14 +18,12 @@ use eyre::{bail, Context, Result}; use secp256k1::rand::rngs::ThreadRng; use tonic::Request; -pub async fn run_operator_end_round(config: BridgeConfig) -> Result<()> { +pub async fn run_operator_end_round(config: BridgeConfig, rpc: ExtendedRpc) -> Result<()> { // 1. Setup environment and actors tracing::info!("Setting up environment and actors"); - let (_verifiers, mut operators, mut aggregator, _watchtowers, regtest) = + let (_verifiers, mut operators, mut aggregator, _watchtowers, _cleanup) = create_actors(&config).await; - let rpc: ExtendedRpc = regtest.rpc().clone(); - let evm_address = EVMAddress([1u8; 20]); let (deposit_address, _) = get_deposit_address(&config, evm_address)?; tracing::info!("Generated deposit address: {}", deposit_address); @@ -124,7 +122,7 @@ pub async fn run_operator_end_round(config: BridgeConfig) -> Result<()> { Ok(()) } -pub async fn run_happy_path(config: BridgeConfig) -> Result<()> { +pub async fn run_happy_path(config: &mut BridgeConfig, rpc: ExtendedRpc) -> Result<()> { // use std::time::Duration; // use clementine_core::bitcoin_syncer; @@ -133,10 +131,9 @@ pub async fn run_happy_path(config: BridgeConfig) -> Result<()> { // 1. Setup environment and actors tracing::info!("Setting up environment and actors"); - let (_verifiers, mut operators, mut aggregator, _watchtowers, regtest) = - create_actors(&config).await; + let (_verifiers, mut operators, mut aggregator, _watchtowers, _cleanup) = + create_actors(config).await; - let rpc: ExtendedRpc = regtest.rpc().clone(); let keypair = bitcoin::key::Keypair::new(&SECP, &mut ThreadRng::default()); let verifier_0_config = { @@ -168,7 +165,7 @@ pub async fn run_happy_path(config: BridgeConfig) -> Result<()> { }; let evm_address = EVMAddress([1u8; 20]); - let (deposit_address, _) = get_deposit_address(&config, evm_address)?; + let (deposit_address, _) = get_deposit_address(config, evm_address)?; tracing::info!("Generated deposit address: {}", deposit_address); let recovery_taproot_address = Actor::new( @@ -547,13 +544,18 @@ mod tests { #[tokio::test(flavor = "multi_thread")] // #[ignore = "Design changes in progress"] async fn test_happy_path_1() { - let config = create_test_config_with_thread_name(None).await; - run_happy_path(config).await.unwrap(); + let mut config = create_test_config_with_thread_name(None).await; + let regtest = create_regtest_rpc(&mut config).await; + let rpc = regtest.rpc().clone(); + run_happy_path(&mut config, rpc).await.unwrap(); } #[tokio::test(flavor = "multi_thread")] async fn test_operator_end_round() { - let config = create_test_config_with_thread_name(None).await; - run_operator_end_round(config).await.unwrap(); + let mut config = create_test_config_with_thread_name(None).await; + let regtest = create_regtest_rpc(&mut config).await; + let rpc = regtest.rpc().clone(); + + run_operator_end_round(config, rpc).await.unwrap(); } } diff --git a/core/src/test/misc.rs b/core/src/test/misc.rs index d821b534..b1130365 100644 --- a/core/src/test/misc.rs +++ b/core/src/test/misc.rs @@ -6,24 +6,20 @@ use crate::test::common::*; #[tokio::test] async fn test_deposit() { - let config = create_test_config_with_thread_name(None).await; - - // Start the timer - let start_time = std::time::Instant::now(); - - // Run the deposit - run_single_deposit(config).await.unwrap(); - - // Calculate and print the elapsed time - let elapsed = start_time.elapsed(); - println!("run_single_deposit completed in: {:?}", elapsed); + let mut config = create_test_config_with_thread_name(None).await; + let regtest = create_regtest_rpc(&mut config).await; + let rpc = regtest.rpc().clone(); + let _ = run_single_deposit(&mut config, rpc, None).await.unwrap(); } -// #[ignore = "We are switching to gRPC"] -// #[tokio::test] -// async fn multiple_deposits_for_operator() { -// run_multiple_deposits("test_config.toml").await; -// } +#[ignore = "We are switching to gRPC"] +#[tokio::test] +async fn multiple_deposits_for_operator() { + let mut config = create_test_config_with_thread_name(None).await; + let regtest = create_regtest_rpc(&mut config).await; + let rpc = regtest.rpc().clone(); + let _ = run_multiple_deposits(&mut config, rpc, 2).await.unwrap(); +} #[tokio::test] async fn create_regtest_rpc_macro() { diff --git a/core/src/test/mod.rs b/core/src/test/mod.rs index 77dc4e56..b9107f79 100644 --- a/core/src/test/mod.rs +++ b/core/src/test/mod.rs @@ -3,5 +3,5 @@ mod deposit; mod full_flow; mod misc; mod musig2; -mod rpc; mod taproot; +mod withdraw; diff --git a/core/src/test/rpc.rs b/core/src/test/rpc.rs deleted file mode 100644 index a1492c8f..00000000 --- a/core/src/test/rpc.rs +++ /dev/null @@ -1,135 +0,0 @@ -//! # RPC Tests -//! -//! This tests checks if typical RPC flows works or not. - -use super::common::run_single_deposit; -use crate::bitvm_client::SECP; -use crate::rpc::clementine::WithdrawParams; -use bitcoin::{secp256k1::SecretKey, Address, Amount}; -use tonic::Request; - -use crate::test::common::*; - -#[ignore = "Design changes in progress"] -#[tokio::test] -async fn honest_operator_takes_refund() { - let mut config = create_test_config_with_thread_name(None).await; - let regtest = create_regtest_rpc(&mut config).await; - let rpc = regtest.rpc().clone(); - - let (_verifiers, mut operators, _aggregator, _watchtowers, _deposit_outpoint) = - run_single_deposit(config.clone()).await.unwrap(); - - let user_sk = SecretKey::from_slice(&[13u8; 32]).unwrap(); - - let withdrawal_address = Address::p2tr( - &SECP, - user_sk.x_only_public_key(&SECP).0, - None, - config.protocol_paramset().network, - ); - - // We are giving enough sats to the user so that the operator can pay the - // withdrawal and profit. - let withdrawal_amount = Amount::from_sat( - config.protocol_paramset().bridge_amount.to_sat() - - 2 * config.operator_withdrawal_fee_sats.unwrap().to_sat(), - ); - - let (empty_utxo, _withdrawal_tx_out, user_sig) = generate_withdrawal_transaction_and_signature( - &config, - &rpc, - &withdrawal_address, - withdrawal_amount, - ) - .await; - - let request = Request::new(WithdrawParams { - withdrawal_id: 0, - input_signature: user_sig.serialize().to_vec(), - input_outpoint: Some(empty_utxo.outpoint.into()), - output_script_pubkey: _withdrawal_tx_out.txout().script_pubkey.clone().into(), - output_amount: withdrawal_amount.to_sat(), - }); - let _withdrawal_provide_txid = operators[1].withdraw(request).await.unwrap().into_inner(); - - // let request = Request::new(WithdrawalFinalizedParams { - // withdrawal_id: 0, - // deposit_outpoint: Some(deposit_outpoint.into()), - // }); - // operators[1].withdrawal_finalized(request).await.unwrap(); - - // for tx in txs_to_be_sent.iter().take(txs_to_be_sent.len() - 1) { - // rpc.client.send_raw_transaction(tx.clone()).await.unwrap(); - // rpc.mine_blocks(1).await.unwrap(); - // } - // rpc.mine_blocks(1 + config.operator_takes_after as u64) - // .await - // .unwrap(); - - // Send last transaction. - // let operator_take_txid = rpc - // .client - // .send_raw_transaction(txs_to_be_sent.last().unwrap().clone()) - // .await - // .unwrap(); - // let operator_take_tx = rpc - // .client - // .get_raw_transaction(&operator_take_txid, None) - // .await - // .unwrap(); - - // assert!(operator_take_tx.output[0].value > withdrawal_amount); - - // assert_eq!( - // operator_take_tx.output[0].script_pubkey, - // config.operator_wallet_addresses[1] - // .clone() - // .assume_checked() - // .script_pubkey() - // ); -} - -// #[ignore = "We are switching to gRPC"] -// #[tokio::test] -// async fn withdrawal_fee_too_low() { -// let (_verifiers, operators, config, _) = run_single_deposit("test_config.toml").await.unwrap(); -// let rpc = ExtendedRpc::connect( -// config.bitcoin_rpc_url.clone(), -// config.bitcoin_rpc_user.clone(), -// config.bitcoin_rpc_password.clone(), -// ) -// .await; - -// let user_sk = SecretKey::from_slice(&[12u8; 32]).unwrap(); -// let withdrawal_address = Address::p2tr( -// &SECP, -// user_sk.x_only_public_key(&SECP).0, -// None, -// config.protocol_paramset().network, -// ); - -// let user = User::new(rpc.clone_inner().await.unwrap(), user_sk, config.clone()); - -// // We are giving too much sats to the user so that operator won't pay it. -// let (empty_utxo, withdrawal_tx_out, user_sig) = user -// .generate_withdrawal_transaction_and_signature( -// withdrawal_address, -// Amount::from_sat(config.protocol_paramset().bridge_amount.to_sat()), -// ) -// .await -// .unwrap(); This line needs to be converted into generate_withdrawal_transaction_and_signature - -// // Operator will reject because it its not profitable. -// assert!(operators[0] -// .0 -// .new_withdrawal_sig_rpc(0, user_sig, empty_utxo, withdrawal_tx_out) -// .await -// .is_err_and(|err| { -// if let jsonrpsee::core::client::Error::Call(err) = err { -// err.message() == BridgeError::NotEnoughFeeForOperator.to_string() -// } else { -// false -// } -// })); -// } diff --git a/core/src/test/withdraw.rs b/core/src/test/withdraw.rs new file mode 100644 index 00000000..4a483e8b --- /dev/null +++ b/core/src/test/withdraw.rs @@ -0,0 +1,152 @@ +use super::common::citrea::BRIDGE_PARAMS; +use crate::bitvm_client::SECP; +use crate::citrea::{CitreaContractClient, SATS_TO_WEI_MULTIPLIER}; +use crate::test::common::citrea::SECRET_KEYS; +use crate::test::common::generate_withdrawal_transaction_and_signature; +use crate::{ + extended_rpc::ExtendedRpc, + test::common::{ + citrea::{self}, + create_test_config_with_thread_name, + }, +}; +use alloy::primitives::FixedBytes; +use alloy::primitives::U256; +use alloy::providers::Provider; +use alloy::transports::http::reqwest::Url; +use async_trait::async_trait; +use bitcoin::hashes::Hash; +use bitcoin::{secp256k1::SecretKey, Address, Amount}; +use citrea_e2e::{ + config::{BitcoinConfig, SequencerConfig, TestCaseConfig, TestCaseDockerConfig}, + framework::TestFramework, + test_case::{TestCase, TestCaseRunner}, + Result, +}; + +struct CitreaWithdrawAndGetUTXO; +#[async_trait] +impl TestCase for CitreaWithdrawAndGetUTXO { + fn bitcoin_config() -> BitcoinConfig { + BitcoinConfig { + extra_args: vec![ + "-txindex=1", + "-fallbackfee=0.000001", + "-rpcallowip=0.0.0.0/0", + ], + ..Default::default() + } + } + + fn test_config() -> TestCaseConfig { + TestCaseConfig { + with_batch_prover: false, + with_sequencer: true, + with_full_node: true, + docker: TestCaseDockerConfig { + bitcoin: true, + citrea: true, + }, + ..Default::default() + } + } + + fn sequencer_config() -> SequencerConfig { + SequencerConfig { + test_mode: false, + bridge_initialize_params: BRIDGE_PARAMS.to_string(), + ..Default::default() + } + } + + async fn run_test(&mut self, f: &mut TestFramework) -> Result<()> { + let (sequencer, _full_node, da) = citrea::start_citrea(Self::sequencer_config(), f) + .await + .unwrap(); + + let mut config = create_test_config_with_thread_name(None).await; + citrea::update_config_with_citrea_e2e_values(&mut config, da, sequencer); + + let rpc = ExtendedRpc::connect( + config.bitcoin_rpc_url.clone(), + config.bitcoin_rpc_user.clone(), + config.bitcoin_rpc_password.clone(), + ) + .await?; + + let user_sk = SecretKey::from_slice(&[13u8; 32]).unwrap(); + let withdrawal_address = Address::p2tr( + &SECP, + user_sk.x_only_public_key(&SECP).0, + None, + config.protocol_paramset().network, + ); + let withdrawal_utxo = generate_withdrawal_transaction_and_signature( + &config, + &rpc, + &withdrawal_address, + Amount::from_sat(330), + ) + .await + .0 + .outpoint; + println!("Created withdrawal UTXO: {:?}", withdrawal_utxo); + + let citrea_contract_client = CitreaContractClient::new( + Url::parse(&config.citrea_rpc_url).unwrap(), + Some(SECRET_KEYS[0].to_string()), + ) + .unwrap(); + + let balance = citrea_contract_client + .provider + .get_balance(citrea_contract_client.wallet_address) + .await + .unwrap(); + println!("Initial balance: {}", balance); + + let withdrawal_count = citrea_contract_client + .contract + .getWithdrawalCount() + .call() + .await + .unwrap(); + assert_eq!(withdrawal_count._0, U256::from(0)); + + let citrea_withdrawal_tx = citrea_contract_client + .contract + .withdraw( + FixedBytes::from(withdrawal_utxo.txid.to_raw_hash().to_byte_array()), + FixedBytes::from(withdrawal_utxo.vout.to_be_bytes()), + ) + .value(U256::from( + config.protocol_paramset().bridge_amount.to_sat() * SATS_TO_WEI_MULTIPLIER, + )) + .send() + .await + .unwrap(); + + let receipt = citrea_withdrawal_tx.get_receipt().await.unwrap(); + println!("Citrea withdrawal tx receipt: {:?}", receipt); + + let withdrawal_count = citrea_contract_client + .contract + .getWithdrawalCount() + .call() + .await + .unwrap(); + assert_eq!(withdrawal_count._0, U256::from(1)); + + let citrea_withdrawal_utxo = citrea_contract_client.withdrawal_utxos(0).await.unwrap(); + println!("Citrea withdrawal UTXO: {:?}", citrea_withdrawal_utxo); + + assert_eq!(citrea_withdrawal_utxo, withdrawal_utxo); + + Ok(()) + } +} + +#[tokio::test] +async fn citrea_withdraw_and_get_utxo() -> Result<()> { + TestCaseRunner::new(CitreaWithdrawAndGetUTXO).run().await +} diff --git a/core/src/tx_sender.rs b/core/src/tx_sender.rs index 26815b4d..1013bd87 100644 --- a/core/src/tx_sender.rs +++ b/core/src/tx_sender.rs @@ -96,7 +96,7 @@ impl TxSender { let consumer_handle = self.consumer_handle.clone(); let this = self.clone(); - tracing::info!( + tracing::trace!( "TXSENDER: Starting tx sender with handle {}", consumer_handle ); @@ -119,7 +119,7 @@ impl TxSender { .ok_or(BridgeError::Error("Block not found".to_string()))? .1; - tracing::info!( + tracing::trace!( "TXSENDER: Confirmed transactions for block {}", block_id ); @@ -127,7 +127,7 @@ impl TxSender { true } BitcoinSyncerEvent::ReorgedBlock(block_id) => { - tracing::info!( + tracing::trace!( "TXSENDER: Unconfirming transactions for block {}", block_id ); @@ -146,9 +146,9 @@ impl TxSender { return Ok(true); } - tracing::info!("TXSENDER: Getting fee rate"); + tracing::trace!("TXSENDER: Getting fee rate"); let fee_rate = this.get_fee_rate().await?; - tracing::info!("TXSENDER: Trying to send unconfirmed txs"); + tracing::trace!("TXSENDER: Trying to send unconfirmed txs"); this.try_to_send_unconfirmed_txs(fee_rate, current_tip_height) .await?; @@ -429,8 +429,6 @@ impl TxSender { + MIN_TAPROOT_AMOUNT }; - // let required_amount = Amount::from_sat(5000); - tracing::info!( "Creating fee payer UTXO with amount {} ({} sat/vb)", required_amount,