diff --git a/Cargo.toml b/Cargo.toml index a48a7ee..1f98be2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,20 +2,39 @@ name = "citrea-e2e" version = "0.1.0" edition = "2021" +resolver = "2" [dependencies] -bollard = { version = "0.17.1" } +anyhow = { version = "1.0.68", default-features = false, features = ["std"] } +async-trait = "0.1.71" bitcoin = { version = "0.32.2", features = ["serde", "rand"] } bitcoincore-rpc = { version = "0.18.0" } +bollard = { version = "0.17.1" } futures = "0.3" +log = "0.4" rand = "0.8" -toml = "0.8.0" serde = { version = "1.0.192", default-features = false, features = ["alloc", "derive"] } serde_json = { version = "1.0", default-features = false } -tokio = { version = "1.39", features = ["full"] } -anyhow = { version = "1.0.68", default-features = false, features = ["std"] } tempfile = "3.8" -async-trait = "0.1.71" +tokio = { version = "1.39", features = ["full"] } +toml = "0.8.0" +which = "6.0.3" + +# Eth client dependencies +alloy = { version = "0.2.1", features = ["hyper", "consensus", "rpc-types-eth", "provider-http", "signers", "signer-local"] } +jsonrpsee = { version = "0.24.2", features = ["http-client", "ws-client"] } +reqwest = { version = "0.12.5", features = ["rustls-tls", "json", "http2"], default-features = false } +reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "a206eb3690e5a51d3c797fed2a6ed722e36863eb", default-features = false } +reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth", rev = "a206eb3690e5a51d3c797fed2a6ed722e36863eb", default-features = false } +reth-rpc-types = { git = "https://github.com/paradigmxyz/reth", rev = "a206eb3690e5a51d3c797fed2a6ed722e36863eb", default-features = false, features = ["jsonrpsee-types"] } + +# Citrea dependencies +bitcoin-da = { git = "https://github.com/chainwayxyz/citrea", features = ["native"] } +citrea-primitives = { git = "https://github.com/chainwayxyz/citrea" } +citrea-sequencer = { git = "https://github.com/chainwayxyz/citrea" } +sov-ledger-rpc = { git = "https://github.com/chainwayxyz/citrea", features = ["client"] } +sov-rollup-interface = { git = "https://github.com/chainwayxyz/citrea" } +sov-stf-runner = { git = "https://github.com/chainwayxyz/citrea", features = ["native"] } [patch.crates-io] -bitcoincore-rpc = { version = "0.18.0", git = "https://github.com/chainwayxyz/rust-bitcoincore-rpc.git", rev = "0ae498d" } \ No newline at end of file +bitcoincore-rpc = { version = "0.18.0", git = "https://github.com/chainwayxyz/rust-bitcoincore-rpc.git", rev = "0ae498d" } diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8d63166 --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +.PHONY: help + +help: ## Display this help message + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) + +.PHONY: build +build: ## Build the project + @cargo build + + +clean: ## Cleans compiled + @cargo clean + +install-dev-tools: ## Installs all necessary cargo helpers + cargo install --locked dprint + cargo install cargo-llvm-cov + cargo install cargo-hack + cargo install --locked cargo-udeps + cargo install flaky-finder + cargo install --locked cargo-nextest + cargo install --version 1.7.0 cargo-binstall + cargo binstall --no-confirm cargo-risczero@1.0.5 + cargo risczero install --version r0.1.79.0-2 + rustup target add thumbv6m-none-eabi + rustup component add llvm-tools-preview + +lint: ## cargo check and clippy. Skip clippy on guest code since it's not supported by risc0 + ## fmt first, because it's the cheapest + dprint check + cargo +nightly fmt --all --check + cargo check --all-targets --all-features + $(MAKE) check-fuzz + SKIP_GUEST_BUILD=1 cargo clippy --all-targets --all-features + +lint-fix: ## dprint fmt, cargo fmt, fix and clippy. Skip clippy on guest code since it's not supported by risc0 + dprint fmt + cargo +nightly fmt --all + cargo fix --allow-dirty + SKIP_GUEST_BUILD=1 cargo clippy --fix --allow-dirty + +docs: ## Generates documentation locally + cargo doc --open + +set-git-hook: + git config core.hooksPath .githooks diff --git a/README.md b/README.md index 69ddc08..3775066 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # citrea-e2e + E2E Test framework for citrea diff --git a/dprint.json b/dprint.json new file mode 100644 index 0000000..662c9f9 --- /dev/null +++ b/dprint.json @@ -0,0 +1,11 @@ +{ + "markdown": { + }, + "toml": { + }, + "excludes": [], + "plugins": [ + "https://plugins.dprint.dev/markdown-0.17.8.wasm", + "https://plugins.dprint.dev/toml-0.6.3.wasm" + ] +} diff --git a/resources/genesis/bitcoin-regtest/accounts.json b/resources/genesis/bitcoin-regtest/accounts.json new file mode 100644 index 0000000..f65b078 --- /dev/null +++ b/resources/genesis/bitcoin-regtest/accounts.json @@ -0,0 +1,3 @@ +{ + "pub_keys": [] +} diff --git a/resources/genesis/bitcoin-regtest/evm.json b/resources/genesis/bitcoin-regtest/evm.json new file mode 100644 index 0000000..4e4670b --- /dev/null +++ b/resources/genesis/bitcoin-regtest/evm.json @@ -0,0 +1,158 @@ +{ + "data": [ + { + "address": "0x0f820f428ae436c1000b27577bf5bbf09bfec8f2", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x3100000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000001", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000002", + "balance": "0x115eec47f6cf7e35000000", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000002", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000003", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000004", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000005", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x31ffffffffffffffffffffffffffffffffffffff", + "balance": "0x0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105ea565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c99086908690600401610607565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff81111561055857600080fd5b8401601f8101861361056957600080fd5b803567ffffffffffffffff811115610583576105836104f6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156105b2576105b26104f6565b6040528181528282016020018810156105ca57600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000602082840312156105fc57600080fd5b81516104b681610484565b60018060a01b0383168152604060208201526000825180604084015260005b818110156106435760208186018101516060868401015201610626565b506000606082850101526060601f19601f830116840101915050939250505056", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "address": "0x3200000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806357e871e71161007157806357e871e71461014c57806361b207e214610155578063a91d8b3d14610182578063d269a03e146101a2578063d761753e146101b5578063ee82ac5e146101e857600080fd5b80630466efc4146100ae5780630e27bc11146100e15780631f578333146100f657806334cdf78d146101095780634ffd344a14610129575b600080fd5b6100ce6100bc366004610598565b60009081526002602052604090205490565b6040519081526020015b60405180910390f35b6100f46100ef3660046105b1565b610208565b005b6100f4610104366004610598565b610330565b6100ce610117366004610598565b60016020526000908152604090205481565b61013c61013736600461061c565b6103de565b60405190151581526020016100d8565b6100ce60005481565b6100ce610163366004610598565b6000908152600160209081526040808320548352600290915290205490565b6100ce610190366004610598565b60026020526000908152604090205481565b61013c6101b036600461061c565b610404565b6101d073deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b6040516001600160a01b0390911681526020016100d8565b6100ce6101f6366004610598565b60009081526001602052604090205490565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146102705760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c65720060448201526064015b60405180910390fd5b60008054908190036102b65760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610267565b60008181526001602081905260409091208490556102d5908290610677565b60009081558381526002602090815260409182902084905581518381529081018590529081018390527f32eff959e2e8d1609edc4b39ccf75900aa6c1da5719f8432752963fdf008234f9060600160405180910390a1505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146103935760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610267565b600054156103d95760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610267565b600055565b6000858152600160205260408120546103fa908686868661040f565b9695505050505050565b60006103fa86868686865b6000858152600260209081526040808320548151601f870184900484028101840190925285825291610462918891849190899089908190840183828082843760009201919091525089925061046d915050565b979650505050505050565b6000838514801561047c575081155b801561048757508251155b15610494575060016104a3565b6104a0858486856104ab565b90505b949350505050565b6000602084516104bb9190610698565b156104c8575060006104a3565b83516000036104d9575060006104a3565b818560005b8651811015610548576104f2600284610698565b6001036105165761050f6105098883016020015190565b83610555565b915061052f565b61052c826105278984016020015190565b610555565b91505b60019290921c91610541602082610677565b90506104de565b5090931495945050505050565b6000610561838361056a565b90505b92915050565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6000602082840312156105aa57600080fd5b5035919050565b600080604083850312156105c457600080fd5b50508035926020909101359150565b60008083601f8401126105e557600080fd5b50813567ffffffffffffffff8111156105fd57600080fd5b60208301915083602082850101111561061557600080fd5b9250929050565b60008060008060006080868803121561063457600080fd5b8535945060208601359350604086013567ffffffffffffffff81111561065957600080fd5b610665888289016105d3565b96999598509660600135949350505050565b8082018082111561056457634e487b7160e01b600052601160045260246000fd5b6000826106b557634e487b7160e01b600052601260045260246000fd5b50069056" + }, + { + "address": "0x3200000000000000000000000000000000000002", + "balance": "0x0", + "code": "0x60806040526004361061019c5760003560e01c80638786dba7116100ec578063d761753e1161008a578063e613ae0011610064578063e613ae001461048e578063f119a9bd146104a9578063f2fde38b146104c9578063f8e655d2146104e957600080fd5b8063d761753e14610431578063dd95c7c614610459578063e30c39781461047957600080fd5b8063a41c5cf3116100c6578063a41c5cf3146103af578063b3ab15fb146103c4578063bafa9eb2146103e4578063c045577b1461040457600080fd5b80638786dba71461037257806387f8bf56146103855780638da5cb5b1461039a57600080fd5b8063570ca73511610159578063715018a611610133578063715018a61461031357806374ab4a8314610328578063781952a81461034857806379ba50971461035d57600080fd5b8063570ca735146102945780635d3e3176146102d15780635e3cc740146102f357600080fd5b806311e53a01146101a1578063158ef93e146101e1578063198546231461020b5780634126013714610220578063419759f514610240578063471ba1e314610256575b600080fd5b3480156101ad57600080fd5b506101ce6101bc3660046129ee565b60276020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101ed57600080fd5b506000546101fb9060ff1681565b60405190151581526020016101d8565b61021e610219366004612a4b565b610509565b005b34801561022c57600080fd5b5061021e61023b366004612afb565b6106e2565b34801561024c57600080fd5b506101ce60215481565b34801561026257600080fd5b506102766102713660046129ee565b6108ef565b604080519283526001600160e01b03199091166020830152016101d8565b3480156102a057600080fd5b506000546102b99061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101d8565b3480156102dd57600080fd5b506102e6610920565b6040516101d89190612b96565b3480156102ff57600080fd5b5061021e61030e366004612be2565b6109ae565b34801561031f57600080fd5b5061021e610d65565b34801561033457600080fd5b5061021e610343366004612c1e565b610d79565b34801561035457600080fd5b506026546101ce565b34801561036957600080fd5b5061021e610f4c565b61021e610380366004612c88565b610f94565b34801561039157600080fd5b506102e66110bb565b3480156103a657600080fd5b506102b96110c8565b3480156103bb57600080fd5b506102e66110fd565b3480156103d057600080fd5b5061021e6103df366004612cb4565b61110a565b3480156103f057600080fd5b506101fb6103ff3660046129ee565b61117b565b34801561041057600080fd5b506101ce61041f3660046129ee565b60286020526000908152604090205481565b34801561043d57600080fd5b506102b973deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b34801561046557600080fd5b5061021e610474366004612be2565b6111a6565b34801561048557600080fd5b506102b9611606565b34801561049a57600080fd5b506102b96001603160981b0181565b3480156104b557600080fd5b5061021e6104c4366004612cdd565b61162f565b3480156104d557600080fd5b5061021e6104e4366004612cb4565b6116a3565b3480156104f557600080fd5b5061021e610504366004612d1e565b611728565b82811461054f5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064015b60405180910390fd5b60215461055d908490612d97565b34146105a55760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b60265460005b848110156106da57600060405180604001604052808888858181106105d2576105d2612dae565b9050602002013581526020018686858181106105f0576105f0612dae565b90506020020160208101906106059190612dc4565b6001600160e01b03191690526026805460018101825560009190915281517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a359460029092029182015560208201517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909101805463ffffffff191660e09290921c91909117905590507f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada816106b98486612ddf565b426040516106c993929190612df2565b60405180910390a1506001016105ab565b505050505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146107455760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610546565b60005460ff16156107985760405162461bcd60e51b815260206004820152601f60248201527f436f6e747261637420697320616c726561647920696e697469616c697a6564006044820152606401610546565b806000036107e85760405162461bcd60e51b815260206004820152601a60248201527f4465706f73697420616d6f756e742063616e6e6f7420626520300000000000006044820152606401610546565b60008490036108095760405162461bcd60e51b815260040161054690612e20565b6000805460ff191660011790556023610823858783612ef0565b506024610831838583612ef0565b50602181905560008054610100600160a81b03191674deaddeaddeaddeaddeaddeaddeaddeaddeaddead001781556040805191825273deaddeaddeaddeaddeaddeaddeaddeaddeaddead60208301527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a17f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc858585856040516108e09493929190612fd8565b60405180910390a15050505050565b602681815481106108ff57600080fd5b60009182526020909120600290910201805460019091015490915060e01b82565b6025805461092d90612e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612e6d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b505050505081565b6109b7816117a2565b5060009050610a066109cc606084018461300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ac592505050565b915060009050610a63610a1c606085018561300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a5e925060019150869050613050565b611adc565b90506000610a7082611c54565b90506000610a88610a8383836020611cd6565b611d99565b90506000610aa9610a836020808651610aa19190613050565b869190611cd6565b600083815260276020526040812054919250819003610b015760405162461bcd60e51b815260206004820152601460248201527311195c1bdcda5d08191bc81b9bdd08195e1a5cdd60621b6044820152606401610546565b6000610b4d610b1360808a018a61300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250611e1e915050565b90506000610b5c826001611f01565b9050600060258054610b6d90612e6d565b915060009050610b7e838284611cd6565b9050610c148160258054610b9190612e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e6d565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050612085565b610c605760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736c6173684f7254616b65207363726970740000000000006044820152606401610546565b6000602881610c70600189613050565b815260200190815260200160002054905060008160001480610c9a5750610c968861215c565b8214155b905080610ce95760405162461bcd60e51b815260206004820152601960248201527f4f70657261746f72206973206e6f74206d616c6963696f7573000000000000006044820152606401610546565b600180896103e88110610cfe57610cfe612dae565b602091828204019190066101000a81548160ff0219169083151502179055507ff918cdaebea74c5a8c3b02d7404c162f507551b158202cedcba9b6a74eabdff288604051610d4e91815260200190565b60405180910390a150505050505050505050505050565b610d6d612169565b610d77600061219b565b565b610d82836117a2565b5060009050610dd3610d97604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506121d7915050565b90506000610de08261232a565b90506000610ded83612337565b9050600060268581548110610e0457610e04612dae565b60009182526020918290206040805180820190915260029290920201805480835260019091015460e01b6001600160e01b03191692820192909252915083148015610e665750816001600160e01b03191681602001516001600160e01b031916145b610ea65760405162461bcd60e51b81526020600482015260116024820152706e6f74206d61746368696e67205554584f60781b6044820152606401610546565b6000610eb86109cc60608a018a61300a565b915060009050610ece610a1c60608b018b61300a565b90506000610edb82611c54565b90506000610ee882611d99565b9050610ef38161215c565b60008a8152602860209081526040918290209290925580518b81529182018390527feedf47c2f61b040827944fd45e44ef6d742354b34e1af7dd99a56f444ec79347910160405180910390a15050505050505050505050565b3380610f56611606565b6001600160a01b031614610f885760405163118cdaa760e01b81526001600160a01b0382166004820152602401610546565b610f918161219b565b50565b6021543414610fdf5760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b6040805180820182528381526001600160e01b03198316602082019081526026805460018101825560009190915282517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594600283029081019190915591517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909201805463ffffffff191660e09390931c9290921790915591519091907f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada906110ad90849084904290612df2565b60405180910390a150505050565b6024805461092d90612e6d565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6023805461092d90612e6d565b611112612169565b60008054610100600160a81b0319166101006001600160a01b038481168281029390931793849055604080519290940416815260208101919091527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a150565b6001816103e8811061118c57600080fd5b60209182820401919006915054906101000a900460ff1681565b60005461010090046001600160a01b031633146112055760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f7420746865206f70657261746f720000000000006044820152606401610546565b600080611211836117a2565b915091508060011461125e5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481bdb99481a5b9c1d5d08185b1b1bddd95960521b6044820152606401610546565b60006113096112706020860186612dc4565b61127d604087018761300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112bf92505050606088018861300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113049250505060c0890160a08a01612dc4565b612344565b6000818152602760205260409020549091501561135d5760405162461bcd60e51b81526020600482015260126024820152711d1e125908185b1c9958591e481cdc195b9d60721b6044820152606401610546565b60226000815461136c90613063565b9182905550600082815260276020526040812091909155611393610b13608087018761300a565b905060006113a082611ac5565b915050806003146113eb5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207769746e657373206974656d7360581b6044820152606401610546565b60006113f8836001611f01565b905060006023805461140990612e6d565b91506000905061141a838284611cd6565b905061142d8160238054610b9190612e6d565b6114725760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590819195c1bdcda5d081cd8dc9a5c1d60521b6044820152606401610546565b60006114a66024805461148490612e6d565b86516114909250613050565b6024805461149d90612e6d565b87929150611cd6565b90506114b98160248054610b9190612e6d565b6114fd5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840e6c6e4d2e0e840e6eaccccd2f605b1b6044820152606401610546565b600061150885612374565b602254604080518d8152602081018c90526001600160a01b038416818301524260608201526080810192909252519192507fa82453ca34121b3ecb910d957824e27c5dc6465315949facd15fb72886490058919081900360a00190a16021546040516000916001600160a01b038416918381818185875af1925050503d80600081146115b0576040519150601f19603f3d011682016040523d82523d6000602084013e6115b5565b606091505b50509050806115f85760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610546565b505050505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c006110ed565b611637612169565b60008190036116585760405162461bcd60e51b815260040161054690612e20565b6025611665828483612ef0565b507f8578c80bdea3ff51431011ed88db9cb415de2cf64f9ed5e7137288268cbdeb2c828260405161169792919061307c565b60405180910390a15050565b6116ab612169565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556116ef6110c8565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b611730612169565b60008390036117515760405162461bcd60e51b815260040161054690612e20565b602361175e848683612ef0565b50602461176c828483612ef0565b507f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc848484846040516110ad9493929190612fd8565b600080806118026117b66020860186612dc4565b6117c66040870160208801613090565b6117d3604088018861300a565b6117e060608a018a61300a565b6117ed60808c018c61300a565b6117fd60c08e0160a08f01612dc4565b6123aa565b905061184e611814604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123de92505050565b61189a5760405162461bcd60e51b815260206004820152601d60248201527f56696e206973206e6f742070726f7065726c7920666f726d61747465640000006044820152606401610546565b6118e46118aa606086018661300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061248292505050565b6119305760405162461bcd60e51b815260206004820152601e60248201527f566f7574206973206e6f742070726f7065726c7920666f726d617474656400006044820152606401610546565b60006119426109cc604087018761300a565b91506119929050611956608087018761300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250612519915050565b6119e85760405162461bcd60e51b815260206004820152602160248201527f5769746e657373206973206e6f742070726f7065726c7920666f726d617474656044820152601960fa1b6064820152608401610546565b6001603160981b01634ffd344a60e087013584611a0860c08a018a61300a565b8a61010001356040518663ffffffff1660e01b8152600401611a2e9594939291906130ba565b602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906130ec565b611abb5760405162461bcd60e51b815260206004820152601b60248201527f5472616e73616374696f6e206973206e6f7420696e20626c6f636b00000000006044820152606401610546565b9094909350915050565b600080611ad383600061258e565b91509150915091565b6060600080611aea85611ac5565b909250905060018201611b0f5760405162461bcd60e51b81526004016105469061310e565b808410611b525760405162461bcd60e51b81526020600482015260116024820152702b37baba103932b0b21037bb32b9393ab760791b6044820152606401610546565b600080611b60846001612ddf565b905060005b86811015611bde57611b778883612730565b92506000198303611bca5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611bd48383612ddf565b9150600101611b65565b50611be98782612730565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611c47878284611cd6565b9450505050505b92915050565b606081600981518110611c6957611c69612dae565b6020910101516001600160f81b031916603560f91b14611c9757505060408051602081019091526000815290565b600082600a81518110611cac57611cac612dae565b01602001516001600160f81b031981169150611ccf908490600b9060f81c611cd6565b9392505050565b606081600003611cf55750604080516020810190915260008152611ccf565b6000611d018385612ddf565b90508381118015611d13575080855110155b611d555760405162461bcd60e51b8152602060048201526013602482015272536c696365206f7574206f6620626f756e647360681b6044820152606401610546565b604051915082604083010160405282825283850182038460208701018481015b80821015611d8e57815183830152602082019150611d75565b505050509392505050565b60008151600003611dac57506000919050565b81516020811115611e0a5760405162461bcd60e51b815260206004820152602260248201527f42797465732063616e6e6f74206265206d6f7265207468616e20333220627974604482015261657360f01b6064820152608401610546565b60209283015192036008029190911c919050565b606060008060005b84811015611e9757611e388683612794565b92506000198303611e835760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611e8d8383612ddf565b9150600101611e26565b50611ea28582612794565b91506000198203611eed5760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611ef8858284611cd6565b95945050505050565b6060600080611f0f85611ac5565b909250905060018201611f345760405162461bcd60e51b81526004016105469061310e565b808410611f765760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b600080611f84846001612ddf565b905060005b8681101561200f57611f9b888361258e565b909550925060018301611fe55760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b82611ff1866001612ddf565b611ffb9190612ddf565b6120059083612ddf565b9150600101611f89565b5061201a878261258e565b9094509150600182016120645760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b611c47816120728685612ddf565b61207d906001612ddf565b899190611cd6565b8151815160009190811461209d576000915050611c4e565b60206000805b8383116120d357505084810151848201516020909201918082146120ce576000945050505050611c4e565b6120a3565b60006120e0602085613050565b90505b8481101561214e578681815181106120fd576120fd612dae565b602001015160f81c60f81b6001600160f81b03191688828151811061212457612124612dae565b01602001516001600160f81b0319161461214657600095505050505050611c4e565b6001016120e3565b506001979650505050505050565b6000611c4e826001612ddf565b336121726110c8565b6001600160a01b031614610d775760405163118cdaa760e01b8152336004820152602401610546565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556121d382612836565b5050565b60606000806121e585611ac5565b90925090506001820161220a5760405162461bcd60e51b81526004016105469061310e565b80841061224c5760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b60008061225a846001612ddf565b905060005b868110156122d25761227188836128a7565b925060001983036122be5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6122c88383612ddf565b915060010161225f565b506122dd87826128a7565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6020810151600090611c4e565b6000611c4e8260206128f0565b6000611ef8858585856040516020016123609493929190613150565b6040516020818303038152906040526128ff565b6000806023805461238490612e6d565b91506000905061239684836014611cd6565b61239f906131ad565b60601c949350505050565b60006123d08a8a8a8a8a8a8a8a8a60405160200161236099989796959493929190613200565b9a9950505050505050505050565b60008060006123ec84611ac5565b90925090508015806123ff575060001982145b1561240e575060009392505050565b600061241b836001612ddf565b905060005b82811015612475578551821061243c5750600095945050505050565b600061244887846128a7565b90506000198103612460575060009695505050505050565b61246a8184612ddf565b925050600101612420565b5093519093149392505050565b600080600061249084611ac5565b90925090508015806124a3575060001982145b156124b2575060009392505050565b60006124bf836001612ddf565b905060005b8281101561247557855182106124e05750600095945050505050565b60006124ec8784612730565b90506000198103612504575060009695505050505050565b61250e8184612ddf565b9250506001016124c4565b60008160000361252b57506000611c4e565b6000805b83811015612582578451821061254a57600092505050611c4e565b60006125568684612794565b9050600019810361256d5760009350505050611c4e565b6125778184612ddf565b92505060010161252f565b50835114905092915050565b600080600061259d8585612926565b90508060ff166000036125d25760008585815181106125be576125be612dae565b016020015190935060f81c91506127299050565b836125de826001613269565b60ff166125eb9190612ddf565b855110156126025760001960009250925050612729565b60008160ff166002036126465761263b612627612620876001612ddf565b88906128f0565b62ffff0060e882901c1660f89190911c1790565b61ffff16905061271f565b8160ff1660040361269557612688612662612620876001612ddf565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b63ffffffff16905061271f565b8160ff1660080361271f576127136126b1612620876001612ddf565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b6001600160401b031666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b6001600160401b031690505b60ff909116925090505b9250929050565b600061273d826009612ddf565b8351101561274e5750600019611c4e565b60008061276585612760866008612ddf565b61258e565b90925090506001820161277e5760001992505050611c4e565b8061278a836009612ddf565b611ef89190612ddf565b60008060006127a3858561258e565b9092509050600182016127bc5760001992505050611c4e565b6000806127ca846001612ddf565b905060005b8381101561282b576127e588612760848a612ddf565b9095509250600183016128015760001995505050505050611c4e565b8261280d866001612ddf565b6128179190612ddf565b6128219083612ddf565b91506001016127cf565b509695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60008060006128b685856129ac565b9092509050600182016128cf5760001992505050611c4e565b806128db836025612ddf565b6128e59190612ddf565b611ef8906004612ddf565b6000611ccf8383016020015190565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b600082828151811061293a5761293a612dae565b016020015160f81c60ff0361295157506008611c4e565b82828151811061296357612963612dae565b016020015160f81c60fe0361297a57506004611c4e565b82828151811061298c5761298c612dae565b016020015160f81c60fd036129a357506002611c4e565b50600092915050565b6000806129ba836025612ddf565b845110156129cf575060001990506000612729565b6000806129e186612760876024612ddf565b9097909650945050505050565b600060208284031215612a0057600080fd5b5035919050565b60008083601f840112612a1957600080fd5b5081356001600160401b03811115612a3057600080fd5b6020830191508360208260051b850101111561272957600080fd5b60008060008060408587031215612a6157600080fd5b84356001600160401b03811115612a7757600080fd5b612a8387828801612a07565b90955093505060208501356001600160401b03811115612aa257600080fd5b612aae87828801612a07565b95989497509550505050565b60008083601f840112612acc57600080fd5b5081356001600160401b03811115612ae357600080fd5b60208301915083602082850101111561272957600080fd5b600080600080600060608688031215612b1357600080fd5b85356001600160401b03811115612b2957600080fd5b612b3588828901612aba565b90965094505060208601356001600160401b03811115612b5457600080fd5b612b6088828901612aba565b96999598509660400135949350505050565b60005b83811015612b8d578181015183820152602001612b75565b50506000910152565b6020815260008251806020840152612bb5816040850160208701612b72565b601f01601f19169190910160400192915050565b60006101208284031215612bdc57600080fd5b50919050565b600060208284031215612bf457600080fd5b81356001600160401b03811115612c0a57600080fd5b612c1684828501612bc9565b949350505050565b600080600060608486031215612c3357600080fd5b83356001600160401b03811115612c4957600080fd5b612c5586828701612bc9565b9660208601359650604090950135949350505050565b80356001600160e01b031981168114612c8357600080fd5b919050565b60008060408385031215612c9b57600080fd5b82359150612cab60208401612c6b565b90509250929050565b600060208284031215612cc657600080fd5b81356001600160a01b0381168114611ccf57600080fd5b60008060208385031215612cf057600080fd5b82356001600160401b03811115612d0657600080fd5b612d1285828601612aba565b90969095509350505050565b60008060008060408587031215612d3457600080fd5b84356001600160401b03811115612d4a57600080fd5b612d5687828801612aba565b90955093505060208501356001600160401b03811115612d7557600080fd5b612aae87828801612aba565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417611c4e57611c4e612d81565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612dd657600080fd5b611ccf82612c6b565b80820180821115611c4e57611c4e612d81565b835181526020938401516001600160e01b031916938101939093526040830191909152606082015260800190565b6020808252601e908201527f4465706f736974207363726970742063616e6e6f7420626520656d7074790000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680612e8157607f821691505b602082108103612bdc57634e487b7160e01b600052602260045260246000fd5b601f821115612eeb57806000526020600020601f840160051c81016020851015612ec85750805b601f840160051c820191505b81811015612ee85760008155600101612ed4565b50505b505050565b6001600160401b03831115612f0757612f07612e57565b612f1b83612f158354612e6d565b83612ea1565b6000601f841160018114612f4f5760008515612f375750838201355b600019600387901b1c1916600186901b178355612ee8565b600083815260209020601f19861690835b82811015612f805786850135825560209485019460019092019101612f60565b5086821015612f9d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000612fec604083018688612faf565b8281036020840152612fff818587612faf565b979650505050505050565b6000808335601e1984360301811261302157600080fd5b8301803591506001600160401b0382111561303b57600080fd5b60200191503681900382131561272957600080fd5b81810381811115611c4e57611c4e612d81565b60006001820161307557613075612d81565b5060010190565b602081526000612c16602083018486612faf565b6000602082840312156130a257600080fd5b81356001600160f01b031981168114611ccf57600080fd5b8581528460208201526080604082015260006130da608083018587612faf565b90508260608301529695505050505050565b6000602082840312156130fe57600080fd5b81518015158114611ccf57600080fd5b60208082526022908201527f52656164206f76657272756e20647572696e6720566172496e742070617273696040820152616e6760f01b606082015260800190565b6001600160e01b0319851681528351600090613173816004850160208901612b72565b84519083019061318a816004840160208901612b72565b6001600160e01b0319949094169301600481019390935250506008019392505050565b805160208201516bffffffffffffffffffffffff198116919060148210156131f9576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b6001600160e01b03198a1681526001600160f01b031989166004820152868860068301376000878201600681016000815287898237506000908701600601908152848682376001600160e01b031993909316929093019182525060040198975050505050505050565b60ff8181168382160190811115611c4e57611c4e612d8156" + }, + { + "address": "0x3200000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3aeeb871f83c85e68ffd1868bef3425ed6649d39", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x66f68692c03eb9c0656d676f2f4bd13eba40d1b7", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x9fcdf8f60d3009656e50bf805cd53c7335b284fb", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xaafb7442f7f00b64057c2e9eae2815bb63ee0ece", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xc2f8eed77da1583f7bae0a3125dc7bc426002dde", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xd44821f906e3909b8ae944f7060551c33b922cc9", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xe756fdf89367ef428b48bca2d272ec8ecec053fd", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + } + ], + "chain_id": 5655, + "limit_contract_code_size": null, + "spec": { + "0": "SHANGHAI" + }, + "coinbase": "0x3100000000000000000000000000000000000005", + "starting_base_fee": 1000000000, + "block_gas_limit": 30000000, + "base_fee_params": { + "max_change_denominator": 8, + "elasticity_multiplier": 2 + }, + "difficulty": 0, + "extra_data": "0x", + "timestamp": 0, + "nonce": 0 +} \ No newline at end of file diff --git a/resources/genesis/bitcoin-regtest/soft_confirmation_rule_enforcer.json b/resources/genesis/bitcoin-regtest/soft_confirmation_rule_enforcer.json new file mode 100644 index 0000000..f9faf7a --- /dev/null +++ b/resources/genesis/bitcoin-regtest/soft_confirmation_rule_enforcer.json @@ -0,0 +1,4 @@ +{ + "max_l2_blocks_per_l1": 86400, + "authority": "sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94" +} \ No newline at end of file diff --git a/resources/genesis/devnet/accounts.json b/resources/genesis/devnet/accounts.json new file mode 100644 index 0000000..f65b078 --- /dev/null +++ b/resources/genesis/devnet/accounts.json @@ -0,0 +1,3 @@ +{ + "pub_keys": [] +} diff --git a/resources/genesis/devnet/evm.json b/resources/genesis/devnet/evm.json new file mode 100644 index 0000000..bcc073b --- /dev/null +++ b/resources/genesis/devnet/evm.json @@ -0,0 +1,38 @@ +{ + "data": + [ + { + "address": "0x3100000000000000000000000000000000000001", + "balance": "0x00", + "code": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806357e871e71161007157806357e871e71461014c57806361b207e214610155578063a91d8b3d14610182578063d269a03e146101a2578063d761753e146101b5578063ee82ac5e146101e857600080fd5b80630466efc4146100ae5780630e27bc11146100e15780631f578333146100f657806334cdf78d146101095780634ffd344a14610129575b600080fd5b6100ce6100bc366004610599565b60009081526002602052604090205490565b6040519081526020015b60405180910390f35b6100f46100ef3660046105b2565b610208565b005b6100f4610104366004610599565b610331565b6100ce610117366004610599565b60016020526000908152604090205481565b61013c61013736600461061d565b6103df565b60405190151581526020016100d8565b6100ce60005481565b6100ce610163366004610599565b6000908152600160209081526040808320548352600290915290205490565b6100ce610190366004610599565b60026020526000908152604090205481565b61013c6101b036600461061d565b610405565b6101d073deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b6040516001600160a01b0390911681526020016100d8565b6100ce6101f6366004610599565b60009081526001602052604090205490565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146102705760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c65720060448201526064015b60405180910390fd5b60008054908190036102b65760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610267565b60008181526001602081905260409091208490556102d5908290610678565b6000908155838152600260209081526040808320859055915482519081529081018590529081018390527f32eff959e2e8d1609edc4b39ccf75900aa6c1da5719f8432752963fdf008234f9060600160405180910390a1505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146103945760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610267565b600054156103da5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610267565b600055565b6000858152600160205260408120546103fb9086868686610410565b9695505050505050565b60006103fb86868686865b6000858152600260209081526040808320548151601f870184900484028101840190925285825291610463918891849190899089908190840183828082843760009201919091525089925061046e915050565b979650505050505050565b6000838514801561047d575081155b801561048857508251155b15610495575060016104a4565b6104a1858486856104ac565b90505b949350505050565b6000602084516104bc9190610699565b156104c9575060006104a4565b83516000036104da575060006104a4565b818560005b8651811015610549576104f3600284610699565b6001036105175761051061050a8883016020015190565b83610556565b9150610530565b61052d826105288984016020015190565b610556565b91505b60019290921c91610542602082610678565b90506104df565b5090931495945050505050565b6000610562838361056b565b90505b92915050565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6000602082840312156105ab57600080fd5b5035919050565b600080604083850312156105c557600080fd5b50508035926020909101359150565b60008083601f8401126105e657600080fd5b50813567ffffffffffffffff8111156105fe57600080fd5b60208301915083602082850101111561061657600080fd5b9250929050565b60008060008060006080868803121561063557600080fd5b8535945060208601359350604086013567ffffffffffffffff81111561065a57600080fd5b610666888289016105d4565b96999598509660600135949350505050565b8082018082111561056557634e487b7160e01b600052601160045260246000fd5b6000826106b657634e487b7160e01b600052601260045260246000fd5b50069056fea26469706673582212202fa9b28760396981b6b0d8418d5de50f0783041c49eced580ada3a97fdbcae6f64736f6c63430008190033" + }, + { + "address": "0x3100000000000000000000000000000000000002", + "balance": "0x115EEC47F6CF7E35000000", + "code": "0x6080604052600436106101355760003560e01c80638e19899e116100ab578063d761753e1161006f578063d761753e1461033a578063dd95c7c614610362578063e30c397814610382578063e613ae00146103a2578063ec6925a7146103bd578063f2fde38b146103d857600080fd5b80638e19899e146102b25780639f963f59146102c5578063b3ab15fb146102e5578063b93780f614610305578063d1c444561461031a57600080fd5b80635e0e5b3e116100fd5780635e0e5b3e14610201578063715018a614610231578063781952a81461024657806379ba50971461025b57806387f8bf56146102705780638da5cb5b1461029257600080fd5b8063158ef93e1461013a57806343e31687146101705780634507fc6914610194578063570ca735146101b657806359c19cee146101ee575b600080fd5b34801561014657600080fd5b5060015461015b90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561017c57600080fd5b5061018660035481565b604051908152602001610167565b3480156101a057600080fd5b506101b46101af366004611ec0565b6103f8565b005b3480156101c257600080fd5b506002546101d6906001600160a01b031681565b6040516001600160a01b039091168152602001610167565b6101b46101fc366004611f48565b61064e565b34801561020d57600080fd5b5061015b61021c366004611fbd565b60066020526000908152604090205460ff1681565b34801561023d57600080fd5b506101b461075e565b34801561025257600080fd5b50600754610186565b34801561026757600080fd5b506101b46107d4565b34801561027c57600080fd5b5061028561089a565b6040516101679190611fd6565b34801561029e57600080fd5b506000546101d6906001600160a01b031681565b6101b46102c0366004611fbd565b610928565b3480156102d157600080fd5b506101b46102e0366004612025565b6109f1565b3480156102f157600080fd5b506101b4610300366004612099565b610b24565b34801561031157600080fd5b50610285610ba3565b34801561032657600080fd5b50610186610335366004611fbd565b610bb0565b34801561034657600080fd5b506101d673deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b34801561036e57600080fd5b506101b461037d3660046120b4565b610bd1565b34801561038e57600080fd5b506001546101d6906001600160a01b031681565b3480156103ae57600080fd5b506101d66001603160981b0181565b3480156103c957600080fd5b50610186662386f26fc1000081565b3480156103e457600080fd5b506101b46103f3366004612099565b611376565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146104605760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c65720060448201526064015b60405180910390fd5b600154600160a01b900460ff16156104ba5760405162461bcd60e51b815260206004820152601f60248201527f436f6e747261637420697320616c726561647920696e697469616c697a6564006044820152606401610457565b8160000361050a5760405162461bcd60e51b815260206004820152601a60248201527f566572696669657220636f756e742063616e6e6f7420626520300000000000006044820152606401610457565b600085900361055b5760405162461bcd60e51b815260206004820152601e60248201527f4465706f736974207363726970742063616e6e6f7420626520656d70747900006044820152606401610457565b6001805460ff60a01b1916600160a01b179055600461057b868883612191565b506005610589848683612191565b5060038290556002805473deaddeaddeaddeaddeaddeaddeaddeaddeaddead6001600160a01b03199182168117909255600080549091166001600160a01b0384161781556040805191825260208201929092527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a17f89ed79f38bee253aee2fb8d52df0d71b4aaf0843800d093a499a55eeca455c34868686868660405161063e95949392919061227b565b60405180910390a1505050505050565b61065f81662386f26fc100006122cb565b34146106a75760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610457565b60075460005b828110156107585760078484838181106106c9576106c96122e2565b835460018101855560009485526020948590209190940292909201359190920155507fc96d1af655ee5eb07357bb1097f3b2f247ea0c4e3cf5f9a5c8449c4f8b64fb6b84848381811061071e5761071e6122e2565b90506020020135828461073191906122f8565b604080519283526020830191909152429082015260600160405180910390a16001016106ad565b50505050565b6000546001600160a01b031633146107885760405162461bcd60e51b81526004016104579061230b565b600080546001600160a01b03191681556040805182815260208101929092527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1565b6001546001600160a01b0316331461082e5760405162461bcd60e51b815260206004820152601b60248201527f43616c6c6572206973206e6f742070656e64696e67206f776e657200000000006044820152606401610457565b60008054600180546001600160a01b03198084166001600160a01b038084169190911786559116909155604080519190921680825260208201939093527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091015b60405180910390a150565b600580546108a790612106565b80601f01602080910402602001604051908101604052809291908181526020018280546108d390612106565b80156109205780601f106108f557610100808354040283529160200191610920565b820191906000526020600020905b81548152906001019060200180831161090357829003601f168201915b505050505081565b662386f26fc1000034146109785760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610457565b600780546001810182556000919091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68881018290556040805183815260208101839052428183015290517fc96d1af655ee5eb07357bb1097f3b2f247ea0c4e3cf5f9a5c8449c4f8b64fb6b9181900360600190a15050565b6000546001600160a01b03163314610a1b5760405162461bcd60e51b81526004016104579061230b565b80600003610a6b5760405162461bcd60e51b815260206004820152601a60248201527f566572696669657220636f756e742063616e6e6f7420626520300000000000006044820152606401610457565b6000849003610abc5760405162461bcd60e51b815260206004820152601e60248201527f4465706f736974207363726970742063616e6e6f7420626520656d70747900006044820152606401610457565b6004610ac9858783612191565b506005610ad7838583612191565b5060038190556040517f89ed79f38bee253aee2fb8d52df0d71b4aaf0843800d093a499a55eeca455c3490610b15908790879087908790879061227b565b60405180910390a15050505050565b6000546001600160a01b03163314610b4e5760405162461bcd60e51b81526004016104579061230b565b600280546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910161088f565b600480546108a790612106565b60078181548110610bc057600080fd5b600091825260209091200154905081565b6002546001600160a01b03163314610c2b5760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f7420746865206f70657261746f720000000000006044820152606401610457565b6000610c89610c3d6020840184612338565b610c4d6040850160208601612362565b610c5a604086018661238c565b610c67606088018861238c565b610c7460808a018a61238c565b610c8460c08c0160a08d01612338565b6113fc565b60008181526006602052604090205490915060ff1615610ce15760405162461bcd60e51b81526020600482015260136024820152721ddd1e125908185b1c9958591e481cdc195b9d606a1b6044820152606401610457565b60008181526006602052604090819020805460ff19166001179055610d4690610d0c9084018461238c565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061144492505050565b610d925760405162461bcd60e51b815260206004820152601d60248201527f56696e206973206e6f742070726f7065726c7920666f726d61747465640000006044820152606401610457565b610ddc610da2606084018461238c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506114e892505050565b610e285760405162461bcd60e51b815260206004820152601e60248201527f566f7574206973206e6f742070726f7065726c7920666f726d617474656400006044820152606401610457565b6000610e74610e3a604085018561238c565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061157f92505050565b91505080600114610ec05760405162461bcd60e51b815260206004820152601660248201527513db9b1e481bdb99481a5b9c1d5d08185b1b1bddd95960521b6044820152606401610457565b610f0c610ed0608085018561238c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250611596915050565b610f625760405162461bcd60e51b815260206004820152602160248201527f5769746e657373206973206e6f742070726f7065726c7920666f726d617474656044820152601960fa1b6064820152608401610457565b6001603160981b01634ffd344a60e085013584610f8260c088018861238c565b8861010001356040518663ffffffff1660e01b8152600401610fa89594939291906123d3565b602060405180830381865afa158015610fc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe99190612405565b6110355760405162461bcd60e51b815260206004820152601b60248201527f5472616e73616374696f6e206973206e6f7420696e20626c6f636b00000000006044820152606401610457565b6000611081611047608086018661238c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061160c915050565b9050600061108e8261157f565b91505060035460026110a091906122f8565b81146110e65760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207769746e657373206974656d7360581b6044820152606401610457565b60006110f4836003546116ef565b905060006004805461110590612106565b9150600090506111168382846118b9565b90506111ac816004805461112990612106565b80601f016020809104026020016040519081016040528092919081815260200182805461115590612106565b80156111a25780601f10611177576101008083540402835291602001916111a2565b820191906000526020600020905b81548152906001019060200180831161118557829003601f168201915b505050505061197d565b6111f15760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590819195c1bdcda5d081cd8dc9a5c1d60521b6044820152606401610457565b60006112206112018460146122f8565b61120c8560146122f8565b86516112189190612427565b8691906118b9565b9050611233816005805461112990612106565b6112775760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840e6c6e4d2e0e840e6eaccccd2f605b1b6044820152606401610457565b600061128285611a3f565b604080518b81526001600160a01b0383166020820152428183015290519192507f182fa52899142d44ff5c45a6354d3b3e868d5b07db6a65580b39bd321bdaf8ac919081900360600190a16000816001600160a01b0316662386f26fc1000060405160006040518083038185875af1925050503d8060008114611321576040519150601f19603f3d011682016040523d82523d6000602084013e611326565b606091505b50509050806113695760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610457565b5050505050505050505050565b6000546001600160a01b031633146113a05760405162461bcd60e51b81526004016104579061230b565b600180546001600160a01b0319166001600160a01b038381169182179092556000546040805191909316815260208101919091527fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278910161088f565b60006114368a8a8a8a8a8a8a8a8a6040516020016114229998979695949392919061243a565b604051602081830303815290604052611a75565b9a9950505050505050505050565b60008060006114528461157f565b9092509050801580611465575060001982145b15611474575060009392505050565b60006114818360016122f8565b905060005b828110156114db57855182106114a25750600095945050505050565b60006114ae8784611a9c565b905060001981036114c6575060009695505050505050565b6114d081846122f8565b925050600101611486565b5093519093149392505050565b60008060006114f68461157f565b9092509050801580611509575060001982145b15611518575060009392505050565b60006115258360016122f8565b905060005b828110156114db57855182106115465750600095945050505050565b60006115528784611ae5565b9050600019810361156a575060009695505050505050565b61157481846122f8565b92505060010161152a565b60008061158d836000611b49565b91509150915091565b6000816000036115a857506000611606565b6000805b838110156115ff57845182106115c757600092505050611606565b60006115d38684611ced565b905060001981036115ea5760009350505050611606565b6115f481846122f8565b9250506001016115ac565b5083511490505b92915050565b606060008060005b84811015611685576116268683611ced565b925060001983036116715760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610457565b61167b83836122f8565b9150600101611614565b506116908582611ced565b915060001982036116db5760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610457565b6116e68582846118b9565b95945050505050565b60606000806116fd8561157f565b90925090506001820161175d5760405162461bcd60e51b815260206004820152602260248201527f52656164206f76657272756e20647572696e6720566172496e742070617273696044820152616e6760f01b6064820152608401610457565b80841061179f5760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610457565b6000806117ad8460016122f8565b905060005b86811015611838576117c48883611b49565b90955092506001830161180e5760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610457565b8261181a8660016122f8565b61182491906122f8565b61182e90836122f8565b91506001016117b2565b506118438782611b49565b90945091506001820161188d5760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610457565b6118ae8161189b86856122f8565b6118a69060016122f8565b8991906118b9565b979650505050505050565b6060816000036118d85750604080516020810190915260008152611976565b60006118e483856122f8565b905083811180156118f6575080855110155b6119385760405162461bcd60e51b8152602060048201526013602482015272536c696365206f7574206f6620626f756e647360681b6044820152606401610457565b604051915082604083010160405282825283850182038460208701018481015b8082101561197157815183830152602082019150611958565b505050505b9392505050565b600081518351146119c75760405162461bcd60e51b8152602060048201526014602482015273098cadccee8d0e640c8de40dcdee840dac2e8c6d60631b6044820152606401610457565b825160005b81811015611a34578381815181106119e6576119e66122e2565b602001015160f81c60f81b6001600160f81b031916858281518110611a0d57611a0d6122e2565b01602001516001600160f81b03191614611a2c57600092505050611606565b6001016119cc565b506001949350505050565b60008060048054611a4f90612106565b915060009050611a61848360146118b9565b611a6a906124a2565b60601c949350505050565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b6000806000611aab8585611d8b565b909250905060018201611ac45760001992505050611606565b80611ad08360256122f8565b611ada91906122f8565b6116e69060046122f8565b6000611af28260096122f8565b83511015611b035750600019611606565b600080611b1a85611b158660086122f8565b611b49565b909250905060018201611b335760001992505050611606565b80611b3f8360096122f8565b6116e691906122f8565b6000806000611b588585611dcd565b90508060ff16600003611b8d576000858581518110611b7957611b796122e2565b016020015190935060f81c9150611ce69050565b83611b998260016124de565b60ff16611ba691906122f8565b85511015611bbd5760001960009250925050611ce6565b60008160ff16600203611c0157611bf6611be2611bdb8760016122f8565b8890611e53565b62ffff0060e882901c1660f89190911c1790565b61ffff169050611cdc565b8160ff16600403611c5057611c43611c1d611bdb8760016122f8565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b63ffffffff169050611cdc565b8160ff16600803611cdc57611ccf611c6c611bdb8760016122f8565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b67ffffffffffffffff1666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b67ffffffffffffffff1690505b60ff909116925090505b9250929050565b6000806000611cfc8585611b49565b909250905060018201611d155760001992505050611606565b600080611d238460016122f8565b905060005b83811015611d8057611d3a8883611b49565b909550925060018301611d565760001995505050505050611606565b82611d628660016122f8565b611d6c91906122f8565b611d7690836122f8565b9150600101611d28565b509695505050505050565b600080611d998360256122f8565b84511015611dae575060001990506000611ce6565b600080611dc086611b158760246122f8565b9097909650945050505050565b6000828281518110611de157611de16122e2565b016020015160f81c60ff03611df857506008611606565b828281518110611e0a57611e0a6122e2565b016020015160f81c60fe03611e2157506004611606565b828281518110611e3357611e336122e2565b016020015160f81c60fd03611e4a57506002611606565b50600092915050565b60006119768383016020015190565b60008083601f840112611e7457600080fd5b50813567ffffffffffffffff811115611e8c57600080fd5b602083019150836020828501011115611ce657600080fd5b80356001600160a01b0381168114611ebb57600080fd5b919050565b60008060008060008060808789031215611ed957600080fd5b863567ffffffffffffffff80821115611ef157600080fd5b611efd8a838b01611e62565b90985096506020890135915080821115611f1657600080fd5b50611f2389828a01611e62565b90955093505060408701359150611f3c60608801611ea4565b90509295509295509295565b60008060208385031215611f5b57600080fd5b823567ffffffffffffffff80821115611f7357600080fd5b818501915085601f830112611f8757600080fd5b813581811115611f9657600080fd5b8660208260051b8501011115611fab57600080fd5b60209290920196919550909350505050565b600060208284031215611fcf57600080fd5b5035919050565b60006020808352835180602085015260005b8181101561200457858101830151858201604001528201611fe8565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060008060006060868803121561203d57600080fd5b853567ffffffffffffffff8082111561205557600080fd5b61206189838a01611e62565b9097509550602088013591508082111561207a57600080fd5b5061208788828901611e62565b96999598509660400135949350505050565b6000602082840312156120ab57600080fd5b61197682611ea4565b6000602082840312156120c657600080fd5b813567ffffffffffffffff8111156120dd57600080fd5b8201610120818503121561197657600080fd5b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061211a57607f821691505b60208210810361213a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561218c576000816000526020600020601f850160051c810160208610156121695750805b601f850160051c820191505b8181101561218857828155600101612175565b5050505b505050565b67ffffffffffffffff8311156121a9576121a96120f0565b6121bd836121b78354612106565b83612140565b6000601f8411600181146121f157600085156121d95750838201355b600019600387901b1c1916600186901b17835561224b565b600083815260209020601f19861690835b828110156122225786850135825560209485019460019092019101612202565b508682101561223f5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061228f606083018789612252565b82810360208401526122a2818688612252565b9150508260408301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417611606576116066122b5565b634e487b7160e01b600052603260045260246000fd5b80820180821115611606576116066122b5565b60208082526013908201527221b0b63632b91034b9903737ba1037bbb732b960691b604082015260600190565b60006020828403121561234a57600080fd5b81356001600160e01b03198116811461197657600080fd5b60006020828403121561237457600080fd5b81356001600160f01b03198116811461197657600080fd5b6000808335601e198436030181126123a357600080fd5b83018035915067ffffffffffffffff8211156123be57600080fd5b602001915036819003821315611ce657600080fd5b8581528460208201526080604082015260006123f3608083018587612252565b90508260608301529695505050505050565b60006020828403121561241757600080fd5b8151801515811461197657600080fd5b81810381811115611606576116066122b5565b6001600160e01b03198a811682526001600160f01b03198a166004830152600090888a60068501378883016006810160008152888a82375087810190506006810160008152868882375093169390920160068101939093525050600a01979650505050505050565b805160208201516bffffffffffffffffffffffff1980821692919060148310156124d65780818460140360031b1b83161693505b505050919050565b60ff8181168382160190811115611606576116066122b556fea26469706673582212208ac886a40f4e63c08869cffdbd467cd0915776904e3e07abc50ccf0e78458f5d64736f6c63430008190033" + }, + { + "address": "0x66f68692c03eB9C0656D676f2F4bD13eba40D1B7", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + } + ], + "chain_id": 62298, + "limit_contract_code_size": 24576, + "spec": + { + "0": "SHANGHAI" + }, + "coinbase": "0xE8290ff822D3cfEa7A826FbEd4761Dc13f1fc0f2", + "starting_base_fee": 1000000000, + "block_gas_limit": 8000000, + "base_fee_params": + { + "max_change_denominator": 8, + "elasticity_multiplier": 2 + }, + "difficulty": 0, + "extra_data": "0x", + "timestamp": 0, + "nonce": 0 +} \ No newline at end of file diff --git a/resources/genesis/devnet/soft_confirmation_rule_enforcer.json b/resources/genesis/devnet/soft_confirmation_rule_enforcer.json new file mode 100644 index 0000000..b13b6d0 --- /dev/null +++ b/resources/genesis/devnet/soft_confirmation_rule_enforcer.json @@ -0,0 +1,4 @@ +{ + "max_l2_blocks_per_l1": 86400, + "authority": "sov1tz5dqrfqrtcsejn4ux7a3dscljqcgvxzf4qarcl5tmqsgsymxw3se4x3a0" +} \ No newline at end of file diff --git a/resources/genesis/mock-dockerized/accounts.json b/resources/genesis/mock-dockerized/accounts.json new file mode 100644 index 0000000..f65b078 --- /dev/null +++ b/resources/genesis/mock-dockerized/accounts.json @@ -0,0 +1,3 @@ +{ + "pub_keys": [] +} diff --git a/resources/genesis/mock-dockerized/evm.json b/resources/genesis/mock-dockerized/evm.json new file mode 100644 index 0000000..4e4670b --- /dev/null +++ b/resources/genesis/mock-dockerized/evm.json @@ -0,0 +1,158 @@ +{ + "data": [ + { + "address": "0x0f820f428ae436c1000b27577bf5bbf09bfec8f2", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x3100000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000001", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000002", + "balance": "0x115eec47f6cf7e35000000", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000002", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000003", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000004", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000005", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x31ffffffffffffffffffffffffffffffffffffff", + "balance": "0x0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105ea565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c99086908690600401610607565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff81111561055857600080fd5b8401601f8101861361056957600080fd5b803567ffffffffffffffff811115610583576105836104f6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156105b2576105b26104f6565b6040528181528282016020018810156105ca57600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000602082840312156105fc57600080fd5b81516104b681610484565b60018060a01b0383168152604060208201526000825180604084015260005b818110156106435760208186018101516060868401015201610626565b506000606082850101526060601f19601f830116840101915050939250505056", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "address": "0x3200000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806357e871e71161007157806357e871e71461014c57806361b207e214610155578063a91d8b3d14610182578063d269a03e146101a2578063d761753e146101b5578063ee82ac5e146101e857600080fd5b80630466efc4146100ae5780630e27bc11146100e15780631f578333146100f657806334cdf78d146101095780634ffd344a14610129575b600080fd5b6100ce6100bc366004610598565b60009081526002602052604090205490565b6040519081526020015b60405180910390f35b6100f46100ef3660046105b1565b610208565b005b6100f4610104366004610598565b610330565b6100ce610117366004610598565b60016020526000908152604090205481565b61013c61013736600461061c565b6103de565b60405190151581526020016100d8565b6100ce60005481565b6100ce610163366004610598565b6000908152600160209081526040808320548352600290915290205490565b6100ce610190366004610598565b60026020526000908152604090205481565b61013c6101b036600461061c565b610404565b6101d073deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b6040516001600160a01b0390911681526020016100d8565b6100ce6101f6366004610598565b60009081526001602052604090205490565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146102705760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c65720060448201526064015b60405180910390fd5b60008054908190036102b65760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610267565b60008181526001602081905260409091208490556102d5908290610677565b60009081558381526002602090815260409182902084905581518381529081018590529081018390527f32eff959e2e8d1609edc4b39ccf75900aa6c1da5719f8432752963fdf008234f9060600160405180910390a1505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146103935760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610267565b600054156103d95760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610267565b600055565b6000858152600160205260408120546103fa908686868661040f565b9695505050505050565b60006103fa86868686865b6000858152600260209081526040808320548151601f870184900484028101840190925285825291610462918891849190899089908190840183828082843760009201919091525089925061046d915050565b979650505050505050565b6000838514801561047c575081155b801561048757508251155b15610494575060016104a3565b6104a0858486856104ab565b90505b949350505050565b6000602084516104bb9190610698565b156104c8575060006104a3565b83516000036104d9575060006104a3565b818560005b8651811015610548576104f2600284610698565b6001036105165761050f6105098883016020015190565b83610555565b915061052f565b61052c826105278984016020015190565b610555565b91505b60019290921c91610541602082610677565b90506104de565b5090931495945050505050565b6000610561838361056a565b90505b92915050565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6000602082840312156105aa57600080fd5b5035919050565b600080604083850312156105c457600080fd5b50508035926020909101359150565b60008083601f8401126105e557600080fd5b50813567ffffffffffffffff8111156105fd57600080fd5b60208301915083602082850101111561061557600080fd5b9250929050565b60008060008060006080868803121561063457600080fd5b8535945060208601359350604086013567ffffffffffffffff81111561065957600080fd5b610665888289016105d3565b96999598509660600135949350505050565b8082018082111561056457634e487b7160e01b600052601160045260246000fd5b6000826106b557634e487b7160e01b600052601260045260246000fd5b50069056" + }, + { + "address": "0x3200000000000000000000000000000000000002", + "balance": "0x0", + "code": "0x60806040526004361061019c5760003560e01c80638786dba7116100ec578063d761753e1161008a578063e613ae0011610064578063e613ae001461048e578063f119a9bd146104a9578063f2fde38b146104c9578063f8e655d2146104e957600080fd5b8063d761753e14610431578063dd95c7c614610459578063e30c39781461047957600080fd5b8063a41c5cf3116100c6578063a41c5cf3146103af578063b3ab15fb146103c4578063bafa9eb2146103e4578063c045577b1461040457600080fd5b80638786dba71461037257806387f8bf56146103855780638da5cb5b1461039a57600080fd5b8063570ca73511610159578063715018a611610133578063715018a61461031357806374ab4a8314610328578063781952a81461034857806379ba50971461035d57600080fd5b8063570ca735146102945780635d3e3176146102d15780635e3cc740146102f357600080fd5b806311e53a01146101a1578063158ef93e146101e1578063198546231461020b5780634126013714610220578063419759f514610240578063471ba1e314610256575b600080fd5b3480156101ad57600080fd5b506101ce6101bc3660046129ee565b60276020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101ed57600080fd5b506000546101fb9060ff1681565b60405190151581526020016101d8565b61021e610219366004612a4b565b610509565b005b34801561022c57600080fd5b5061021e61023b366004612afb565b6106e2565b34801561024c57600080fd5b506101ce60215481565b34801561026257600080fd5b506102766102713660046129ee565b6108ef565b604080519283526001600160e01b03199091166020830152016101d8565b3480156102a057600080fd5b506000546102b99061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101d8565b3480156102dd57600080fd5b506102e6610920565b6040516101d89190612b96565b3480156102ff57600080fd5b5061021e61030e366004612be2565b6109ae565b34801561031f57600080fd5b5061021e610d65565b34801561033457600080fd5b5061021e610343366004612c1e565b610d79565b34801561035457600080fd5b506026546101ce565b34801561036957600080fd5b5061021e610f4c565b61021e610380366004612c88565b610f94565b34801561039157600080fd5b506102e66110bb565b3480156103a657600080fd5b506102b96110c8565b3480156103bb57600080fd5b506102e66110fd565b3480156103d057600080fd5b5061021e6103df366004612cb4565b61110a565b3480156103f057600080fd5b506101fb6103ff3660046129ee565b61117b565b34801561041057600080fd5b506101ce61041f3660046129ee565b60286020526000908152604090205481565b34801561043d57600080fd5b506102b973deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b34801561046557600080fd5b5061021e610474366004612be2565b6111a6565b34801561048557600080fd5b506102b9611606565b34801561049a57600080fd5b506102b96001603160981b0181565b3480156104b557600080fd5b5061021e6104c4366004612cdd565b61162f565b3480156104d557600080fd5b5061021e6104e4366004612cb4565b6116a3565b3480156104f557600080fd5b5061021e610504366004612d1e565b611728565b82811461054f5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064015b60405180910390fd5b60215461055d908490612d97565b34146105a55760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b60265460005b848110156106da57600060405180604001604052808888858181106105d2576105d2612dae565b9050602002013581526020018686858181106105f0576105f0612dae565b90506020020160208101906106059190612dc4565b6001600160e01b03191690526026805460018101825560009190915281517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a359460029092029182015560208201517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909101805463ffffffff191660e09290921c91909117905590507f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada816106b98486612ddf565b426040516106c993929190612df2565b60405180910390a1506001016105ab565b505050505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146107455760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610546565b60005460ff16156107985760405162461bcd60e51b815260206004820152601f60248201527f436f6e747261637420697320616c726561647920696e697469616c697a6564006044820152606401610546565b806000036107e85760405162461bcd60e51b815260206004820152601a60248201527f4465706f73697420616d6f756e742063616e6e6f7420626520300000000000006044820152606401610546565b60008490036108095760405162461bcd60e51b815260040161054690612e20565b6000805460ff191660011790556023610823858783612ef0565b506024610831838583612ef0565b50602181905560008054610100600160a81b03191674deaddeaddeaddeaddeaddeaddeaddeaddeaddead001781556040805191825273deaddeaddeaddeaddeaddeaddeaddeaddeaddead60208301527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a17f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc858585856040516108e09493929190612fd8565b60405180910390a15050505050565b602681815481106108ff57600080fd5b60009182526020909120600290910201805460019091015490915060e01b82565b6025805461092d90612e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612e6d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b505050505081565b6109b7816117a2565b5060009050610a066109cc606084018461300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ac592505050565b915060009050610a63610a1c606085018561300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a5e925060019150869050613050565b611adc565b90506000610a7082611c54565b90506000610a88610a8383836020611cd6565b611d99565b90506000610aa9610a836020808651610aa19190613050565b869190611cd6565b600083815260276020526040812054919250819003610b015760405162461bcd60e51b815260206004820152601460248201527311195c1bdcda5d08191bc81b9bdd08195e1a5cdd60621b6044820152606401610546565b6000610b4d610b1360808a018a61300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250611e1e915050565b90506000610b5c826001611f01565b9050600060258054610b6d90612e6d565b915060009050610b7e838284611cd6565b9050610c148160258054610b9190612e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e6d565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050612085565b610c605760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736c6173684f7254616b65207363726970740000000000006044820152606401610546565b6000602881610c70600189613050565b815260200190815260200160002054905060008160001480610c9a5750610c968861215c565b8214155b905080610ce95760405162461bcd60e51b815260206004820152601960248201527f4f70657261746f72206973206e6f74206d616c6963696f7573000000000000006044820152606401610546565b600180896103e88110610cfe57610cfe612dae565b602091828204019190066101000a81548160ff0219169083151502179055507ff918cdaebea74c5a8c3b02d7404c162f507551b158202cedcba9b6a74eabdff288604051610d4e91815260200190565b60405180910390a150505050505050505050505050565b610d6d612169565b610d77600061219b565b565b610d82836117a2565b5060009050610dd3610d97604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506121d7915050565b90506000610de08261232a565b90506000610ded83612337565b9050600060268581548110610e0457610e04612dae565b60009182526020918290206040805180820190915260029290920201805480835260019091015460e01b6001600160e01b03191692820192909252915083148015610e665750816001600160e01b03191681602001516001600160e01b031916145b610ea65760405162461bcd60e51b81526020600482015260116024820152706e6f74206d61746368696e67205554584f60781b6044820152606401610546565b6000610eb86109cc60608a018a61300a565b915060009050610ece610a1c60608b018b61300a565b90506000610edb82611c54565b90506000610ee882611d99565b9050610ef38161215c565b60008a8152602860209081526040918290209290925580518b81529182018390527feedf47c2f61b040827944fd45e44ef6d742354b34e1af7dd99a56f444ec79347910160405180910390a15050505050505050505050565b3380610f56611606565b6001600160a01b031614610f885760405163118cdaa760e01b81526001600160a01b0382166004820152602401610546565b610f918161219b565b50565b6021543414610fdf5760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b6040805180820182528381526001600160e01b03198316602082019081526026805460018101825560009190915282517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594600283029081019190915591517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909201805463ffffffff191660e09390931c9290921790915591519091907f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada906110ad90849084904290612df2565b60405180910390a150505050565b6024805461092d90612e6d565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6023805461092d90612e6d565b611112612169565b60008054610100600160a81b0319166101006001600160a01b038481168281029390931793849055604080519290940416815260208101919091527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a150565b6001816103e8811061118c57600080fd5b60209182820401919006915054906101000a900460ff1681565b60005461010090046001600160a01b031633146112055760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f7420746865206f70657261746f720000000000006044820152606401610546565b600080611211836117a2565b915091508060011461125e5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481bdb99481a5b9c1d5d08185b1b1bddd95960521b6044820152606401610546565b60006113096112706020860186612dc4565b61127d604087018761300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112bf92505050606088018861300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113049250505060c0890160a08a01612dc4565b612344565b6000818152602760205260409020549091501561135d5760405162461bcd60e51b81526020600482015260126024820152711d1e125908185b1c9958591e481cdc195b9d60721b6044820152606401610546565b60226000815461136c90613063565b9182905550600082815260276020526040812091909155611393610b13608087018761300a565b905060006113a082611ac5565b915050806003146113eb5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207769746e657373206974656d7360581b6044820152606401610546565b60006113f8836001611f01565b905060006023805461140990612e6d565b91506000905061141a838284611cd6565b905061142d8160238054610b9190612e6d565b6114725760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590819195c1bdcda5d081cd8dc9a5c1d60521b6044820152606401610546565b60006114a66024805461148490612e6d565b86516114909250613050565b6024805461149d90612e6d565b87929150611cd6565b90506114b98160248054610b9190612e6d565b6114fd5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840e6c6e4d2e0e840e6eaccccd2f605b1b6044820152606401610546565b600061150885612374565b602254604080518d8152602081018c90526001600160a01b038416818301524260608201526080810192909252519192507fa82453ca34121b3ecb910d957824e27c5dc6465315949facd15fb72886490058919081900360a00190a16021546040516000916001600160a01b038416918381818185875af1925050503d80600081146115b0576040519150601f19603f3d011682016040523d82523d6000602084013e6115b5565b606091505b50509050806115f85760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610546565b505050505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c006110ed565b611637612169565b60008190036116585760405162461bcd60e51b815260040161054690612e20565b6025611665828483612ef0565b507f8578c80bdea3ff51431011ed88db9cb415de2cf64f9ed5e7137288268cbdeb2c828260405161169792919061307c565b60405180910390a15050565b6116ab612169565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556116ef6110c8565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b611730612169565b60008390036117515760405162461bcd60e51b815260040161054690612e20565b602361175e848683612ef0565b50602461176c828483612ef0565b507f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc848484846040516110ad9493929190612fd8565b600080806118026117b66020860186612dc4565b6117c66040870160208801613090565b6117d3604088018861300a565b6117e060608a018a61300a565b6117ed60808c018c61300a565b6117fd60c08e0160a08f01612dc4565b6123aa565b905061184e611814604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123de92505050565b61189a5760405162461bcd60e51b815260206004820152601d60248201527f56696e206973206e6f742070726f7065726c7920666f726d61747465640000006044820152606401610546565b6118e46118aa606086018661300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061248292505050565b6119305760405162461bcd60e51b815260206004820152601e60248201527f566f7574206973206e6f742070726f7065726c7920666f726d617474656400006044820152606401610546565b60006119426109cc604087018761300a565b91506119929050611956608087018761300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250612519915050565b6119e85760405162461bcd60e51b815260206004820152602160248201527f5769746e657373206973206e6f742070726f7065726c7920666f726d617474656044820152601960fa1b6064820152608401610546565b6001603160981b01634ffd344a60e087013584611a0860c08a018a61300a565b8a61010001356040518663ffffffff1660e01b8152600401611a2e9594939291906130ba565b602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906130ec565b611abb5760405162461bcd60e51b815260206004820152601b60248201527f5472616e73616374696f6e206973206e6f7420696e20626c6f636b00000000006044820152606401610546565b9094909350915050565b600080611ad383600061258e565b91509150915091565b6060600080611aea85611ac5565b909250905060018201611b0f5760405162461bcd60e51b81526004016105469061310e565b808410611b525760405162461bcd60e51b81526020600482015260116024820152702b37baba103932b0b21037bb32b9393ab760791b6044820152606401610546565b600080611b60846001612ddf565b905060005b86811015611bde57611b778883612730565b92506000198303611bca5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611bd48383612ddf565b9150600101611b65565b50611be98782612730565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611c47878284611cd6565b9450505050505b92915050565b606081600981518110611c6957611c69612dae565b6020910101516001600160f81b031916603560f91b14611c9757505060408051602081019091526000815290565b600082600a81518110611cac57611cac612dae565b01602001516001600160f81b031981169150611ccf908490600b9060f81c611cd6565b9392505050565b606081600003611cf55750604080516020810190915260008152611ccf565b6000611d018385612ddf565b90508381118015611d13575080855110155b611d555760405162461bcd60e51b8152602060048201526013602482015272536c696365206f7574206f6620626f756e647360681b6044820152606401610546565b604051915082604083010160405282825283850182038460208701018481015b80821015611d8e57815183830152602082019150611d75565b505050509392505050565b60008151600003611dac57506000919050565b81516020811115611e0a5760405162461bcd60e51b815260206004820152602260248201527f42797465732063616e6e6f74206265206d6f7265207468616e20333220627974604482015261657360f01b6064820152608401610546565b60209283015192036008029190911c919050565b606060008060005b84811015611e9757611e388683612794565b92506000198303611e835760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611e8d8383612ddf565b9150600101611e26565b50611ea28582612794565b91506000198203611eed5760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611ef8858284611cd6565b95945050505050565b6060600080611f0f85611ac5565b909250905060018201611f345760405162461bcd60e51b81526004016105469061310e565b808410611f765760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b600080611f84846001612ddf565b905060005b8681101561200f57611f9b888361258e565b909550925060018301611fe55760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b82611ff1866001612ddf565b611ffb9190612ddf565b6120059083612ddf565b9150600101611f89565b5061201a878261258e565b9094509150600182016120645760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b611c47816120728685612ddf565b61207d906001612ddf565b899190611cd6565b8151815160009190811461209d576000915050611c4e565b60206000805b8383116120d357505084810151848201516020909201918082146120ce576000945050505050611c4e565b6120a3565b60006120e0602085613050565b90505b8481101561214e578681815181106120fd576120fd612dae565b602001015160f81c60f81b6001600160f81b03191688828151811061212457612124612dae565b01602001516001600160f81b0319161461214657600095505050505050611c4e565b6001016120e3565b506001979650505050505050565b6000611c4e826001612ddf565b336121726110c8565b6001600160a01b031614610d775760405163118cdaa760e01b8152336004820152602401610546565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556121d382612836565b5050565b60606000806121e585611ac5565b90925090506001820161220a5760405162461bcd60e51b81526004016105469061310e565b80841061224c5760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b60008061225a846001612ddf565b905060005b868110156122d25761227188836128a7565b925060001983036122be5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6122c88383612ddf565b915060010161225f565b506122dd87826128a7565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6020810151600090611c4e565b6000611c4e8260206128f0565b6000611ef8858585856040516020016123609493929190613150565b6040516020818303038152906040526128ff565b6000806023805461238490612e6d565b91506000905061239684836014611cd6565b61239f906131ad565b60601c949350505050565b60006123d08a8a8a8a8a8a8a8a8a60405160200161236099989796959493929190613200565b9a9950505050505050505050565b60008060006123ec84611ac5565b90925090508015806123ff575060001982145b1561240e575060009392505050565b600061241b836001612ddf565b905060005b82811015612475578551821061243c5750600095945050505050565b600061244887846128a7565b90506000198103612460575060009695505050505050565b61246a8184612ddf565b925050600101612420565b5093519093149392505050565b600080600061249084611ac5565b90925090508015806124a3575060001982145b156124b2575060009392505050565b60006124bf836001612ddf565b905060005b8281101561247557855182106124e05750600095945050505050565b60006124ec8784612730565b90506000198103612504575060009695505050505050565b61250e8184612ddf565b9250506001016124c4565b60008160000361252b57506000611c4e565b6000805b83811015612582578451821061254a57600092505050611c4e565b60006125568684612794565b9050600019810361256d5760009350505050611c4e565b6125778184612ddf565b92505060010161252f565b50835114905092915050565b600080600061259d8585612926565b90508060ff166000036125d25760008585815181106125be576125be612dae565b016020015190935060f81c91506127299050565b836125de826001613269565b60ff166125eb9190612ddf565b855110156126025760001960009250925050612729565b60008160ff166002036126465761263b612627612620876001612ddf565b88906128f0565b62ffff0060e882901c1660f89190911c1790565b61ffff16905061271f565b8160ff1660040361269557612688612662612620876001612ddf565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b63ffffffff16905061271f565b8160ff1660080361271f576127136126b1612620876001612ddf565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b6001600160401b031666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b6001600160401b031690505b60ff909116925090505b9250929050565b600061273d826009612ddf565b8351101561274e5750600019611c4e565b60008061276585612760866008612ddf565b61258e565b90925090506001820161277e5760001992505050611c4e565b8061278a836009612ddf565b611ef89190612ddf565b60008060006127a3858561258e565b9092509050600182016127bc5760001992505050611c4e565b6000806127ca846001612ddf565b905060005b8381101561282b576127e588612760848a612ddf565b9095509250600183016128015760001995505050505050611c4e565b8261280d866001612ddf565b6128179190612ddf565b6128219083612ddf565b91506001016127cf565b509695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60008060006128b685856129ac565b9092509050600182016128cf5760001992505050611c4e565b806128db836025612ddf565b6128e59190612ddf565b611ef8906004612ddf565b6000611ccf8383016020015190565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b600082828151811061293a5761293a612dae565b016020015160f81c60ff0361295157506008611c4e565b82828151811061296357612963612dae565b016020015160f81c60fe0361297a57506004611c4e565b82828151811061298c5761298c612dae565b016020015160f81c60fd036129a357506002611c4e565b50600092915050565b6000806129ba836025612ddf565b845110156129cf575060001990506000612729565b6000806129e186612760876024612ddf565b9097909650945050505050565b600060208284031215612a0057600080fd5b5035919050565b60008083601f840112612a1957600080fd5b5081356001600160401b03811115612a3057600080fd5b6020830191508360208260051b850101111561272957600080fd5b60008060008060408587031215612a6157600080fd5b84356001600160401b03811115612a7757600080fd5b612a8387828801612a07565b90955093505060208501356001600160401b03811115612aa257600080fd5b612aae87828801612a07565b95989497509550505050565b60008083601f840112612acc57600080fd5b5081356001600160401b03811115612ae357600080fd5b60208301915083602082850101111561272957600080fd5b600080600080600060608688031215612b1357600080fd5b85356001600160401b03811115612b2957600080fd5b612b3588828901612aba565b90965094505060208601356001600160401b03811115612b5457600080fd5b612b6088828901612aba565b96999598509660400135949350505050565b60005b83811015612b8d578181015183820152602001612b75565b50506000910152565b6020815260008251806020840152612bb5816040850160208701612b72565b601f01601f19169190910160400192915050565b60006101208284031215612bdc57600080fd5b50919050565b600060208284031215612bf457600080fd5b81356001600160401b03811115612c0a57600080fd5b612c1684828501612bc9565b949350505050565b600080600060608486031215612c3357600080fd5b83356001600160401b03811115612c4957600080fd5b612c5586828701612bc9565b9660208601359650604090950135949350505050565b80356001600160e01b031981168114612c8357600080fd5b919050565b60008060408385031215612c9b57600080fd5b82359150612cab60208401612c6b565b90509250929050565b600060208284031215612cc657600080fd5b81356001600160a01b0381168114611ccf57600080fd5b60008060208385031215612cf057600080fd5b82356001600160401b03811115612d0657600080fd5b612d1285828601612aba565b90969095509350505050565b60008060008060408587031215612d3457600080fd5b84356001600160401b03811115612d4a57600080fd5b612d5687828801612aba565b90955093505060208501356001600160401b03811115612d7557600080fd5b612aae87828801612aba565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417611c4e57611c4e612d81565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612dd657600080fd5b611ccf82612c6b565b80820180821115611c4e57611c4e612d81565b835181526020938401516001600160e01b031916938101939093526040830191909152606082015260800190565b6020808252601e908201527f4465706f736974207363726970742063616e6e6f7420626520656d7074790000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680612e8157607f821691505b602082108103612bdc57634e487b7160e01b600052602260045260246000fd5b601f821115612eeb57806000526020600020601f840160051c81016020851015612ec85750805b601f840160051c820191505b81811015612ee85760008155600101612ed4565b50505b505050565b6001600160401b03831115612f0757612f07612e57565b612f1b83612f158354612e6d565b83612ea1565b6000601f841160018114612f4f5760008515612f375750838201355b600019600387901b1c1916600186901b178355612ee8565b600083815260209020601f19861690835b82811015612f805786850135825560209485019460019092019101612f60565b5086821015612f9d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000612fec604083018688612faf565b8281036020840152612fff818587612faf565b979650505050505050565b6000808335601e1984360301811261302157600080fd5b8301803591506001600160401b0382111561303b57600080fd5b60200191503681900382131561272957600080fd5b81810381811115611c4e57611c4e612d81565b60006001820161307557613075612d81565b5060010190565b602081526000612c16602083018486612faf565b6000602082840312156130a257600080fd5b81356001600160f01b031981168114611ccf57600080fd5b8581528460208201526080604082015260006130da608083018587612faf565b90508260608301529695505050505050565b6000602082840312156130fe57600080fd5b81518015158114611ccf57600080fd5b60208082526022908201527f52656164206f76657272756e20647572696e6720566172496e742070617273696040820152616e6760f01b606082015260800190565b6001600160e01b0319851681528351600090613173816004850160208901612b72565b84519083019061318a816004840160208901612b72565b6001600160e01b0319949094169301600481019390935250506008019392505050565b805160208201516bffffffffffffffffffffffff198116919060148210156131f9576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b6001600160e01b03198a1681526001600160f01b031989166004820152868860068301376000878201600681016000815287898237506000908701600601908152848682376001600160e01b031993909316929093019182525060040198975050505050505050565b60ff8181168382160190811115611c4e57611c4e612d8156" + }, + { + "address": "0x3200000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3aeeb871f83c85e68ffd1868bef3425ed6649d39", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x66f68692c03eb9c0656d676f2f4bd13eba40d1b7", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x9fcdf8f60d3009656e50bf805cd53c7335b284fb", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xaafb7442f7f00b64057c2e9eae2815bb63ee0ece", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xc2f8eed77da1583f7bae0a3125dc7bc426002dde", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xd44821f906e3909b8ae944f7060551c33b922cc9", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xe756fdf89367ef428b48bca2d272ec8ecec053fd", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + } + ], + "chain_id": 5655, + "limit_contract_code_size": null, + "spec": { + "0": "SHANGHAI" + }, + "coinbase": "0x3100000000000000000000000000000000000005", + "starting_base_fee": 1000000000, + "block_gas_limit": 30000000, + "base_fee_params": { + "max_change_denominator": 8, + "elasticity_multiplier": 2 + }, + "difficulty": 0, + "extra_data": "0x", + "timestamp": 0, + "nonce": 0 +} \ No newline at end of file diff --git a/resources/genesis/mock-dockerized/soft_confirmation_rule_enforcer.json b/resources/genesis/mock-dockerized/soft_confirmation_rule_enforcer.json new file mode 100644 index 0000000..f9faf7a --- /dev/null +++ b/resources/genesis/mock-dockerized/soft_confirmation_rule_enforcer.json @@ -0,0 +1,4 @@ +{ + "max_l2_blocks_per_l1": 86400, + "authority": "sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94" +} \ No newline at end of file diff --git a/resources/genesis/mock/accounts.json b/resources/genesis/mock/accounts.json new file mode 100644 index 0000000..f65b078 --- /dev/null +++ b/resources/genesis/mock/accounts.json @@ -0,0 +1,3 @@ +{ + "pub_keys": [] +} diff --git a/resources/genesis/mock/evm.json b/resources/genesis/mock/evm.json new file mode 100644 index 0000000..4e4670b --- /dev/null +++ b/resources/genesis/mock/evm.json @@ -0,0 +1,158 @@ +{ + "data": [ + { + "address": "0x0f820f428ae436c1000b27577bf5bbf09bfec8f2", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x3100000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000001", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000002", + "balance": "0x115eec47f6cf7e35000000", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000002", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000003", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000004", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000005", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x31ffffffffffffffffffffffffffffffffffffff", + "balance": "0x0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105ea565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c99086908690600401610607565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff81111561055857600080fd5b8401601f8101861361056957600080fd5b803567ffffffffffffffff811115610583576105836104f6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156105b2576105b26104f6565b6040528181528282016020018810156105ca57600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000602082840312156105fc57600080fd5b81516104b681610484565b60018060a01b0383168152604060208201526000825180604084015260005b818110156106435760208186018101516060868401015201610626565b506000606082850101526060601f19601f830116840101915050939250505056", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "address": "0x3200000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806357e871e71161007157806357e871e71461014c57806361b207e214610155578063a91d8b3d14610182578063d269a03e146101a2578063d761753e146101b5578063ee82ac5e146101e857600080fd5b80630466efc4146100ae5780630e27bc11146100e15780631f578333146100f657806334cdf78d146101095780634ffd344a14610129575b600080fd5b6100ce6100bc366004610598565b60009081526002602052604090205490565b6040519081526020015b60405180910390f35b6100f46100ef3660046105b1565b610208565b005b6100f4610104366004610598565b610330565b6100ce610117366004610598565b60016020526000908152604090205481565b61013c61013736600461061c565b6103de565b60405190151581526020016100d8565b6100ce60005481565b6100ce610163366004610598565b6000908152600160209081526040808320548352600290915290205490565b6100ce610190366004610598565b60026020526000908152604090205481565b61013c6101b036600461061c565b610404565b6101d073deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b6040516001600160a01b0390911681526020016100d8565b6100ce6101f6366004610598565b60009081526001602052604090205490565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146102705760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c65720060448201526064015b60405180910390fd5b60008054908190036102b65760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610267565b60008181526001602081905260409091208490556102d5908290610677565b60009081558381526002602090815260409182902084905581518381529081018590529081018390527f32eff959e2e8d1609edc4b39ccf75900aa6c1da5719f8432752963fdf008234f9060600160405180910390a1505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146103935760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610267565b600054156103d95760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610267565b600055565b6000858152600160205260408120546103fa908686868661040f565b9695505050505050565b60006103fa86868686865b6000858152600260209081526040808320548151601f870184900484028101840190925285825291610462918891849190899089908190840183828082843760009201919091525089925061046d915050565b979650505050505050565b6000838514801561047c575081155b801561048757508251155b15610494575060016104a3565b6104a0858486856104ab565b90505b949350505050565b6000602084516104bb9190610698565b156104c8575060006104a3565b83516000036104d9575060006104a3565b818560005b8651811015610548576104f2600284610698565b6001036105165761050f6105098883016020015190565b83610555565b915061052f565b61052c826105278984016020015190565b610555565b91505b60019290921c91610541602082610677565b90506104de565b5090931495945050505050565b6000610561838361056a565b90505b92915050565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6000602082840312156105aa57600080fd5b5035919050565b600080604083850312156105c457600080fd5b50508035926020909101359150565b60008083601f8401126105e557600080fd5b50813567ffffffffffffffff8111156105fd57600080fd5b60208301915083602082850101111561061557600080fd5b9250929050565b60008060008060006080868803121561063457600080fd5b8535945060208601359350604086013567ffffffffffffffff81111561065957600080fd5b610665888289016105d3565b96999598509660600135949350505050565b8082018082111561056457634e487b7160e01b600052601160045260246000fd5b6000826106b557634e487b7160e01b600052601260045260246000fd5b50069056" + }, + { + "address": "0x3200000000000000000000000000000000000002", + "balance": "0x0", + "code": "0x60806040526004361061019c5760003560e01c80638786dba7116100ec578063d761753e1161008a578063e613ae0011610064578063e613ae001461048e578063f119a9bd146104a9578063f2fde38b146104c9578063f8e655d2146104e957600080fd5b8063d761753e14610431578063dd95c7c614610459578063e30c39781461047957600080fd5b8063a41c5cf3116100c6578063a41c5cf3146103af578063b3ab15fb146103c4578063bafa9eb2146103e4578063c045577b1461040457600080fd5b80638786dba71461037257806387f8bf56146103855780638da5cb5b1461039a57600080fd5b8063570ca73511610159578063715018a611610133578063715018a61461031357806374ab4a8314610328578063781952a81461034857806379ba50971461035d57600080fd5b8063570ca735146102945780635d3e3176146102d15780635e3cc740146102f357600080fd5b806311e53a01146101a1578063158ef93e146101e1578063198546231461020b5780634126013714610220578063419759f514610240578063471ba1e314610256575b600080fd5b3480156101ad57600080fd5b506101ce6101bc3660046129ee565b60276020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101ed57600080fd5b506000546101fb9060ff1681565b60405190151581526020016101d8565b61021e610219366004612a4b565b610509565b005b34801561022c57600080fd5b5061021e61023b366004612afb565b6106e2565b34801561024c57600080fd5b506101ce60215481565b34801561026257600080fd5b506102766102713660046129ee565b6108ef565b604080519283526001600160e01b03199091166020830152016101d8565b3480156102a057600080fd5b506000546102b99061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101d8565b3480156102dd57600080fd5b506102e6610920565b6040516101d89190612b96565b3480156102ff57600080fd5b5061021e61030e366004612be2565b6109ae565b34801561031f57600080fd5b5061021e610d65565b34801561033457600080fd5b5061021e610343366004612c1e565b610d79565b34801561035457600080fd5b506026546101ce565b34801561036957600080fd5b5061021e610f4c565b61021e610380366004612c88565b610f94565b34801561039157600080fd5b506102e66110bb565b3480156103a657600080fd5b506102b96110c8565b3480156103bb57600080fd5b506102e66110fd565b3480156103d057600080fd5b5061021e6103df366004612cb4565b61110a565b3480156103f057600080fd5b506101fb6103ff3660046129ee565b61117b565b34801561041057600080fd5b506101ce61041f3660046129ee565b60286020526000908152604090205481565b34801561043d57600080fd5b506102b973deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b34801561046557600080fd5b5061021e610474366004612be2565b6111a6565b34801561048557600080fd5b506102b9611606565b34801561049a57600080fd5b506102b96001603160981b0181565b3480156104b557600080fd5b5061021e6104c4366004612cdd565b61162f565b3480156104d557600080fd5b5061021e6104e4366004612cb4565b6116a3565b3480156104f557600080fd5b5061021e610504366004612d1e565b611728565b82811461054f5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064015b60405180910390fd5b60215461055d908490612d97565b34146105a55760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b60265460005b848110156106da57600060405180604001604052808888858181106105d2576105d2612dae565b9050602002013581526020018686858181106105f0576105f0612dae565b90506020020160208101906106059190612dc4565b6001600160e01b03191690526026805460018101825560009190915281517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a359460029092029182015560208201517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909101805463ffffffff191660e09290921c91909117905590507f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada816106b98486612ddf565b426040516106c993929190612df2565b60405180910390a1506001016105ab565b505050505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146107455760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610546565b60005460ff16156107985760405162461bcd60e51b815260206004820152601f60248201527f436f6e747261637420697320616c726561647920696e697469616c697a6564006044820152606401610546565b806000036107e85760405162461bcd60e51b815260206004820152601a60248201527f4465706f73697420616d6f756e742063616e6e6f7420626520300000000000006044820152606401610546565b60008490036108095760405162461bcd60e51b815260040161054690612e20565b6000805460ff191660011790556023610823858783612ef0565b506024610831838583612ef0565b50602181905560008054610100600160a81b03191674deaddeaddeaddeaddeaddeaddeaddeaddeaddead001781556040805191825273deaddeaddeaddeaddeaddeaddeaddeaddeaddead60208301527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a17f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc858585856040516108e09493929190612fd8565b60405180910390a15050505050565b602681815481106108ff57600080fd5b60009182526020909120600290910201805460019091015490915060e01b82565b6025805461092d90612e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612e6d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b505050505081565b6109b7816117a2565b5060009050610a066109cc606084018461300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ac592505050565b915060009050610a63610a1c606085018561300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a5e925060019150869050613050565b611adc565b90506000610a7082611c54565b90506000610a88610a8383836020611cd6565b611d99565b90506000610aa9610a836020808651610aa19190613050565b869190611cd6565b600083815260276020526040812054919250819003610b015760405162461bcd60e51b815260206004820152601460248201527311195c1bdcda5d08191bc81b9bdd08195e1a5cdd60621b6044820152606401610546565b6000610b4d610b1360808a018a61300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250611e1e915050565b90506000610b5c826001611f01565b9050600060258054610b6d90612e6d565b915060009050610b7e838284611cd6565b9050610c148160258054610b9190612e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e6d565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050612085565b610c605760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736c6173684f7254616b65207363726970740000000000006044820152606401610546565b6000602881610c70600189613050565b815260200190815260200160002054905060008160001480610c9a5750610c968861215c565b8214155b905080610ce95760405162461bcd60e51b815260206004820152601960248201527f4f70657261746f72206973206e6f74206d616c6963696f7573000000000000006044820152606401610546565b600180896103e88110610cfe57610cfe612dae565b602091828204019190066101000a81548160ff0219169083151502179055507ff918cdaebea74c5a8c3b02d7404c162f507551b158202cedcba9b6a74eabdff288604051610d4e91815260200190565b60405180910390a150505050505050505050505050565b610d6d612169565b610d77600061219b565b565b610d82836117a2565b5060009050610dd3610d97604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506121d7915050565b90506000610de08261232a565b90506000610ded83612337565b9050600060268581548110610e0457610e04612dae565b60009182526020918290206040805180820190915260029290920201805480835260019091015460e01b6001600160e01b03191692820192909252915083148015610e665750816001600160e01b03191681602001516001600160e01b031916145b610ea65760405162461bcd60e51b81526020600482015260116024820152706e6f74206d61746368696e67205554584f60781b6044820152606401610546565b6000610eb86109cc60608a018a61300a565b915060009050610ece610a1c60608b018b61300a565b90506000610edb82611c54565b90506000610ee882611d99565b9050610ef38161215c565b60008a8152602860209081526040918290209290925580518b81529182018390527feedf47c2f61b040827944fd45e44ef6d742354b34e1af7dd99a56f444ec79347910160405180910390a15050505050505050505050565b3380610f56611606565b6001600160a01b031614610f885760405163118cdaa760e01b81526001600160a01b0382166004820152602401610546565b610f918161219b565b50565b6021543414610fdf5760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b6040805180820182528381526001600160e01b03198316602082019081526026805460018101825560009190915282517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594600283029081019190915591517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909201805463ffffffff191660e09390931c9290921790915591519091907f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada906110ad90849084904290612df2565b60405180910390a150505050565b6024805461092d90612e6d565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6023805461092d90612e6d565b611112612169565b60008054610100600160a81b0319166101006001600160a01b038481168281029390931793849055604080519290940416815260208101919091527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a150565b6001816103e8811061118c57600080fd5b60209182820401919006915054906101000a900460ff1681565b60005461010090046001600160a01b031633146112055760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f7420746865206f70657261746f720000000000006044820152606401610546565b600080611211836117a2565b915091508060011461125e5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481bdb99481a5b9c1d5d08185b1b1bddd95960521b6044820152606401610546565b60006113096112706020860186612dc4565b61127d604087018761300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112bf92505050606088018861300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113049250505060c0890160a08a01612dc4565b612344565b6000818152602760205260409020549091501561135d5760405162461bcd60e51b81526020600482015260126024820152711d1e125908185b1c9958591e481cdc195b9d60721b6044820152606401610546565b60226000815461136c90613063565b9182905550600082815260276020526040812091909155611393610b13608087018761300a565b905060006113a082611ac5565b915050806003146113eb5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207769746e657373206974656d7360581b6044820152606401610546565b60006113f8836001611f01565b905060006023805461140990612e6d565b91506000905061141a838284611cd6565b905061142d8160238054610b9190612e6d565b6114725760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590819195c1bdcda5d081cd8dc9a5c1d60521b6044820152606401610546565b60006114a66024805461148490612e6d565b86516114909250613050565b6024805461149d90612e6d565b87929150611cd6565b90506114b98160248054610b9190612e6d565b6114fd5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840e6c6e4d2e0e840e6eaccccd2f605b1b6044820152606401610546565b600061150885612374565b602254604080518d8152602081018c90526001600160a01b038416818301524260608201526080810192909252519192507fa82453ca34121b3ecb910d957824e27c5dc6465315949facd15fb72886490058919081900360a00190a16021546040516000916001600160a01b038416918381818185875af1925050503d80600081146115b0576040519150601f19603f3d011682016040523d82523d6000602084013e6115b5565b606091505b50509050806115f85760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610546565b505050505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c006110ed565b611637612169565b60008190036116585760405162461bcd60e51b815260040161054690612e20565b6025611665828483612ef0565b507f8578c80bdea3ff51431011ed88db9cb415de2cf64f9ed5e7137288268cbdeb2c828260405161169792919061307c565b60405180910390a15050565b6116ab612169565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556116ef6110c8565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b611730612169565b60008390036117515760405162461bcd60e51b815260040161054690612e20565b602361175e848683612ef0565b50602461176c828483612ef0565b507f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc848484846040516110ad9493929190612fd8565b600080806118026117b66020860186612dc4565b6117c66040870160208801613090565b6117d3604088018861300a565b6117e060608a018a61300a565b6117ed60808c018c61300a565b6117fd60c08e0160a08f01612dc4565b6123aa565b905061184e611814604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123de92505050565b61189a5760405162461bcd60e51b815260206004820152601d60248201527f56696e206973206e6f742070726f7065726c7920666f726d61747465640000006044820152606401610546565b6118e46118aa606086018661300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061248292505050565b6119305760405162461bcd60e51b815260206004820152601e60248201527f566f7574206973206e6f742070726f7065726c7920666f726d617474656400006044820152606401610546565b60006119426109cc604087018761300a565b91506119929050611956608087018761300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250612519915050565b6119e85760405162461bcd60e51b815260206004820152602160248201527f5769746e657373206973206e6f742070726f7065726c7920666f726d617474656044820152601960fa1b6064820152608401610546565b6001603160981b01634ffd344a60e087013584611a0860c08a018a61300a565b8a61010001356040518663ffffffff1660e01b8152600401611a2e9594939291906130ba565b602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906130ec565b611abb5760405162461bcd60e51b815260206004820152601b60248201527f5472616e73616374696f6e206973206e6f7420696e20626c6f636b00000000006044820152606401610546565b9094909350915050565b600080611ad383600061258e565b91509150915091565b6060600080611aea85611ac5565b909250905060018201611b0f5760405162461bcd60e51b81526004016105469061310e565b808410611b525760405162461bcd60e51b81526020600482015260116024820152702b37baba103932b0b21037bb32b9393ab760791b6044820152606401610546565b600080611b60846001612ddf565b905060005b86811015611bde57611b778883612730565b92506000198303611bca5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611bd48383612ddf565b9150600101611b65565b50611be98782612730565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611c47878284611cd6565b9450505050505b92915050565b606081600981518110611c6957611c69612dae565b6020910101516001600160f81b031916603560f91b14611c9757505060408051602081019091526000815290565b600082600a81518110611cac57611cac612dae565b01602001516001600160f81b031981169150611ccf908490600b9060f81c611cd6565b9392505050565b606081600003611cf55750604080516020810190915260008152611ccf565b6000611d018385612ddf565b90508381118015611d13575080855110155b611d555760405162461bcd60e51b8152602060048201526013602482015272536c696365206f7574206f6620626f756e647360681b6044820152606401610546565b604051915082604083010160405282825283850182038460208701018481015b80821015611d8e57815183830152602082019150611d75565b505050509392505050565b60008151600003611dac57506000919050565b81516020811115611e0a5760405162461bcd60e51b815260206004820152602260248201527f42797465732063616e6e6f74206265206d6f7265207468616e20333220627974604482015261657360f01b6064820152608401610546565b60209283015192036008029190911c919050565b606060008060005b84811015611e9757611e388683612794565b92506000198303611e835760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611e8d8383612ddf565b9150600101611e26565b50611ea28582612794565b91506000198203611eed5760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611ef8858284611cd6565b95945050505050565b6060600080611f0f85611ac5565b909250905060018201611f345760405162461bcd60e51b81526004016105469061310e565b808410611f765760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b600080611f84846001612ddf565b905060005b8681101561200f57611f9b888361258e565b909550925060018301611fe55760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b82611ff1866001612ddf565b611ffb9190612ddf565b6120059083612ddf565b9150600101611f89565b5061201a878261258e565b9094509150600182016120645760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b611c47816120728685612ddf565b61207d906001612ddf565b899190611cd6565b8151815160009190811461209d576000915050611c4e565b60206000805b8383116120d357505084810151848201516020909201918082146120ce576000945050505050611c4e565b6120a3565b60006120e0602085613050565b90505b8481101561214e578681815181106120fd576120fd612dae565b602001015160f81c60f81b6001600160f81b03191688828151811061212457612124612dae565b01602001516001600160f81b0319161461214657600095505050505050611c4e565b6001016120e3565b506001979650505050505050565b6000611c4e826001612ddf565b336121726110c8565b6001600160a01b031614610d775760405163118cdaa760e01b8152336004820152602401610546565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556121d382612836565b5050565b60606000806121e585611ac5565b90925090506001820161220a5760405162461bcd60e51b81526004016105469061310e565b80841061224c5760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b60008061225a846001612ddf565b905060005b868110156122d25761227188836128a7565b925060001983036122be5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6122c88383612ddf565b915060010161225f565b506122dd87826128a7565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6020810151600090611c4e565b6000611c4e8260206128f0565b6000611ef8858585856040516020016123609493929190613150565b6040516020818303038152906040526128ff565b6000806023805461238490612e6d565b91506000905061239684836014611cd6565b61239f906131ad565b60601c949350505050565b60006123d08a8a8a8a8a8a8a8a8a60405160200161236099989796959493929190613200565b9a9950505050505050505050565b60008060006123ec84611ac5565b90925090508015806123ff575060001982145b1561240e575060009392505050565b600061241b836001612ddf565b905060005b82811015612475578551821061243c5750600095945050505050565b600061244887846128a7565b90506000198103612460575060009695505050505050565b61246a8184612ddf565b925050600101612420565b5093519093149392505050565b600080600061249084611ac5565b90925090508015806124a3575060001982145b156124b2575060009392505050565b60006124bf836001612ddf565b905060005b8281101561247557855182106124e05750600095945050505050565b60006124ec8784612730565b90506000198103612504575060009695505050505050565b61250e8184612ddf565b9250506001016124c4565b60008160000361252b57506000611c4e565b6000805b83811015612582578451821061254a57600092505050611c4e565b60006125568684612794565b9050600019810361256d5760009350505050611c4e565b6125778184612ddf565b92505060010161252f565b50835114905092915050565b600080600061259d8585612926565b90508060ff166000036125d25760008585815181106125be576125be612dae565b016020015190935060f81c91506127299050565b836125de826001613269565b60ff166125eb9190612ddf565b855110156126025760001960009250925050612729565b60008160ff166002036126465761263b612627612620876001612ddf565b88906128f0565b62ffff0060e882901c1660f89190911c1790565b61ffff16905061271f565b8160ff1660040361269557612688612662612620876001612ddf565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b63ffffffff16905061271f565b8160ff1660080361271f576127136126b1612620876001612ddf565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b6001600160401b031666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b6001600160401b031690505b60ff909116925090505b9250929050565b600061273d826009612ddf565b8351101561274e5750600019611c4e565b60008061276585612760866008612ddf565b61258e565b90925090506001820161277e5760001992505050611c4e565b8061278a836009612ddf565b611ef89190612ddf565b60008060006127a3858561258e565b9092509050600182016127bc5760001992505050611c4e565b6000806127ca846001612ddf565b905060005b8381101561282b576127e588612760848a612ddf565b9095509250600183016128015760001995505050505050611c4e565b8261280d866001612ddf565b6128179190612ddf565b6128219083612ddf565b91506001016127cf565b509695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60008060006128b685856129ac565b9092509050600182016128cf5760001992505050611c4e565b806128db836025612ddf565b6128e59190612ddf565b611ef8906004612ddf565b6000611ccf8383016020015190565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b600082828151811061293a5761293a612dae565b016020015160f81c60ff0361295157506008611c4e565b82828151811061296357612963612dae565b016020015160f81c60fe0361297a57506004611c4e565b82828151811061298c5761298c612dae565b016020015160f81c60fd036129a357506002611c4e565b50600092915050565b6000806129ba836025612ddf565b845110156129cf575060001990506000612729565b6000806129e186612760876024612ddf565b9097909650945050505050565b600060208284031215612a0057600080fd5b5035919050565b60008083601f840112612a1957600080fd5b5081356001600160401b03811115612a3057600080fd5b6020830191508360208260051b850101111561272957600080fd5b60008060008060408587031215612a6157600080fd5b84356001600160401b03811115612a7757600080fd5b612a8387828801612a07565b90955093505060208501356001600160401b03811115612aa257600080fd5b612aae87828801612a07565b95989497509550505050565b60008083601f840112612acc57600080fd5b5081356001600160401b03811115612ae357600080fd5b60208301915083602082850101111561272957600080fd5b600080600080600060608688031215612b1357600080fd5b85356001600160401b03811115612b2957600080fd5b612b3588828901612aba565b90965094505060208601356001600160401b03811115612b5457600080fd5b612b6088828901612aba565b96999598509660400135949350505050565b60005b83811015612b8d578181015183820152602001612b75565b50506000910152565b6020815260008251806020840152612bb5816040850160208701612b72565b601f01601f19169190910160400192915050565b60006101208284031215612bdc57600080fd5b50919050565b600060208284031215612bf457600080fd5b81356001600160401b03811115612c0a57600080fd5b612c1684828501612bc9565b949350505050565b600080600060608486031215612c3357600080fd5b83356001600160401b03811115612c4957600080fd5b612c5586828701612bc9565b9660208601359650604090950135949350505050565b80356001600160e01b031981168114612c8357600080fd5b919050565b60008060408385031215612c9b57600080fd5b82359150612cab60208401612c6b565b90509250929050565b600060208284031215612cc657600080fd5b81356001600160a01b0381168114611ccf57600080fd5b60008060208385031215612cf057600080fd5b82356001600160401b03811115612d0657600080fd5b612d1285828601612aba565b90969095509350505050565b60008060008060408587031215612d3457600080fd5b84356001600160401b03811115612d4a57600080fd5b612d5687828801612aba565b90955093505060208501356001600160401b03811115612d7557600080fd5b612aae87828801612aba565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417611c4e57611c4e612d81565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612dd657600080fd5b611ccf82612c6b565b80820180821115611c4e57611c4e612d81565b835181526020938401516001600160e01b031916938101939093526040830191909152606082015260800190565b6020808252601e908201527f4465706f736974207363726970742063616e6e6f7420626520656d7074790000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680612e8157607f821691505b602082108103612bdc57634e487b7160e01b600052602260045260246000fd5b601f821115612eeb57806000526020600020601f840160051c81016020851015612ec85750805b601f840160051c820191505b81811015612ee85760008155600101612ed4565b50505b505050565b6001600160401b03831115612f0757612f07612e57565b612f1b83612f158354612e6d565b83612ea1565b6000601f841160018114612f4f5760008515612f375750838201355b600019600387901b1c1916600186901b178355612ee8565b600083815260209020601f19861690835b82811015612f805786850135825560209485019460019092019101612f60565b5086821015612f9d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000612fec604083018688612faf565b8281036020840152612fff818587612faf565b979650505050505050565b6000808335601e1984360301811261302157600080fd5b8301803591506001600160401b0382111561303b57600080fd5b60200191503681900382131561272957600080fd5b81810381811115611c4e57611c4e612d81565b60006001820161307557613075612d81565b5060010190565b602081526000612c16602083018486612faf565b6000602082840312156130a257600080fd5b81356001600160f01b031981168114611ccf57600080fd5b8581528460208201526080604082015260006130da608083018587612faf565b90508260608301529695505050505050565b6000602082840312156130fe57600080fd5b81518015158114611ccf57600080fd5b60208082526022908201527f52656164206f76657272756e20647572696e6720566172496e742070617273696040820152616e6760f01b606082015260800190565b6001600160e01b0319851681528351600090613173816004850160208901612b72565b84519083019061318a816004840160208901612b72565b6001600160e01b0319949094169301600481019390935250506008019392505050565b805160208201516bffffffffffffffffffffffff198116919060148210156131f9576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b6001600160e01b03198a1681526001600160f01b031989166004820152868860068301376000878201600681016000815287898237506000908701600601908152848682376001600160e01b031993909316929093019182525060040198975050505050505050565b60ff8181168382160190811115611c4e57611c4e612d8156" + }, + { + "address": "0x3200000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3aeeb871f83c85e68ffd1868bef3425ed6649d39", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x66f68692c03eb9c0656d676f2f4bd13eba40d1b7", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0x9fcdf8f60d3009656e50bf805cd53c7335b284fb", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xaafb7442f7f00b64057c2e9eae2815bb63ee0ece", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xc2f8eed77da1583f7bae0a3125dc7bc426002dde", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xd44821f906e3909b8ae944f7060551c33b922cc9", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xe756fdf89367ef428b48bca2d272ec8ecec053fd", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + }, + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "balance": "0xffffffffffffffffffffffffffffff", + "code": "0x" + } + ], + "chain_id": 5655, + "limit_contract_code_size": null, + "spec": { + "0": "SHANGHAI" + }, + "coinbase": "0x3100000000000000000000000000000000000005", + "starting_base_fee": 1000000000, + "block_gas_limit": 30000000, + "base_fee_params": { + "max_change_denominator": 8, + "elasticity_multiplier": 2 + }, + "difficulty": 0, + "extra_data": "0x", + "timestamp": 0, + "nonce": 0 +} \ No newline at end of file diff --git a/resources/genesis/mock/soft_confirmation_rule_enforcer.json b/resources/genesis/mock/soft_confirmation_rule_enforcer.json new file mode 100644 index 0000000..f9faf7a --- /dev/null +++ b/resources/genesis/mock/soft_confirmation_rule_enforcer.json @@ -0,0 +1,4 @@ +{ + "max_l2_blocks_per_l1": 86400, + "authority": "sov1l6n2cku82yfqld30lanm2nfw43n2auc8clw7r5u5m6s7p8jrm4zqrr8r94" +} \ No newline at end of file diff --git a/resources/genesis/testnet/accounts.json b/resources/genesis/testnet/accounts.json new file mode 100644 index 0000000..f65b078 --- /dev/null +++ b/resources/genesis/testnet/accounts.json @@ -0,0 +1,3 @@ +{ + "pub_keys": [] +} diff --git a/resources/genesis/testnet/evm.json b/resources/genesis/testnet/evm.json new file mode 100644 index 0000000..81731ae --- /dev/null +++ b/resources/genesis/testnet/evm.json @@ -0,0 +1,108 @@ +{ + "data": [ + { + "address": "0x3100000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000001", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000002", + "balance": "0x115eec47f6cf7e35000000", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000002", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x0000000000000000000000007f2108e9b2f0a1ea8765e16adc17fb02f3cd4972", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000006897742d001ddbbfea824a447cf7873f490c3410", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000003", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000576843e07fa5ebd45d72c90fee0a614b0b6a8e73", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000006897742d001ddbbfea824a447cf7873f490c3410", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000004", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000576843e07fa5ebd45d72c90fee0a614b0b6a8e73", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x3100000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f610169565b6001600160a01b0316330361015f5760606001600160e01b0319600035166364d3180d60e11b810161005a5761005361019c565b9150610157565b63587086bd60e11b6001600160e01b031982160161007a576100536101f3565b63070d7c6960e41b6001600160e01b031982160161009a57610053610239565b621eb96f60e61b6001600160e01b03198216016100b95761005361026a565b63a39f25e560e01b6001600160e01b03198216016100d9576100536102aa565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b6101676102be565b565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101a66102ce565b60006101b53660048184610683565b8101906101c291906106c9565b90506101df816040518060200160405280600081525060006102d9565b505060408051602081019091526000815290565b60606000806102053660048184610683565b81019061021291906106fa565b91509150610222828260016102d9565b604051806020016040528060008152509250505090565b60606102436102ce565b60006102523660048184610683565b81019061025f91906106c9565b90506101df81610305565b60606102746102ce565b600061027e610169565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b60606102b46102ce565b600061027e61035c565b6101676102c961035c565b61036b565b341561016757600080fd5b6102e28361038f565b6000825111806102ef5750805b15610300576102fe83836103cf565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61032e610169565b604080516001600160a01b03928316815291841660208301520160405180910390a1610359816103fb565b50565b60006103666104a4565b905090565b3660008037600080366000845af43d6000803e80801561038a573d6000f35b3d6000fd5b610398816104cc565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606103f4838360405180606001604052806027815260200161083860279139610560565b9392505050565b6001600160a01b0381166104605760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161014e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61018d565b6001600160a01b0381163b6105395760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161014e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610483565b6060600080856001600160a01b03168560405161057d91906107e8565b600060405180830381855af49150503d80600081146105b8576040519150601f19603f3d011682016040523d82523d6000602084013e6105bd565b606091505b50915091506105ce868383876105d8565b9695505050505050565b60608315610647578251600003610640576001600160a01b0385163b6106405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161014e565b5081610651565b6106518383610659565b949350505050565b8151156106695781518083602001fd5b8060405162461bcd60e51b815260040161014e9190610804565b6000808585111561069357600080fd5b838611156106a057600080fd5b5050820193919092039150565b80356001600160a01b03811681146106c457600080fd5b919050565b6000602082840312156106db57600080fd5b6103f4826106ad565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561070d57600080fd5b610716836106ad565b9150602083013567ffffffffffffffff81111561073257600080fd5b8301601f8101851361074357600080fd5b803567ffffffffffffffff81111561075d5761075d6106e4565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561078c5761078c6106e4565b6040528181528282016020018710156107a457600080fd5b816020840160208301376000602083830101528093505050509250929050565b60005b838110156107df5781810151838201526020016107c7565b50506000910152565b600082516107fa8184602087016107c4565b9190910192915050565b60208152600082518060208401526108238160408501602087016107c4565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000006897742d001ddbbfea824a447cf7873f490c3410", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0x00000000000000000000000000000000000000000000000006f05b59d3b20000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000003200000000000000000000000000000000000005", + "0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300": "0x000000000000000000000000576843e07fa5ebd45d72c90fee0a614b0b6a8e73", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x00000000000000000000000031ffffffffffffffffffffffffffffffffffffff" + } + }, + { + "address": "0x31ffffffffffffffffffffffffffffffffffffff", + "balance": "0x0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105ea565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c99086908690600401610607565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff81111561055857600080fd5b8401601f8101861361056957600080fd5b803567ffffffffffffffff811115610583576105836104f6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156105b2576105b26104f6565b6040528181528282016020018810156105ca57600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000602082840312156105fc57600080fd5b81516104b681610484565b60018060a01b0383168152604060208201526000825180604084015260005b818110156106435760208186018101516060868401015201610626565b506000606082850101526060601f19601f830116840101915050939250505056", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x00000000000000000000000084e767448f9b4a37a3df6f7b063f00151226307f" + } + }, + { + "address": "0x3200000000000000000000000000000000000001", + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806357e871e71161007157806357e871e71461014c57806361b207e214610155578063a91d8b3d14610182578063d269a03e146101a2578063d761753e146101b5578063ee82ac5e146101e857600080fd5b80630466efc4146100ae5780630e27bc11146100e15780631f578333146100f657806334cdf78d146101095780634ffd344a14610129575b600080fd5b6100ce6100bc366004610599565b60009081526002602052604090205490565b6040519081526020015b60405180910390f35b6100f46100ef3660046105b2565b610208565b005b6100f4610104366004610599565b610331565b6100ce610117366004610599565b60016020526000908152604090205481565b61013c61013736600461061d565b6103df565b60405190151581526020016100d8565b6100ce60005481565b6100ce610163366004610599565b6000908152600160209081526040808320548352600290915290205490565b6100ce610190366004610599565b60026020526000908152604090205481565b61013c6101b036600461061d565b610405565b6101d073deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b6040516001600160a01b0390911681526020016100d8565b6100ce6101f6366004610599565b60009081526001602052604090205490565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146102705760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c65720060448201526064015b60405180910390fd5b60008054908190036102b65760405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b9a5d1a585b1a5e9959608a1b6044820152606401610267565b60008181526001602081905260409091208490556102d5908290610678565b6000908155838152600260209081526040808320859055915482519081529081018590529081018390527f32eff959e2e8d1609edc4b39ccf75900aa6c1da5719f8432752963fdf008234f9060600160405180910390a1505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146103945760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610267565b600054156103da5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610267565b600055565b6000858152600160205260408120546103fb9086868686610410565b9695505050505050565b60006103fb86868686865b6000858152600260209081526040808320548151601f870184900484028101840190925285825291610463918891849190899089908190840183828082843760009201919091525089925061046e915050565b979650505050505050565b6000838514801561047d575081155b801561048857508251155b15610495575060016104a4565b6104a1858486856104ac565b90505b949350505050565b6000602084516104bc9190610699565b156104c9575060006104a4565b83516000036104da575060006104a4565b818560005b8651811015610549576104f3600284610699565b6001036105175761051061050a8883016020015190565b83610556565b9150610530565b61052d826105288984016020015190565b610556565b91505b60019290921c91610542602082610678565b90506104df565b5090931495945050505050565b6000610562838361056b565b90505b92915050565b60008260005281602052602060006040600060025afa50602060006020600060025afa505060005192915050565b6000602082840312156105ab57600080fd5b5035919050565b600080604083850312156105c557600080fd5b50508035926020909101359150565b60008083601f8401126105e657600080fd5b50813567ffffffffffffffff8111156105fe57600080fd5b60208301915083602082850101111561061657600080fd5b9250929050565b60008060008060006080868803121561063557600080fd5b8535945060208601359350604086013567ffffffffffffffff81111561065a57600080fd5b610666888289016105d4565b96999598509660600135949350505050565b8082018082111561056557634e487b7160e01b600052601160045260246000fd5b6000826106b657634e487b7160e01b600052601260045260246000fd5b50069056" + }, + { + "address": "0x3200000000000000000000000000000000000002", + "balance": "0x0", + "code": "0x60806040526004361061019c5760003560e01c80638786dba7116100ec578063d761753e1161008a578063e613ae0011610064578063e613ae001461048e578063f119a9bd146104a9578063f2fde38b146104c9578063f8e655d2146104e957600080fd5b8063d761753e14610431578063dd95c7c614610459578063e30c39781461047957600080fd5b8063a41c5cf3116100c6578063a41c5cf3146103af578063b3ab15fb146103c4578063bafa9eb2146103e4578063c045577b1461040457600080fd5b80638786dba71461037257806387f8bf56146103855780638da5cb5b1461039a57600080fd5b8063570ca73511610159578063715018a611610133578063715018a61461031357806374ab4a8314610328578063781952a81461034857806379ba50971461035d57600080fd5b8063570ca735146102945780635d3e3176146102d15780635e3cc740146102f357600080fd5b806311e53a01146101a1578063158ef93e146101e1578063198546231461020b5780634126013714610220578063419759f514610240578063471ba1e314610256575b600080fd5b3480156101ad57600080fd5b506101ce6101bc3660046129ee565b60276020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101ed57600080fd5b506000546101fb9060ff1681565b60405190151581526020016101d8565b61021e610219366004612a4b565b610509565b005b34801561022c57600080fd5b5061021e61023b366004612afb565b6106e2565b34801561024c57600080fd5b506101ce60215481565b34801561026257600080fd5b506102766102713660046129ee565b6108ef565b604080519283526001600160e01b03199091166020830152016101d8565b3480156102a057600080fd5b506000546102b99061010090046001600160a01b031681565b6040516001600160a01b0390911681526020016101d8565b3480156102dd57600080fd5b506102e6610920565b6040516101d89190612b96565b3480156102ff57600080fd5b5061021e61030e366004612be2565b6109ae565b34801561031f57600080fd5b5061021e610d65565b34801561033457600080fd5b5061021e610343366004612c1e565b610d79565b34801561035457600080fd5b506026546101ce565b34801561036957600080fd5b5061021e610f4c565b61021e610380366004612c88565b610f94565b34801561039157600080fd5b506102e66110bb565b3480156103a657600080fd5b506102b96110c8565b3480156103bb57600080fd5b506102e66110fd565b3480156103d057600080fd5b5061021e6103df366004612cb4565b61110a565b3480156103f057600080fd5b506101fb6103ff3660046129ee565b61117b565b34801561041057600080fd5b506101ce61041f3660046129ee565b60286020526000908152604090205481565b34801561043d57600080fd5b506102b973deaddeaddeaddeaddeaddeaddeaddeaddeaddead81565b34801561046557600080fd5b5061021e610474366004612be2565b6111a6565b34801561048557600080fd5b506102b9611606565b34801561049a57600080fd5b506102b96001603160981b0181565b3480156104b557600080fd5b5061021e6104c4366004612cdd565b61162f565b3480156104d557600080fd5b5061021e6104e4366004612cb4565b6116a3565b3480156104f557600080fd5b5061021e610504366004612d1e565b611728565b82811461054f5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b60448201526064015b60405180910390fd5b60215461055d908490612d97565b34146105a55760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b60265460005b848110156106da57600060405180604001604052808888858181106105d2576105d2612dae565b9050602002013581526020018686858181106105f0576105f0612dae565b90506020020160208101906106059190612dc4565b6001600160e01b03191690526026805460018101825560009190915281517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a359460029092029182015560208201517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909101805463ffffffff191660e09290921c91909117905590507f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada816106b98486612ddf565b426040516106c993929190612df2565b60405180910390a1506001016105ab565b505050505050565b3373deaddeaddeaddeaddeaddeaddeaddeaddeaddead146107455760405162461bcd60e51b815260206004820152601f60248201527f63616c6c6572206973206e6f74207468652073797374656d2063616c6c6572006044820152606401610546565b60005460ff16156107985760405162461bcd60e51b815260206004820152601f60248201527f436f6e747261637420697320616c726561647920696e697469616c697a6564006044820152606401610546565b806000036107e85760405162461bcd60e51b815260206004820152601a60248201527f4465706f73697420616d6f756e742063616e6e6f7420626520300000000000006044820152606401610546565b60008490036108095760405162461bcd60e51b815260040161054690612e20565b6000805460ff191660011790556023610823858783612ef0565b506024610831838583612ef0565b50602181905560008054610100600160a81b03191674deaddeaddeaddeaddeaddeaddeaddeaddeaddead001781556040805191825273deaddeaddeaddeaddeaddeaddeaddeaddeaddead60208301527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a17f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc858585856040516108e09493929190612fd8565b60405180910390a15050505050565b602681815481106108ff57600080fd5b60009182526020909120600290910201805460019091015490915060e01b82565b6025805461092d90612e6d565b80601f016020809104026020016040519081016040528092919081815260200182805461095990612e6d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b505050505081565b6109b7816117a2565b5060009050610a066109cc606084018461300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ac592505050565b915060009050610a63610a1c606085018561300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a5e925060019150869050613050565b611adc565b90506000610a7082611c54565b90506000610a88610a8383836020611cd6565b611d99565b90506000610aa9610a836020808651610aa19190613050565b869190611cd6565b600083815260276020526040812054919250819003610b015760405162461bcd60e51b815260206004820152601460248201527311195c1bdcda5d08191bc81b9bdd08195e1a5cdd60621b6044820152606401610546565b6000610b4d610b1360808a018a61300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250611e1e915050565b90506000610b5c826001611f01565b9050600060258054610b6d90612e6d565b915060009050610b7e838284611cd6565b9050610c148160258054610b9190612e6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90612e6d565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050612085565b610c605760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736c6173684f7254616b65207363726970740000000000006044820152606401610546565b6000602881610c70600189613050565b815260200190815260200160002054905060008160001480610c9a5750610c968861215c565b8214155b905080610ce95760405162461bcd60e51b815260206004820152601960248201527f4f70657261746f72206973206e6f74206d616c6963696f7573000000000000006044820152606401610546565b600180896103e88110610cfe57610cfe612dae565b602091828204019190066101000a81548160ff0219169083151502179055507ff918cdaebea74c5a8c3b02d7404c162f507551b158202cedcba9b6a74eabdff288604051610d4e91815260200190565b60405180910390a150505050505050505050505050565b610d6d612169565b610d77600061219b565b565b610d82836117a2565b5060009050610dd3610d97604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792506121d7915050565b90506000610de08261232a565b90506000610ded83612337565b9050600060268581548110610e0457610e04612dae565b60009182526020918290206040805180820190915260029290920201805480835260019091015460e01b6001600160e01b03191692820192909252915083148015610e665750816001600160e01b03191681602001516001600160e01b031916145b610ea65760405162461bcd60e51b81526020600482015260116024820152706e6f74206d61746368696e67205554584f60781b6044820152606401610546565b6000610eb86109cc60608a018a61300a565b915060009050610ece610a1c60608b018b61300a565b90506000610edb82611c54565b90506000610ee882611d99565b9050610ef38161215c565b60008a8152602860209081526040918290209290925580518b81529182018390527feedf47c2f61b040827944fd45e44ef6d742354b34e1af7dd99a56f444ec79347910160405180910390a15050505050505050505050565b3380610f56611606565b6001600160a01b031614610f885760405163118cdaa760e01b81526001600160a01b0382166004820152602401610546565b610f918161219b565b50565b6021543414610fdf5760405162461bcd60e51b8152602060048201526017602482015276125b9d985b1a59081dda5d1a191c985dc8185b5bdd5b9d604a1b6044820152606401610546565b6040805180820182528381526001600160e01b03198316602082019081526026805460018101825560009190915282517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3594600283029081019190915591517f744a2cf8fd7008e3d53b67916e73460df9fa5214e3ef23dd4259ca09493a3595909201805463ffffffff191660e09390931c9290921790915591519091907f3311a04a346a103ac115cca33028a2bc82f1964805860d0d3fc84a2772496ada906110ad90849084904290612df2565b60405180910390a150505050565b6024805461092d90612e6d565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6023805461092d90612e6d565b611112612169565b60008054610100600160a81b0319166101006001600160a01b038481168281029390931793849055604080519290940416815260208101919091527ffbe5b6cbafb274f445d7fed869dc77a838d8243a22c460de156560e8857cad03910160405180910390a150565b6001816103e8811061118c57600080fd5b60209182820401919006915054906101000a900460ff1681565b60005461010090046001600160a01b031633146112055760405162461bcd60e51b815260206004820152601a60248201527f63616c6c6572206973206e6f7420746865206f70657261746f720000000000006044820152606401610546565b600080611211836117a2565b915091508060011461125e5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481bdb99481a5b9c1d5d08185b1b1bddd95960521b6044820152606401610546565b60006113096112706020860186612dc4565b61127d604087018761300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112bf92505050606088018861300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113049250505060c0890160a08a01612dc4565b612344565b6000818152602760205260409020549091501561135d5760405162461bcd60e51b81526020600482015260126024820152711d1e125908185b1c9958591e481cdc195b9d60721b6044820152606401610546565b60226000815461136c90613063565b9182905550600082815260276020526040812091909155611393610b13608087018761300a565b905060006113a082611ac5565b915050806003146113eb5760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964207769746e657373206974656d7360581b6044820152606401610546565b60006113f8836001611f01565b905060006023805461140990612e6d565b91506000905061141a838284611cd6565b905061142d8160238054610b9190612e6d565b6114725760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a590819195c1bdcda5d081cd8dc9a5c1d60521b6044820152606401610546565b60006114a66024805461148490612e6d565b86516114909250613050565b6024805461149d90612e6d565b87929150611cd6565b90506114b98160248054610b9190612e6d565b6114fd5760405162461bcd60e51b8152602060048201526015602482015274092dcecc2d8d2c840e6c6e4d2e0e840e6eaccccd2f605b1b6044820152606401610546565b600061150885612374565b602254604080518d8152602081018c90526001600160a01b038416818301524260608201526080810192909252519192507fa82453ca34121b3ecb910d957824e27c5dc6465315949facd15fb72886490058919081900360a00190a16021546040516000916001600160a01b038416918381818185875af1925050503d80600081146115b0576040519150601f19603f3d011682016040523d82523d6000602084013e6115b5565b606091505b50509050806115f85760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610546565b505050505050505050505050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c006110ed565b611637612169565b60008190036116585760405162461bcd60e51b815260040161054690612e20565b6025611665828483612ef0565b507f8578c80bdea3ff51431011ed88db9cb415de2cf64f9ed5e7137288268cbdeb2c828260405161169792919061307c565b60405180910390a15050565b6116ab612169565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556116ef6110c8565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b611730612169565b60008390036117515760405162461bcd60e51b815260040161054690612e20565b602361175e848683612ef0565b50602461176c828483612ef0565b507f80bd1fdfe157286ce420ee763f91748455b249605748e5df12dad9844402bafc848484846040516110ad9493929190612fd8565b600080806118026117b66020860186612dc4565b6117c66040870160208801613090565b6117d3604088018861300a565b6117e060608a018a61300a565b6117ed60808c018c61300a565b6117fd60c08e0160a08f01612dc4565b6123aa565b905061184e611814604086018661300a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123de92505050565b61189a5760405162461bcd60e51b815260206004820152601d60248201527f56696e206973206e6f742070726f7065726c7920666f726d61747465640000006044820152606401610546565b6118e46118aa606086018661300a565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061248292505050565b6119305760405162461bcd60e51b815260206004820152601e60248201527f566f7574206973206e6f742070726f7065726c7920666f726d617474656400006044820152606401610546565b60006119426109cc604087018761300a565b91506119929050611956608087018761300a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250859250612519915050565b6119e85760405162461bcd60e51b815260206004820152602160248201527f5769746e657373206973206e6f742070726f7065726c7920666f726d617474656044820152601960fa1b6064820152608401610546565b6001603160981b01634ffd344a60e087013584611a0860c08a018a61300a565b8a61010001356040518663ffffffff1660e01b8152600401611a2e9594939291906130ba565b602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f91906130ec565b611abb5760405162461bcd60e51b815260206004820152601b60248201527f5472616e73616374696f6e206973206e6f7420696e20626c6f636b00000000006044820152606401610546565b9094909350915050565b600080611ad383600061258e565b91509150915091565b6060600080611aea85611ac5565b909250905060018201611b0f5760405162461bcd60e51b81526004016105469061310e565b808410611b525760405162461bcd60e51b81526020600482015260116024820152702b37baba103932b0b21037bb32b9393ab760791b6044820152606401610546565b600080611b60846001612ddf565b905060005b86811015611bde57611b778883612730565b92506000198303611bca5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611bd48383612ddf565b9150600101611b65565b50611be98782612730565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601a60248201527f42616420566172496e7420696e207363726970745075626b65790000000000006044820152606401610546565b611c47878284611cd6565b9450505050505b92915050565b606081600981518110611c6957611c69612dae565b6020910101516001600160f81b031916603560f91b14611c9757505060408051602081019091526000815290565b600082600a81518110611cac57611cac612dae565b01602001516001600160f81b031981169150611ccf908490600b9060f81c611cd6565b9392505050565b606081600003611cf55750604080516020810190915260008152611ccf565b6000611d018385612ddf565b90508381118015611d13575080855110155b611d555760405162461bcd60e51b8152602060048201526013602482015272536c696365206f7574206f6620626f756e647360681b6044820152606401610546565b604051915082604083010160405282825283850182038460208701018481015b80821015611d8e57815183830152602082019150611d75565b505050509392505050565b60008151600003611dac57506000919050565b81516020811115611e0a5760405162461bcd60e51b815260206004820152602260248201527f42797465732063616e6e6f74206265206d6f7265207468616e20333220627974604482015261657360f01b6064820152608401610546565b60209283015192036008029190911c919050565b606060008060005b84811015611e9757611e388683612794565b92506000198303611e835760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611e8d8383612ddf565b9150600101611e26565b50611ea28582612794565b91506000198203611eed5760405162461bcd60e51b815260206004820152601560248201527442616420566172496e7420696e207769746e65737360581b6044820152606401610546565b611ef8858284611cd6565b95945050505050565b6060600080611f0f85611ac5565b909250905060018201611f345760405162461bcd60e51b81526004016105469061310e565b808410611f765760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b600080611f84846001612ddf565b905060005b8681101561200f57611f9b888361258e565b909550925060018301611fe55760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b82611ff1866001612ddf565b611ffb9190612ddf565b6120059083612ddf565b9150600101611f89565b5061201a878261258e565b9094509150600182016120645760405162461bcd60e51b815260206004820152601260248201527142616420566172496e7420696e206974656d60701b6044820152606401610546565b611c47816120728685612ddf565b61207d906001612ddf565b899190611cd6565b8151815160009190811461209d576000915050611c4e565b60206000805b8383116120d357505084810151848201516020909201918082146120ce576000945050505050611c4e565b6120a3565b60006120e0602085613050565b90505b8481101561214e578681815181106120fd576120fd612dae565b602001015160f81c60f81b6001600160f81b03191688828151811061212457612124612dae565b01602001516001600160f81b0319161461214657600095505050505050611c4e565b6001016120e3565b506001979650505050505050565b6000611c4e826001612ddf565b336121726110c8565b6001600160a01b031614610d775760405163118cdaa760e01b8152336004820152602401610546565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556121d382612836565b5050565b60606000806121e585611ac5565b90925090506001820161220a5760405162461bcd60e51b81526004016105469061310e565b80841061224c5760405162461bcd60e51b815260206004820152601060248201526f2b34b7103932b0b21037bb32b9393ab760811b6044820152606401610546565b60008061225a846001612ddf565b905060005b868110156122d25761227188836128a7565b925060001983036122be5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6122c88383612ddf565b915060010161225f565b506122dd87826128a7565b91506000198203611c3c5760405162461bcd60e51b815260206004820152601760248201527642616420566172496e7420696e2073637269707453696760481b6044820152606401610546565b6020810151600090611c4e565b6000611c4e8260206128f0565b6000611ef8858585856040516020016123609493929190613150565b6040516020818303038152906040526128ff565b6000806023805461238490612e6d565b91506000905061239684836014611cd6565b61239f906131ad565b60601c949350505050565b60006123d08a8a8a8a8a8a8a8a8a60405160200161236099989796959493929190613200565b9a9950505050505050505050565b60008060006123ec84611ac5565b90925090508015806123ff575060001982145b1561240e575060009392505050565b600061241b836001612ddf565b905060005b82811015612475578551821061243c5750600095945050505050565b600061244887846128a7565b90506000198103612460575060009695505050505050565b61246a8184612ddf565b925050600101612420565b5093519093149392505050565b600080600061249084611ac5565b90925090508015806124a3575060001982145b156124b2575060009392505050565b60006124bf836001612ddf565b905060005b8281101561247557855182106124e05750600095945050505050565b60006124ec8784612730565b90506000198103612504575060009695505050505050565b61250e8184612ddf565b9250506001016124c4565b60008160000361252b57506000611c4e565b6000805b83811015612582578451821061254a57600092505050611c4e565b60006125568684612794565b9050600019810361256d5760009350505050611c4e565b6125778184612ddf565b92505060010161252f565b50835114905092915050565b600080600061259d8585612926565b90508060ff166000036125d25760008585815181106125be576125be612dae565b016020015190935060f81c91506127299050565b836125de826001613269565b60ff166125eb9190612ddf565b855110156126025760001960009250925050612729565b60008160ff166002036126465761263b612627612620876001612ddf565b88906128f0565b62ffff0060e882901c1660f89190911c1790565b61ffff16905061271f565b8160ff1660040361269557612688612662612620876001612ddf565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b63ffffffff16905061271f565b8160ff1660080361271f576127136126b1612620876001612ddf565b60c01c64ff000000ff600882811c91821665ff000000ff009390911b92831617601090811b6001600160401b031666ff00ff00ff00ff9290921667ff00ff00ff00ff009093169290921790911c65ffff0000ffff1617602081811c91901b1790565b6001600160401b031690505b60ff909116925090505b9250929050565b600061273d826009612ddf565b8351101561274e5750600019611c4e565b60008061276585612760866008612ddf565b61258e565b90925090506001820161277e5760001992505050611c4e565b8061278a836009612ddf565b611ef89190612ddf565b60008060006127a3858561258e565b9092509050600182016127bc5760001992505050611c4e565b6000806127ca846001612ddf565b905060005b8381101561282b576127e588612760848a612ddf565b9095509250600183016128015760001995505050505050611c4e565b8261280d866001612ddf565b6128179190612ddf565b6128219083612ddf565b91506001016127cf565b509695505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b60008060006128b685856129ac565b9092509050600182016128cf5760001992505050611c4e565b806128db836025612ddf565b6128e59190612ddf565b611ef8906004612ddf565b6000611ccf8383016020015190565b60006020600083516020850160025afa50602060006020600060025afa5050600051919050565b600082828151811061293a5761293a612dae565b016020015160f81c60ff0361295157506008611c4e565b82828151811061296357612963612dae565b016020015160f81c60fe0361297a57506004611c4e565b82828151811061298c5761298c612dae565b016020015160f81c60fd036129a357506002611c4e565b50600092915050565b6000806129ba836025612ddf565b845110156129cf575060001990506000612729565b6000806129e186612760876024612ddf565b9097909650945050505050565b600060208284031215612a0057600080fd5b5035919050565b60008083601f840112612a1957600080fd5b5081356001600160401b03811115612a3057600080fd5b6020830191508360208260051b850101111561272957600080fd5b60008060008060408587031215612a6157600080fd5b84356001600160401b03811115612a7757600080fd5b612a8387828801612a07565b90955093505060208501356001600160401b03811115612aa257600080fd5b612aae87828801612a07565b95989497509550505050565b60008083601f840112612acc57600080fd5b5081356001600160401b03811115612ae357600080fd5b60208301915083602082850101111561272957600080fd5b600080600080600060608688031215612b1357600080fd5b85356001600160401b03811115612b2957600080fd5b612b3588828901612aba565b90965094505060208601356001600160401b03811115612b5457600080fd5b612b6088828901612aba565b96999598509660400135949350505050565b60005b83811015612b8d578181015183820152602001612b75565b50506000910152565b6020815260008251806020840152612bb5816040850160208701612b72565b601f01601f19169190910160400192915050565b60006101208284031215612bdc57600080fd5b50919050565b600060208284031215612bf457600080fd5b81356001600160401b03811115612c0a57600080fd5b612c1684828501612bc9565b949350505050565b600080600060608486031215612c3357600080fd5b83356001600160401b03811115612c4957600080fd5b612c5586828701612bc9565b9660208601359650604090950135949350505050565b80356001600160e01b031981168114612c8357600080fd5b919050565b60008060408385031215612c9b57600080fd5b82359150612cab60208401612c6b565b90509250929050565b600060208284031215612cc657600080fd5b81356001600160a01b0381168114611ccf57600080fd5b60008060208385031215612cf057600080fd5b82356001600160401b03811115612d0657600080fd5b612d1285828601612aba565b90969095509350505050565b60008060008060408587031215612d3457600080fd5b84356001600160401b03811115612d4a57600080fd5b612d5687828801612aba565b90955093505060208501356001600160401b03811115612d7557600080fd5b612aae87828801612aba565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417611c4e57611c4e612d81565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612dd657600080fd5b611ccf82612c6b565b80820180821115611c4e57611c4e612d81565b835181526020938401516001600160e01b031916938101939093526040830191909152606082015260800190565b6020808252601e908201527f4465706f736974207363726970742063616e6e6f7420626520656d7074790000604082015260600190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680612e8157607f821691505b602082108103612bdc57634e487b7160e01b600052602260045260246000fd5b601f821115612eeb57806000526020600020601f840160051c81016020851015612ec85750805b601f840160051c820191505b81811015612ee85760008155600101612ed4565b50505b505050565b6001600160401b03831115612f0757612f07612e57565b612f1b83612f158354612e6d565b83612ea1565b6000601f841160018114612f4f5760008515612f375750838201355b600019600387901b1c1916600186901b178355612ee8565b600083815260209020601f19861690835b82811015612f805786850135825560209485019460019092019101612f60565b5086821015612f9d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000612fec604083018688612faf565b8281036020840152612fff818587612faf565b979650505050505050565b6000808335601e1984360301811261302157600080fd5b8301803591506001600160401b0382111561303b57600080fd5b60200191503681900382131561272957600080fd5b81810381811115611c4e57611c4e612d81565b60006001820161307557613075612d81565b5060010190565b602081526000612c16602083018486612faf565b6000602082840312156130a257600080fd5b81356001600160f01b031981168114611ccf57600080fd5b8581528460208201526080604082015260006130da608083018587612faf565b90508260608301529695505050505050565b6000602082840312156130fe57600080fd5b81518015158114611ccf57600080fd5b60208082526022908201527f52656164206f76657272756e20647572696e6720566172496e742070617273696040820152616e6760f01b606082015260800190565b6001600160e01b0319851681528351600090613173816004850160208901612b72565b84519083019061318a816004840160208901612b72565b6001600160e01b0319949094169301600481019390935250506008019392505050565b805160208201516bffffffffffffffffffffffff198116919060148210156131f9576bffffffffffffffffffffffff196bffffffffffffffffffffffff198360140360031b1b82161692505b5050919050565b6001600160e01b03198a1681526001600160f01b031989166004820152868860068301376000878201600681016000815287898237506000908701600601908152848682376001600160e01b031993909316929093019182525060040198975050505050505050565b60ff8181168382160190811115611c4e57611c4e612d8156" + }, + { + "address": "0x3200000000000000000000000000000000000003", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000004", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + }, + { + "address": "0x3200000000000000000000000000000000000005", + "balance": "0x0", + "code": "0x6080604052600436106100955760003560e01c806379ba50971161005957806379ba50971461014a5780638da5cb5b1461015f578063cc3d272114610174578063e30c397814610198578063f2fde38b146101ad57600080fd5b806335aa134a146100a15780633bbed4a0146100c35780633ccfd60b146100e357806366d003ac146100f8578063715018a61461013557600080fd5b3661009c57005b600080fd5b3480156100ad57600080fd5b506100c16100bc3660046105ad565b6101cd565b005b3480156100cf57600080fd5b506100c16100de3660046105c6565b61021b565b3480156100ef57600080fd5b506100c161027d565b34801561010457600080fd5b50600054610118906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561014157600080fd5b506100c1610392565b34801561015657600080fd5b506100c16103a6565b34801561016b57600080fd5b506101186103eb565b34801561018057600080fd5b5061018a60015481565b60405190815260200161012c565b3480156101a457600080fd5b50610118610420565b3480156101b957600080fd5b506100c16101c83660046105c6565b610449565b6101d56104ce565b600180549082905560408051828152602081018490527f3c4f4d8cd2a65b4b1f4eeaf43669b14ab54e43d4842aa0ac8f0e4f9fe0bf5bf991015b60405180910390a15050565b6102236104ce565b600080546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f62e69886a5df0ba8ffcacbfc1388754e7abd9bde24b036354c561f1acd4e4593910161020f565b6001544710156102fa5760405162461bcd60e51b815260206004820152603e60248201527f5769746864726177616c20616d6f756e74206d7573742062652067726561746560448201527f72207468616e206d696e696d756d20776974686472617720616d6f756e74000060648201526084015b60405180910390fd5b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610347576040519150601f19603f3d011682016040523d82523d6000602084013e61034c565b606091505b505090508061038f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016102f1565b50565b61039a6104ce565b6103a46000610500565b565b33806103b0610420565b6001600160a01b0316146103e25760405163118cdaa760e01b81526001600160a01b03821660048201526024016102f1565b61038f81610500565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610410565b6104516104ce565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556104956103eb565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b336104d76103eb565b6001600160a01b0316146103a45760405163118cdaa760e01b81523360048201526024016102f1565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556105388261053c565b5050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000602082840312156105bf57600080fd5b5035919050565b6000602082840312156105d857600080fd5b81356001600160a01b03811681146105ef57600080fd5b939250505056" + } + ], + "chain_id": 5115, + "limit_contract_code_size": 24576, + "spec": { + "0": "SHANGHAI" + }, + "coinbase": "0x3100000000000000000000000000000000000005", + "starting_base_fee": 1000000000, + "block_gas_limit": 8000000, + "base_fee_params": { + "max_change_denominator": 8, + "elasticity_multiplier": 2 + }, + "difficulty": 0, + "extra_data": "0x", + "timestamp": 0, + "nonce": 0 +} \ No newline at end of file diff --git a/resources/genesis/testnet/soft_confirmation_rule_enforcer.json b/resources/genesis/testnet/soft_confirmation_rule_enforcer.json new file mode 100644 index 0000000..6ab1899 --- /dev/null +++ b/resources/genesis/testnet/soft_confirmation_rule_enforcer.json @@ -0,0 +1,4 @@ +{ + "max_l2_blocks_per_l1": 86400, + "authority": "sov1aw2ex52a6v4j3gfugrafda3jplwhv24xelpvd29k2sak5waypc6qj9jyle" +} \ No newline at end of file diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..8288054 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "1.79" +components = ["rustfmt", "rust-src", "clippy"] +profile = "minimal" diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..6380de2 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,3 @@ +edition = "2021" +group_imports = "StdExternalCrate" +imports_granularity = "Crate" diff --git a/src/bitcoin.rs b/src/bitcoin.rs index d75cebd..1af2655 100644 --- a/src/bitcoin.rs +++ b/src/bitcoin.rs @@ -1,26 +1,29 @@ -use std::collections::HashSet; -use std::path::PathBuf; -use std::sync::Arc; -use std::time::{Duration, Instant}; +use std::{ + collections::HashSet, + path::PathBuf, + sync::Arc, + time::{Duration, Instant}, +}; use anyhow::{bail, Context}; use async_trait::async_trait; use bitcoin::Address; -use bitcoin_da::service::{get_relevant_blobs_from_txs, FINALITY_DEPTH}; -use bitcoin_da::spec::blob::BlobWithSender; -use bitcoincore_rpc::json::AddressType::Bech32m; -use bitcoincore_rpc::{Auth, Client, RpcApi}; +use bitcoin_da::{ + service::{get_relevant_blobs_from_txs, FINALITY_DEPTH}, + spec::blob::BlobWithSender, +}; +use bitcoincore_rpc::{json::AddressType::Bech32m, Auth, Client, RpcApi}; use citrea_primitives::REVEAL_BATCH_PROOF_PREFIX; use futures::TryStreamExt; -use tokio::process::Command; -use tokio::sync::OnceCell; -use tokio::time::sleep; - -use super::config::BitcoinConfig; -use super::docker::DockerEnv; -use super::framework::TestContext; -use super::node::{LogProvider, Node, Restart, SpawnOutput}; -use super::Result; +use tokio::{process::Command, sync::OnceCell, time::sleep}; + +use super::{ + config::BitcoinConfig, + docker::DockerEnv, + framework::TestContext, + traits::{LogProvider, Node, Restart, SpawnOutput}, + Result, +}; use crate::node::NodeKind; pub struct BitcoinNode { @@ -182,6 +185,7 @@ impl RpcApi for BitcoinNode { } } +#[async_trait] impl Node for BitcoinNode { type Config = BitcoinConfig; type Client = Client; @@ -232,6 +236,7 @@ impl Node for BitcoinNode { } } +#[async_trait] impl Restart for BitcoinNode { async fn wait_until_stopped(&mut self) -> Result<()> { self.client.stop().await?; diff --git a/src/client.rs b/src/client.rs new file mode 100644 index 0000000..09a4c81 --- /dev/null +++ b/src/client.rs @@ -0,0 +1,779 @@ +use std::{ + net::SocketAddr, + str::FromStr, + sync::{ + atomic::{AtomicU64, Ordering}, + mpsc, + }, + time::{Duration, SystemTime}, +}; + +use alloy::{ + providers::{ + network::{Ethereum, EthereumWallet}, + PendingTransactionBuilder, Provider as AlloyProvider, ProviderBuilder, + }, + rpc::types::eth::{Block, Transaction, TransactionReceipt, TransactionRequest}, + signers::{local::PrivateKeySigner, Signer}, + transports::http::{Http, HyperClient}, +}; +use anyhow::{anyhow, bail}; +use jsonrpsee::{ + core::client::{ClientT, SubscriptionClientT}, + http_client::{HttpClient, HttpClientBuilder}, + rpc_params, + ws_client::{PingConfig, WsClient, WsClientBuilder}, +}; +use reth_primitives::{ + Address, BlockId, BlockNumberOrTag, Bytes, Log, TxHash, TxKind, B256, U256, U64, +}; +use reth_rpc_types::{ + trace::geth::{GethDebugTracingOptions, GethTrace}, + Filter, RichBlock, +}; +use serde::de::DeserializeOwned; +use sov_ledger_rpc::client::RpcClient; +use sov_rollup_interface::rpc::{ + LastVerifiedProofResponse, ProofResponse, SequencerCommitmentResponse, + SoftConfirmationResponse, SoftConfirmationStatus, VerifiedProofResponse, +}; +use tokio::time::sleep; + +use crate::Result; + +pub const MAX_FEE_PER_GAS: u128 = 1000000001; + +pub struct L2Client { + pub chain_id: u64, + pub from_addr: Address, + client: Box>>, + http_client: HttpClient, + ws_client: WsClient, + current_nonce: AtomicU64, + pub rpc_addr: SocketAddr, +} + +impl L2Client { + pub async fn new( + chain_id: u64, + key: PrivateKeySigner, + from_addr: Address, + rpc_addr: SocketAddr, + ) -> anyhow::Result { + let http_host = format!("http://localhost:{}", rpc_addr.port()); + let ws_host = format!("ws://localhost:{}", rpc_addr.port()); + + let provider = ProviderBuilder::new() + // .with_recommended_fillers() + .with_chain_id(chain_id) + .wallet(EthereumWallet::from(key)) + .on_hyper_http(http_host.parse().unwrap()); + let client: Box>> = Box::new(provider); + + let http_client = HttpClientBuilder::default() + .request_timeout(Duration::from_secs(120)) + .build(http_host)?; + + let ws_client = WsClientBuilder::default() + .enable_ws_ping(PingConfig::default().inactive_limit(Duration::from_secs(10))) + .build(ws_host) + .await?; + + let client = Self { + chain_id, + from_addr, + client, + ws_client, + http_client, + current_nonce: AtomicU64::new(0), + rpc_addr, + }; + client.sync_nonce().await; + Ok(client) + } + + pub async fn healthcheck(&self) -> Result { + let healthcheck_url = format!("http://localhost:{}/health", self.rpc_addr.port()); + let resp = reqwest::get(healthcheck_url).await?; + Ok(resp.status().as_u16()) + } + + pub async fn spam_publish_batch_request(&self) -> Result<()> { + self.http_client + .request("citrea_testPublishBlock", rpc_params![]) + .await + .map_err(|e| e.into()) + } + + pub async fn send_publish_batch_request(&self) { + let _: () = self + .http_client + .request("citrea_testPublishBlock", rpc_params![]) + .await + .unwrap(); + // Do not decrease the sleep time, otherwise the test will fail! + tokio::time::sleep(Duration::from_millis(100)).await; + } + + pub async fn sync_nonce(&self) { + let nonce = self + .eth_get_transaction_count(self.from_addr, None) + .await + .unwrap(); + self.current_nonce.store(nonce, Ordering::Relaxed); + } + + pub async fn deploy_contract( + &self, + byte_code: Vec, + nonce: Option, + ) -> Result, Ethereum>> { + let nonce = match nonce { + Some(nonce) => nonce, + None => self.current_nonce.fetch_add(1, Ordering::Relaxed), + }; + + let mut req = TransactionRequest::default() + .from(self.from_addr) + .input(byte_code.into()); + req.to = Some(TxKind::Create); + let gas = self.client.estimate_gas(&req).await.unwrap(); + + let req = req + .gas_limit(gas) + .nonce(nonce) + .max_priority_fee_per_gas(10) + .max_fee_per_gas(MAX_FEE_PER_GAS); + + let receipt_req = self.client.send_transaction(req).await?; + Ok(receipt_req) + } + + pub async fn deploy_contract_call( + &self, + byte_code: Vec, + nonce: Option, + ) -> Result { + let nonce = match nonce { + Some(nonce) => nonce, + None => self.current_nonce.load(Ordering::Relaxed), + }; + + let req = TransactionRequest::default() + .from(self.from_addr) + .input(byte_code.into()) + .nonce(nonce); + let gas = self.client.estimate_gas(&req).await.unwrap(); + + let req = req + .gas_limit(gas) + .max_priority_fee_per_gas(10) + .max_fee_per_gas(MAX_FEE_PER_GAS); + + let receipt_req = self.client.call(&req).await?; + + Ok(receipt_req) + } + + pub async fn contract_transaction( + &self, + contract_address: Address, + data: Vec, + nonce: Option, + ) -> PendingTransactionBuilder<'_, Http, Ethereum> { + let nonce = match nonce { + Some(nonce) => nonce, + None => self.current_nonce.fetch_add(1, Ordering::Relaxed), + }; + let req = TransactionRequest::default() + .from(self.from_addr) + .to(contract_address) + .input(data.into()); + + let gas = self.client.estimate_gas(&req).await.unwrap(); + + let req = req + .gas_limit(gas) + .nonce(nonce) + .max_priority_fee_per_gas(10) + .max_fee_per_gas(MAX_FEE_PER_GAS); + + self.client.send_transaction(req).await.unwrap() + } + + #[allow(dead_code)] + pub async fn contract_transaction_with_custom_fee( + &self, + contract_address: Address, + data: Vec, + max_priority_fee_per_gas: u64, + max_fee_per_gas: u64, + value: Option, + nonce: Option, + ) -> PendingTransactionBuilder<'_, Http, Ethereum> { + let nonce = match nonce { + Some(nonce) => nonce, + None => self.current_nonce.fetch_add(1, Ordering::Relaxed), + }; + let req = TransactionRequest::default() + .from(self.from_addr) + .to(contract_address) + .input(data.into()) + .value(value.map(U256::from).unwrap_or_default()); + + let gas = self.client.estimate_gas(&req).await.unwrap(); + + let req = req + .gas_limit(gas) + .nonce(nonce) + .max_priority_fee_per_gas(max_priority_fee_per_gas.into()) + .max_fee_per_gas(max_fee_per_gas.into()); + + self.client.send_transaction(req).await.unwrap() + } + + pub async fn contract_call( + &self, + contract_address: Address, + data: Vec, + _nonce: Option, + ) -> Result { + let req = TransactionRequest::default() + .from(self.from_addr) + .to(contract_address) + .input(data.into()); + + let receipt_req = self.client.call(&req).await?; + + T::from_str(&receipt_req.to_string()).map_err(|_| anyhow!("Failed to parse bytes")) + } + + pub async fn send_eth( + &self, + to_addr: Address, + max_priority_fee_per_gas: Option, + max_fee_per_gas: Option, + nonce: Option, + value: u128, + ) -> Result, Ethereum>> { + let nonce = match nonce { + Some(nonce) => nonce, + None => self.current_nonce.fetch_add(1, Ordering::Relaxed), + }; + + let req = TransactionRequest::default() + .from(self.from_addr) + .to(to_addr) + .value(U256::from(value)); + + let gas = self.client.estimate_gas(&req).await.unwrap(); + + let req = req + .gas_limit(gas) + .nonce(nonce) + .max_priority_fee_per_gas(max_priority_fee_per_gas.unwrap_or(10)) + .max_fee_per_gas(max_fee_per_gas.unwrap_or(MAX_FEE_PER_GAS)); + + self.client + .send_transaction(req) + .await + .map_err(|e| e.into()) + } + + pub async fn send_eth_with_gas( + &self, + to_addr: Address, + max_priority_fee_per_gas: Option, + max_fee_per_gas: Option, + gas: u128, + value: u128, + ) -> Result, Ethereum>> { + let nonce = self.current_nonce.fetch_add(1, Ordering::Relaxed); + + let req = TransactionRequest::default() + .from(self.from_addr) + .to(to_addr) + .value(U256::from(value)) + .gas_limit(gas) + .nonce(nonce) + .max_priority_fee_per_gas(max_priority_fee_per_gas.unwrap_or(10)) + .max_fee_per_gas(max_fee_per_gas.unwrap_or(MAX_FEE_PER_GAS)); + + self.client + .send_transaction(req) + .await + .map_err(|e| e.into()) + } + + pub async fn web3_client_version(&self) -> String { + self.http_client + .request("web3_clientVersion", rpc_params![]) + .await + .unwrap() + } + + pub async fn web3_sha3(&self, bytes: String) -> String { + self.http_client + .request("web3_sha3", rpc_params![bytes]) + .await + .unwrap() + } + + pub async fn eth_accounts(&self) -> Vec
{ + self.http_client + .request("eth_accounts", rpc_params![]) + .await + .unwrap() + } + + pub async fn eth_chain_id(&self) -> u64 { + self.client.get_chain_id().await.unwrap() + } + + pub async fn eth_get_balance( + &self, + address: Address, + block_id: Option, + ) -> Result { + self.http_client + .request("eth_getBalance", rpc_params![address, block_id]) + .await + .map_err(|e| e.into()) + } + + pub async fn eth_get_storage_at( + &self, + address: Address, + index: U256, + block_id: Option, + ) -> Result { + self.http_client + .request("eth_getStorageAt", rpc_params![address, index, block_id]) + .await + .map_err(|e| e.into()) + } + + pub async fn eth_get_code(&self, address: Address, block_id: Option) -> Result { + self.http_client + .request("eth_getCode", rpc_params![address, block_id]) + .await + .map_err(|e| e.into()) + } + + pub async fn eth_get_transaction_count( + &self, + address: Address, + block_id: Option, + ) -> Result { + match self + .http_client + .request::("eth_getTransactionCount", rpc_params![address, block_id]) + .await + { + Ok(count) => Ok(count.saturating_to()), + Err(e) => Err(e.into()), + } + } + + // TODO actually this function returns gas price from the last block (already committed) and it may + // be different from the current gas price (for the next block being committed). + // So because of that users can't fully rely on the returned value. + // A part of https://github.com/chainwayxyz/citrea/issues/150 + pub async fn eth_gas_price(&self) -> U256 { + self.http_client + .request("eth_gasPrice", rpc_params![]) + .await + .unwrap() + } + + pub async fn eth_fee_history( + &self, + block_count: String, + newest_block: BlockNumberOrTag, + reward_percentiles: Option>, + ) -> FeeHistory { + let rpc_params = rpc_params![block_count, newest_block, reward_percentiles]; + self.http_client + .request("eth_feeHistory", rpc_params) + .await + .unwrap() + } + + pub async fn eth_get_block_by_number(&self, block_number: Option) -> Block { + self.http_client + .request("eth_getBlockByNumber", rpc_params![block_number, false]) + .await + .unwrap() + } + + pub async fn eth_get_block_by_number_with_detail( + &self, + block_number: Option, + ) -> Block { + self.http_client + .request("eth_getBlockByNumber", rpc_params![block_number, true]) + .await + .unwrap() + } + + #[allow(dead_code)] + pub async fn eth_get_transaction_by_hash( + &self, + tx_hash: TxHash, + mempool_only: Option, + ) -> Option { + self.http_client + .request( + "eth_getTransactionByHash", + rpc_params![tx_hash, mempool_only], + ) + .await + .unwrap() + } + + pub async fn eth_get_block_receipts( + &self, + block_number_or_hash: BlockId, + ) -> Vec { + self.http_client + .request("eth_getBlockReceipts", rpc_params![block_number_or_hash]) + .await + .unwrap() + } + + pub async fn eth_get_transaction_receipt(&self, tx_hash: TxHash) -> Option { + self.http_client + .request("eth_getTransactionReceipt", rpc_params![tx_hash]) + .await + .unwrap() + } + + pub async fn eth_get_tx_by_block_hash_and_index( + &self, + block_hash: B256, + index: U256, + ) -> Transaction { + self.http_client + .request( + "eth_getTransactionByBlockHashAndIndex", + rpc_params![block_hash, index], + ) + .await + .unwrap() + } + + pub async fn eth_get_tx_by_block_number_and_index( + &self, + block_number: BlockNumberOrTag, + index: U256, + ) -> Transaction { + self.http_client + .request( + "eth_getTransactionByBlockNumberAndIndex", + rpc_params![block_number, index], + ) + .await + .unwrap() + } + + /// params is a tuple of (fromBlock, toBlock, address, topics, blockHash) + /// any of these params are optional + pub async fn eth_get_logs

(&self, params: P) -> Vec + where + P: serde::Serialize, + { + let rpc_params = rpc_params!(params); + let eth_logs: Vec = self + .http_client + .request("eth_getLogs", rpc_params) + .await + .unwrap(); + eth_logs + } + + pub async fn ledger_get_soft_confirmation_by_number( + &self, + num: u64, + ) -> Option { + self.http_client + .request("ledger_getSoftConfirmationByNumber", rpc_params![num]) + .await + .unwrap() + } + + pub async fn ledger_get_soft_confirmation_status( + &self, + soft_confirmation_receipt: u64, + ) -> Result> { + self.http_client + .request( + "ledger_getSoftConfirmationStatus", + rpc_params![soft_confirmation_receipt], + ) + .await + .map_err(|e| e.into()) + } + + pub async fn ledger_get_last_scanned_l1_height(&self) -> u64 { + self.http_client + .request("ledger_getLastScannedL1Hieght", rpc_params![]) + .await + .unwrap() + } + + pub async fn ledger_get_sequencer_commitments_on_slot_by_number( + &self, + height: u64, + ) -> anyhow::Result>> { + self.http_client + .request( + "ledger_getSequencerCommitmentsOnSlotByNumber", + rpc_params![height], + ) + .await + .map_err(|e| e.into()) + } + + pub async fn ledger_get_proofs_by_slot_height(&self, height: u64) -> Vec { + self.http_client + .request("ledger_getProofsBySlotHeight", rpc_params![height]) + .await + .unwrap() + } + + pub async fn ledger_get_verified_proofs_by_slot_height( + &self, + height: u64, + ) -> Option> { + self.http_client + .request("ledger_getVerifiedProofsBySlotHeight", rpc_params![height]) + .await + .ok() + } + + pub async fn ledger_get_last_verified_proof(&self) -> Option { + self.http_client + .request("ledger_getLastVerifiedProof", rpc_params![]) + .await + .ok() + } + + pub async fn ledger_get_sequencer_commitments_on_slot_by_hash( + &self, + hash: [u8; 32], + ) -> Result>> { + self.http_client + .request( + "ledger_getSequencerCommitmentsOnSlotByHash", + rpc_params![hash], + ) + .await + .map_err(|e| e.into()) + } + + pub async fn ledger_get_head_soft_confirmation( + &self, + ) -> Result> { + self.http_client + .request("ledger_getHeadSoftConfirmation", rpc_params![]) + .await + .map_err(|e| e.into()) + } + + pub async fn ledger_get_head_soft_confirmation_height(&self) -> Result> { + self.http_client + .request("ledger_getHeadSoftConfirmationHeight", rpc_params![]) + .await + .map_err(|e| e.into()) + } + + pub async fn get_max_l2_blocks_per_l1(&self) -> u64 { + self.http_client + .request( + "softConfirmationRuleEnforcer_getMaxL2BlocksPerL1", + rpc_params![], + ) + .await + .unwrap() + } + + pub async fn debug_trace_transaction( + &self, + tx_hash: TxHash, + opts: Option, + ) -> GethTrace { + self.http_client + .request("debug_traceTransaction", rpc_params![tx_hash, opts]) + .await + .unwrap() + } + + pub async fn debug_trace_block_by_number( + &self, + block_number: BlockNumberOrTag, + opts: Option, + ) -> Vec { + self.http_client + .request("debug_traceBlockByNumber", rpc_params![block_number, opts]) + .await + .unwrap() + } + + pub async fn debug_trace_block_by_hash( + &self, + block_hash: B256, + opts: Option, + ) -> Vec { + self.http_client + .request("debug_traceBlockByHash", rpc_params![block_hash, opts]) + .await + .unwrap() + } + + pub async fn debug_trace_chain( + &self, + start_block: BlockNumberOrTag, + end_block: BlockNumberOrTag, + opts: Option, + ) -> Vec { + let mut subscription = self + .ws_client + .subscribe( + "debug_subscribe", + rpc_params!["traceChain", start_block, end_block, opts], + "debug_unsubscribe", + ) + .await + .unwrap(); + + let BlockNumberOrTag::Number(start_block) = start_block else { + panic!("Only numbers for start block"); + }; + let end_block = match end_block { + BlockNumberOrTag::Number(b) => b, + BlockNumberOrTag::Latest => self.eth_block_number().await, + _ => panic!("Only number and latest"), + }; + let mut traces: Vec> = vec![]; + for _ in start_block..end_block { + let block_traces = subscription.next().await.unwrap().unwrap(); + traces.push(block_traces); + } + + traces.into_iter().flatten().collect() + } + + pub async fn subscribe_new_heads(&self) -> mpsc::Receiver { + let (tx, rx) = mpsc::channel(); + let mut subscription = self + .ws_client + .subscribe("eth_subscribe", rpc_params!["newHeads"], "eth_unsubscribe") + .await + .unwrap(); + + tokio::spawn(async move { + loop { + let Some(Ok(block)) = subscription.next().await else { + return; + }; + tx.send(block).unwrap(); + } + }); + + rx + } + + pub async fn subscribe_logs(&self, filter: Filter) -> mpsc::Receiver { + let (tx, rx) = mpsc::channel(); + let mut subscription = self + .ws_client + .subscribe( + "eth_subscribe", + rpc_params!["logs", filter], + "eth_unsubscribe", + ) + .await + .unwrap(); + + tokio::spawn(async move { + loop { + let Some(Ok(log)) = subscription.next().await else { + return; + }; + tx.send(log).unwrap(); + } + }); + + rx + } + + pub async fn eth_block_number(&self) -> u64 { + let block_number: U256 = self + .http_client + .request("eth_blockNumber", rpc_params![]) + .await + .unwrap(); + + block_number.saturating_to() + } + + pub async fn citrea_sync_status(&self) -> T + where + T: DeserializeOwned, + { + self.http_client + .request::("citrea_syncStatus", rpc_params![]) + .await + .unwrap() + } + + pub async fn wait_for_l2_block(&self, num: u64, timeout: Option) -> Result<()> { + let start = SystemTime::now(); + let timeout = timeout.unwrap_or(Duration::from_secs(30)); // Default 30 seconds timeout + loop { + let latest_block = self + .http_client + .get_head_soft_confirmation_height() + .await + .expect("Expected height to be Some"); + + if latest_block >= num { + break; + } + + let now = SystemTime::now(); + if start + timeout <= now { + bail!("Timeout. Lbtest L2 block is {:?}", latest_block); + } + + sleep(Duration::from_secs(1)).await; + } + Ok(()) + } +} + +#[derive(serde::Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +#[allow(dead_code)] +// ethers version of FeeHistory doesn't accept None reward +pub struct FeeHistory { + pub base_fee_per_gas: Vec, + pub gas_used_ratio: Vec, + pub oldest_block: U256, + pub reward: Option>>, +} + +#[allow(clippy::borrowed_box)] +pub async fn make_test_client(rpc_address: SocketAddr) -> Result> { + let chain_id: u64 = 5655; + let key = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + .parse::() + .unwrap() + .with_chain_id(Some(chain_id)); + + let from_addr = Address::from_str("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266").unwrap(); + + Ok(Box::new( + L2Client::new(chain_id, key, from_addr, rpc_address).await?, + )) +} diff --git a/src/config/mod.rs b/src/config/mod.rs index 9bb8453..c5fcdd9 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -8,10 +8,13 @@ mod utils; use std::path::PathBuf; pub use bitcoin::BitcoinConfig; +pub use bitcoin_da::service::BitcoinServiceConfig; pub use citrea_sequencer::SequencerConfig; pub use docker::DockerConfig; pub use rollup::{default_rollup_config, RollupConfig}; -pub use sov_stf_runner::ProverConfig; +pub use sov_stf_runner::{ + FullNodeConfig, ProverConfig, RollupPublicKeys, RpcConfig, RunnerConfig, StorageConfig, +}; pub use test::TestConfig; pub use test_case::{TestCaseConfig, TestCaseEnv}; pub use utils::config_to_file; diff --git a/src/config/rollup.rs b/src/config/rollup.rs index 33c5525..8e75183 100644 --- a/src/config/rollup.rs +++ b/src/config/rollup.rs @@ -1,9 +1,9 @@ -use bitcoin_da::service::BitcoinServiceConfig; -use sov_stf_runner::{FullNodeConfig, RollupPublicKeys, RpcConfig, StorageConfig}; use tempfile::TempDir; use super::BitcoinConfig; -use crate::utils::get_tx_backup_dir; +use crate::config::{ + BitcoinServiceConfig, FullNodeConfig, RollupPublicKeys, RpcConfig, StorageConfig, +}; pub type RollupConfig = FullNodeConfig; pub fn default_rollup_config() -> RollupConfig { @@ -31,7 +31,11 @@ pub fn default_rollup_config() -> RollupConfig { node_password: String::from("password"), network: bitcoin::Network::Regtest, da_private_key: None, - tx_backup_dir: get_tx_backup_dir(), + tx_backup_dir: TempDir::new() + .expect("Failed to create temporary directory") + .into_path() + .display() + .to_string(), }, public_keys: RollupPublicKeys { sequencer_public_key: vec![ diff --git a/src/config/test.rs b/src/config/test.rs index 3f33d4f..ae7ea58 100644 --- a/src/config/test.rs +++ b/src/config/test.rs @@ -1,6 +1,7 @@ -use super::bitcoin::BitcoinConfig; -use super::test_case::TestCaseConfig; -use super::{FullFullNodeConfig, FullProverConfig, FullSequencerConfig}; +use super::{ + bitcoin::BitcoinConfig, test_case::TestCaseConfig, FullFullNodeConfig, FullProverConfig, + FullSequencerConfig, +}; #[derive(Clone)] pub struct TestConfig { diff --git a/src/config/test_case.rs b/src/config/test_case.rs index caaeca5..bd7acae 100644 --- a/src/config/test_case.rs +++ b/src/config/test_case.rs @@ -1,5 +1,4 @@ -use std::path::PathBuf; -use std::time::Duration; +use std::{path::PathBuf, time::Duration}; use tempfile::TempDir; diff --git a/src/docker.rs b/src/docker.rs index 7119cbe..e248a52 100644 --- a/src/docker.rs +++ b/src/docker.rs @@ -1,25 +1,25 @@ -use std::collections::{HashMap, HashSet}; -use std::io::{stdout, Write}; -use std::path::PathBuf; +use std::{ + collections::{HashMap, HashSet}, + io::{stdout, Write}, + path::PathBuf, +}; use anyhow::{anyhow, Context, Result}; -use bollard::container::{Config, LogOutput, LogsOptions, NetworkingConfig}; -use bollard::image::CreateImageOptions; -use bollard::models::{EndpointSettings, Mount, PortBinding}; -use bollard::network::CreateNetworkOptions; -use bollard::secret::MountTypeEnum; -use bollard::service::HostConfig; -use bollard::volume::CreateVolumeOptions; -use bollard::Docker; +use bollard::{ + container::{Config, LogOutput, LogsOptions, NetworkingConfig}, + image::CreateImageOptions, + models::{EndpointSettings, Mount, PortBinding}, + network::CreateNetworkOptions, + secret::MountTypeEnum, + service::HostConfig, + volume::CreateVolumeOptions, + Docker, +}; use futures::StreamExt; -use tokio::fs::File; -use tokio::io::AsyncWriteExt; -use tokio::task::JoinHandle; - -use super::config::DockerConfig; -use super::node::SpawnOutput; -use super::utils::generate_test_id; -use crate::node::ContainerSpawnOutput; +use tokio::{fs::File, io::AsyncWriteExt, task::JoinHandle}; + +use super::{config::DockerConfig, traits::SpawnOutput, utils::generate_test_id}; +use crate::traits::ContainerSpawnOutput; pub struct DockerEnv { pub docker: Docker, diff --git a/src/framework.rs b/src/framework.rs index f7c2db1..756bc01 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -1,17 +1,18 @@ -use std::future::Future; -use std::sync::Arc; +use std::{future::Future, sync::Arc}; use bitcoincore_rpc::RpcApi; -use super::bitcoin::BitcoinNodeCluster; -use super::config::TestConfig; -use super::docker::DockerEnv; -use super::full_node::FullNode; -use super::node::{LogProvider, LogProviderErased, Node, NodeKind}; -use super::sequencer::Sequencer; -use super::Result; -use crate::prover::Prover; -use crate::utils::tail_file; +use super::{ + bitcoin::BitcoinNodeCluster, + config::TestConfig, + docker::DockerEnv, + full_node::FullNode, + node::NodeKind, + sequencer::Sequencer, + traits::{LogProvider, LogProviderErased, Node}, + Result, +}; +use crate::{prover::Prover, utils::tail_file}; pub struct TestContext { pub config: TestConfig, diff --git a/src/full_node.rs b/src/full_node.rs index d53d8ae..3ed3860 100644 --- a/src/full_node.rs +++ b/src/full_node.rs @@ -1,27 +1,31 @@ -use std::fs::File; -use std::net::SocketAddr; -use std::path::PathBuf; -use std::process::Stdio; +use std::{fs::File, net::SocketAddr, path::PathBuf, process::Stdio}; use anyhow::{bail, Context}; +use async_trait::async_trait; use sov_rollup_interface::rpc::{SequencerCommitmentResponse, VerifiedProofResponse}; -use tokio::process::Command; -use tokio::time::{sleep, Duration, Instant}; - -use super::config::{config_to_file, FullFullNodeConfig, TestConfig}; -use super::framework::TestContext; -use super::node::{LogProvider, Node, NodeKind, SpawnOutput}; -use super::utils::{get_citrea_path, get_stderr_path, get_stdout_path, retry}; -use super::Result; -use crate::utils::get_genesis_path; -use crate::evm::make_test_client; -use crate::test_client::TestClient; +use tokio::{ + process::Command, + time::{sleep, Duration, Instant}, +}; + +use super::{ + config::{config_to_file, FullFullNodeConfig, TestConfig}, + framework::TestContext, + node::NodeKind, + traits::{LogProvider, Node, SpawnOutput}, + utils::{get_citrea_path, get_stderr_path, get_stdout_path, retry}, + Result, +}; +use crate::{ + client::{make_test_client, L2Client}, + utils::get_genesis_path, +}; #[allow(unused)] pub struct FullNode { spawn_output: SpawnOutput, config: FullFullNodeConfig, - pub client: Box, + pub client: Box, } impl FullNode { @@ -101,9 +105,10 @@ impl FullNode { } } +#[async_trait] impl Node for FullNode { type Config = FullFullNodeConfig; - type Client = TestClient; + type Client = L2Client; fn spawn(config: &Self::Config) -> Result { let citrea = get_citrea_path(); diff --git a/src/lib.rs b/src/lib.rs index 32cc181..86aaa53 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ mod bitcoin; +pub mod client; pub mod config; mod docker; pub mod framework; @@ -7,7 +8,8 @@ pub mod node; mod prover; mod sequencer; pub mod test_case; +pub mod traits; mod utils; -pub(crate) type Result = anyhow::Result; +pub type Result = anyhow::Result; diff --git a/src/node.rs b/src/node.rs index d81ddb1..04d8a16 100644 --- a/src/node.rs +++ b/src/node.rs @@ -1,15 +1,4 @@ use std::fmt; -use std::path::PathBuf; -use std::time::Duration; - -use anyhow::Context; -use bollard::container::StopContainerOptions; -use bollard::Docker; -use tokio::process::Child; - -use super::Result; -use crate::test_client::TestClient; -use crate::test_helpers::wait_for_l2_block; #[derive(Debug)] pub enum NodeKind { @@ -29,137 +18,3 @@ impl fmt::Display for NodeKind { } } } - -#[derive(Debug)] -pub struct ContainerSpawnOutput { - pub id: String, - pub ip: String, -} - -#[derive(Debug)] -pub enum SpawnOutput { - Child(Child), - Container(ContainerSpawnOutput), -} - -/// The Node trait defines the common interface shared between -/// BitcoinNode, Prover, Sequencer and FullNode -pub(crate) trait Node { - type Config; - type Client; - - /// Spawn a new node with specific config and return its child - fn spawn(test_config: &Self::Config) -> Result; - fn spawn_output(&mut self) -> &mut SpawnOutput; - - fn config_mut(&mut self) -> &mut Self::Config; - - /// Stops the running node - async fn stop(&mut self) -> Result<()> { - match self.spawn_output() { - SpawnOutput::Child(process) => { - process - .kill() - .await - .context("Failed to kill child process")?; - Ok(()) - } - SpawnOutput::Container(ContainerSpawnOutput { id, .. }) => { - println!("Stopping container {id}"); - let docker = - Docker::connect_with_local_defaults().context("Failed to connect to Docker")?; - docker - .stop_container(id, Some(StopContainerOptions { t: 10 })) - .await - .context("Failed to stop Docker container")?; - Ok(()) - } - } - } - - /// Wait for the node to be reachable by its client. - async fn wait_for_ready(&self, timeout: Option) -> Result<()>; - - fn client(&self) -> &Self::Client; - - #[allow(unused)] - fn env(&self) -> Vec<(&'static str, &'static str)> { - Vec::new() - } -} - -pub trait L2Node: Node { - async fn wait_for_l2_height(&self, height: u64, timeout: Option); -} - -impl L2Node for T -where - T: Node, -{ - async fn wait_for_l2_height(&self, height: u64, timeout: Option) { - wait_for_l2_block(self.client(), height, timeout).await - } -} - -// Two patterns supported : -// - Call wait_until_stopped, runs any extra commands needed for testing purposes, call start again. -// - Call restart if you need to wait for node to be fully shutdown and brough back up with new config. -pub trait Restart: Node { - async fn wait_until_stopped(&mut self) -> Result<()>; - async fn start(&mut self, new_config: Option) -> Result<()>; - - // Default implementation to support waiting for node to be fully shutdown and brough back up with new config. - async fn restart(&mut self, new_config: Option) -> Result<()> { - self.wait_until_stopped().await?; - self.start(new_config).await - } -} - -impl Restart for T -where - T: L2Node, -{ - async fn wait_until_stopped(&mut self) -> Result<()> { - self.stop().await?; - match self.spawn_output() { - SpawnOutput::Child(pid) => pid.wait().await?, - SpawnOutput::Container(_) => unimplemented!("L2 nodes don't run in docker yet"), - }; - Ok(()) - } - - async fn start(&mut self, new_config: Option) -> Result<()> { - let config = self.config_mut(); - if let Some(new_config) = new_config { - *config = new_config - } - *self.spawn_output() = Self::spawn(config)?; - self.wait_for_ready(None).await - } -} - -pub trait LogProvider: Node { - fn kind(&self) -> NodeKind; - fn log_path(&self) -> PathBuf; - fn as_erased(&self) -> &dyn LogProviderErased - where - Self: Sized, - { - self - } -} - -pub trait LogProviderErased { - fn kind(&self) -> NodeKind; - fn log_path(&self) -> PathBuf; -} - -impl LogProviderErased for T { - fn kind(&self) -> NodeKind { - LogProvider::kind(self) - } - - fn log_path(&self) -> PathBuf { - LogProvider::log_path(self) - } -} diff --git a/src/prover.rs b/src/prover.rs index de5c519..cf495db 100644 --- a/src/prover.rs +++ b/src/prover.rs @@ -1,27 +1,31 @@ -use std::fs::File; -use std::net::SocketAddr; -use std::path::PathBuf; -use std::process::Stdio; - -use anyhow::Context; -use tokio::process::Command; -use tokio::time::{sleep, Duration, Instant}; - -use super::config::{config_to_file, FullProverConfig, TestConfig}; -use super::framework::TestContext; -use super::node::{LogProvider, Node, NodeKind, SpawnOutput}; -use super::utils::{get_citrea_path, get_stderr_path, get_stdout_path, retry}; -use super::Result; -use crate::evm::make_test_client; -use crate::test_client::TestClient; -use crate::test_helpers::wait_for_prover_l1_height; -use crate::utils::get_genesis_path; +use std::{fs::File, net::SocketAddr, path::PathBuf, process::Stdio, time::SystemTime}; + +use anyhow::{bail, Context}; +use async_trait::async_trait; +use log::debug; +use tokio::{ + process::Command, + time::{sleep, Duration, Instant}, +}; + +use super::{ + config::{config_to_file, FullProverConfig, TestConfig}, + framework::TestContext, + node::NodeKind, + traits::{LogProvider, Node, SpawnOutput}, + utils::{get_citrea_path, get_stderr_path, get_stdout_path, retry}, + Result, +}; +use crate::{ + client::{make_test_client, L2Client}, + utils::get_genesis_path, +}; #[allow(unused)] pub struct Prover { spawn_output: SpawnOutput, config: FullProverConfig, - pub client: Box, + pub client: Box, } impl Prover { @@ -52,13 +56,30 @@ impl Prover { } pub async fn wait_for_l1_height(&self, height: u64, timeout: Option) -> Result<()> { - wait_for_prover_l1_height(&self.client, height, timeout).await + let start = SystemTime::now(); + let timeout = timeout.unwrap_or(Duration::from_secs(600)); + loop { + debug!("Waiting for prover height {}", height); + let latest_block = self.client.ledger_get_last_scanned_l1_height().await; + if latest_block >= height { + break; + } + + let now = SystemTime::now(); + if start + timeout <= now { + bail!("Timeout. Latest prover L1 height is {}", latest_block); + } + + sleep(Duration::from_secs(1)).await; + } + Ok(()) } } +#[async_trait] impl Node for Prover { type Config = FullProverConfig; - type Client = TestClient; + type Client = L2Client; fn spawn(config: &Self::Config) -> Result { let citrea = get_citrea_path(); diff --git a/src/sequencer.rs b/src/sequencer.rs index 19cfc02..eeec3c4 100644 --- a/src/sequencer.rs +++ b/src/sequencer.rs @@ -1,26 +1,30 @@ -use std::fs::File; -use std::net::SocketAddr; -use std::path::PathBuf; -use std::process::Stdio; +use std::{fs::File, net::SocketAddr, path::PathBuf, process::Stdio}; use anyhow::Context; -use tokio::process::Command; -use tokio::time::{sleep, Duration, Instant}; - -use super::config::{config_to_file, FullSequencerConfig, TestConfig}; -use super::framework::TestContext; -use super::node::{LogProvider, Node, NodeKind, SpawnOutput}; -use super::utils::{get_citrea_path, get_stderr_path, get_stdout_path, retry}; -use super::Result; -use crate::evm::make_test_client; -use crate::test_client::TestClient; -use crate::utils::get_genesis_path; +use async_trait::async_trait; +use tokio::{ + process::Command, + time::{sleep, Duration, Instant}, +}; + +use super::{ + config::{config_to_file, FullSequencerConfig, TestConfig}, + framework::TestContext, + node::NodeKind, + traits::{LogProvider, Node, SpawnOutput}, + utils::{get_citrea_path, get_stderr_path, get_stdout_path, retry}, + Result, +}; +use crate::{ + client::{make_test_client, L2Client}, + utils::get_genesis_path, +}; #[allow(unused)] pub struct Sequencer { spawn_output: SpawnOutput, config: FullSequencerConfig, - pub client: Box, + pub client: Box, } impl Sequencer { @@ -59,9 +63,10 @@ impl Sequencer { } } +#[async_trait] impl Node for Sequencer { type Config = FullSequencerConfig; - type Client = TestClient; + type Client = L2Client; fn spawn(config: &Self::Config) -> Result { let citrea = get_citrea_path(); diff --git a/src/test_case.rs b/src/test_case.rs index 28abba6..0dc1b9d 100644 --- a/src/test_case.rs +++ b/src/test_case.rs @@ -1,27 +1,33 @@ //! This module provides the TestCaseRunner and TestCase trait for running and defining test cases. //! It handles setup, execution, and cleanup of test environments. -use std::panic::{self}; -use std::path::{Path, PathBuf}; -use std::time::Duration; +use std::{ + panic::{self}, + path::{Path, PathBuf}, + time::Duration, +}; use anyhow::{bail, Context}; use async_trait::async_trait; -use bitcoin_da::service::BitcoinServiceConfig; -use citrea_sequencer::SequencerConfig; use futures::FutureExt; -use sov_stf_runner::{ProverConfig, RpcConfig, RunnerConfig, StorageConfig}; -use super::config::{ - default_rollup_config, BitcoinConfig, FullFullNodeConfig, FullProverConfig, - FullSequencerConfig, RollupConfig, TestCaseConfig, TestCaseEnv, TestConfig, +use super::{ + config::{ + default_rollup_config, BitcoinConfig, FullFullNodeConfig, FullProverConfig, + FullSequencerConfig, RollupConfig, TestCaseConfig, TestCaseEnv, TestConfig, + }, + framework::TestFramework, + node::NodeKind, + utils::{copy_directory, get_available_port}, + Result, +}; +use crate::{ + config::{ + BitcoinServiceConfig, ProverConfig, RpcConfig, RunnerConfig, SequencerConfig, StorageConfig, + }, + traits::Node, + utils::{get_default_genesis_path, get_workspace_root}, }; -use super::framework::TestFramework; -use super::node::NodeKind; -use super::utils::{copy_directory, get_available_port, get_tx_backup_dir}; -use super::Result; -use crate::node::Node; -use crate::utils::{get_default_genesis_path, get_workspace_root}; // TestCaseRunner manages the lifecycle of a test case, including setup, execution, and cleanup. /// It creates a test framework with the associated configs, spawns required nodes, connects them, @@ -108,7 +114,7 @@ impl TestCaseRunner { let prover_rollup = default_rollup_config(); let full_node_rollup = default_rollup_config(); - let [bitcoin_dir, dbs_dir, prover_dir, sequencer_dir, full_node_dir, genesis_dir] = + let [bitcoin_dir, dbs_dir, prover_dir, sequencer_dir, full_node_dir, genesis_dir, tx_backup_dir] = create_dirs(&test_case.dir)?; copy_genesis_dir(&test_case.genesis_dir, &genesis_dir)?; @@ -145,7 +151,7 @@ impl TestCaseRunner { .to_string(), ), node_url: format!("http://{}/wallet/{}", da_config.node_url, node_kind), - tx_backup_dir: get_tx_backup_dir(), + tx_backup_dir: tx_backup_dir.display().to_string(), ..da_config.clone() }, storage: StorageConfig { @@ -180,7 +186,7 @@ impl TestCaseRunner { .to_string(), ), node_url: format!("http://{}/wallet/{}", da_config.node_url, node_kind), - tx_backup_dir: get_tx_backup_dir(), + tx_backup_dir: tx_backup_dir.display().to_string(), ..da_config.clone() }, storage: StorageConfig { @@ -206,7 +212,7 @@ impl TestCaseRunner { da_config.node_url, NodeKind::Bitcoin // Use default wallet ), - tx_backup_dir: get_tx_backup_dir(), + tx_backup_dir: tx_backup_dir.display().to_string(), ..da_config.clone() }, storage: StorageConfig { @@ -307,7 +313,7 @@ pub trait TestCase: Send + Sync + 'static { } } -fn create_dirs(base_dir: &Path) -> Result<[PathBuf; 6]> { +fn create_dirs(base_dir: &Path) -> Result<[PathBuf; 7]> { let paths = [ NodeKind::Bitcoin.to_string(), "dbs".to_string(), @@ -315,6 +321,7 @@ fn create_dirs(base_dir: &Path) -> Result<[PathBuf; 6]> { NodeKind::Sequencer.to_string(), NodeKind::FullNode.to_string(), "genesis".to_string(), + "inscription_txs".to_string(), ] .map(|dir| base_dir.join(dir)); @@ -327,6 +334,7 @@ fn create_dirs(base_dir: &Path) -> Result<[PathBuf; 6]> { } fn copy_genesis_dir(genesis_dir: &Option, target_dir: &Path) -> std::io::Result<()> { + println!("1"); let genesis_dir = genesis_dir .as_ref() @@ -339,5 +347,6 @@ fn copy_genesis_dir(genesis_dir: &Option, target_dir: &Path) -> std::io: } }); + println!("2"); copy_directory(genesis_dir, target_dir) } diff --git a/src/traits.rs b/src/traits.rs new file mode 100644 index 0000000..6245dc9 --- /dev/null +++ b/src/traits.rs @@ -0,0 +1,137 @@ +use std::{path::PathBuf, time::Duration}; + +use anyhow::Context; +use async_trait::async_trait; +use bollard::{container::StopContainerOptions, Docker}; +use tokio::process::Child; + +use super::Result; +use crate::{client::L2Client, node::NodeKind}; + +#[derive(Debug)] +pub struct ContainerSpawnOutput { + pub id: String, + pub ip: String, +} + +#[derive(Debug)] +pub enum SpawnOutput { + Child(Child), + Container(ContainerSpawnOutput), +} + +/// The Node trait defines the common interface shared between +/// BitcoinNode, Prover, Sequencer and FullNode +#[async_trait] +pub trait Node: Send { + type Config: Send; + type Client; + + /// Spawn a new node with specific config and return its child + fn spawn(test_config: &Self::Config) -> Result; + fn spawn_output(&mut self) -> &mut SpawnOutput; + + fn config_mut(&mut self) -> &mut Self::Config; + + /// Stops the running node + async fn stop(&mut self) -> Result<()> { + match self.spawn_output() { + SpawnOutput::Child(process) => { + process + .kill() + .await + .context("Failed to kill child process")?; + Ok(()) + } + SpawnOutput::Container(ContainerSpawnOutput { id, .. }) => { + println!("Stopping container {id}"); + let docker = + Docker::connect_with_local_defaults().context("Failed to connect to Docker")?; + docker + .stop_container(id, Some(StopContainerOptions { t: 10 })) + .await + .context("Failed to stop Docker container")?; + Ok(()) + } + } + } + + /// Wait for the node to be reachable by its client. + async fn wait_for_ready(&self, timeout: Option) -> Result<()>; + + fn client(&self) -> &Self::Client; + + #[allow(unused)] + fn env(&self) -> Vec<(&'static str, &'static str)> { + Vec::new() + } +} + +pub trait L2Node: Node {} + +impl L2Node for T where T: Node {} + +// Two patterns supported : +// - Call wait_until_stopped, runs any extra commands needed for testing purposes, call start again. +// - Call restart if you need to wait for node to be fully shutdown and brough back up with new config. +#[async_trait] +pub trait Restart: Node + Send { + async fn wait_until_stopped(&mut self) -> Result<()>; + async fn start(&mut self, new_config: Option) -> Result<()>; + + // Default implementation to support waiting for node to be fully shutdown and brough back up with new config. + async fn restart(&mut self, new_config: Option) -> Result<()> { + self.wait_until_stopped().await?; + self.start(new_config).await + } +} + +#[async_trait] +impl Restart for T +where + T: L2Node + Send, +{ + async fn wait_until_stopped(&mut self) -> Result<()> { + self.stop().await?; + match self.spawn_output() { + SpawnOutput::Child(pid) => pid.wait().await?, + SpawnOutput::Container(_) => unimplemented!("L2 nodes don't run in docker yet"), + }; + Ok(()) + } + + async fn start(&mut self, new_config: Option) -> Result<()> { + let config = self.config_mut(); + if let Some(new_config) = new_config { + *config = new_config + } + *self.spawn_output() = Self::spawn(config)?; + self.wait_for_ready(None).await + } +} + +pub trait LogProvider: Node { + fn kind(&self) -> NodeKind; + fn log_path(&self) -> PathBuf; + fn as_erased(&self) -> &dyn LogProviderErased + where + Self: Sized, + { + self + } +} + +pub trait LogProviderErased { + fn kind(&self) -> NodeKind; + fn log_path(&self) -> PathBuf; +} + +impl LogProviderErased for T { + fn kind(&self) -> NodeKind { + LogProvider::kind(self) + } + + fn log_path(&self) -> PathBuf { + LogProvider::log_path(self) + } +} diff --git a/src/utils.rs b/src/utils.rs index 05e395f..928d8ae 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,14 +1,17 @@ -use std::fs::File; -use std::future::Future; -use std::io::{BufRead, BufReader}; -use std::net::TcpListener; -use std::path::{Path, PathBuf}; -use std::{fs, io}; +use std::{ + fs, + fs::File, + future::Future, + io, + io::{BufRead, BufReader}, + net::TcpListener, + path::{Path, PathBuf}, +}; use anyhow::bail; -use rand::distributions::Alphanumeric; -use rand::{thread_rng, Rng}; +use rand::{distributions::Alphanumeric, thread_rng, Rng}; use tokio::time::{sleep, Duration, Instant}; +use which::which; use super::Result; @@ -21,24 +24,14 @@ pub fn get_workspace_root() -> PathBuf { let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); manifest_dir .ancestors() - .nth(2) + .next() .expect("Failed to find workspace root") .to_path_buf() } -/// Get citrea path from CITREA env or resolves to debug build. +/// Get citrea path from CITREA env or resolves to PATH using which. pub fn get_citrea_path() -> PathBuf { - std::env::var("CITREA").map_or_else( - |_| { - let workspace_root = get_workspace_root(); - let mut path = workspace_root.to_path_buf(); - path.push("target"); - path.push("debug"); - path.push("citrea"); - path - }, - PathBuf::from, - ) + std::env::var("CITREA").map_or_else(|_| which("citrea").unwrap(), PathBuf::from) } pub fn get_stdout_path(dir: &Path) -> PathBuf { @@ -97,7 +90,7 @@ pub fn copy_directory(src: impl AsRef, dst: impl AsRef) -> io::Resul Ok(()) } -pub(crate) async fn retry(f: F, timeout: Option) -> Result +pub async fn retry(f: F, timeout: Option) -> Result where F: Fn() -> Fut, Fut: Future>, @@ -138,12 +131,3 @@ pub fn tail_file(path: &Path, lines: usize) -> Result<()> { Ok(()) } - -pub fn get_tx_backup_dir() -> String { - let workspace_root = get_workspace_root(); - let mut path = workspace_root.to_path_buf(); - path.push("resources"); - path.push("bitcoin"); - path.push("inscription_txs"); - path.to_str().expect("Failed to convert path").to_string() -}