diff --git a/.changeset/brave-garlics-sniff.md b/.changeset/brave-garlics-sniff.md new file mode 100644 index 0000000000000..c1f275f362df6 --- /dev/null +++ b/.changeset/brave-garlics-sniff.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/l2geth': patch +--- + +Add the gas estimation block tag to `eth_estimateGas` to be RPC compliant diff --git a/.changeset/fifty-badgers-behave.md b/.changeset/fifty-badgers-behave.md new file mode 100644 index 0000000000000..14ce81b5bb7b6 --- /dev/null +++ b/.changeset/fifty-badgers-behave.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-periphery': patch +--- + +Fixes import paths in the contracts-periphery package diff --git a/.changeset/forty-radios-teach.md b/.changeset/forty-radios-teach.md new file mode 100644 index 0000000000000..7fccb82dafc0e --- /dev/null +++ b/.changeset/forty-radios-teach.md @@ -0,0 +1,6 @@ +--- +'@eth-optimism/foundry': patch +'@eth-optimism/ci-builder': patch +--- + +Upgrade foundry to support consistent storage layouts diff --git a/.changeset/mighty-eagles-remember.md b/.changeset/mighty-eagles-remember.md new file mode 100644 index 0000000000000..8acddf51944da --- /dev/null +++ b/.changeset/mighty-eagles-remember.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/core-utils': minor +--- + +Removes ethers as a dependency in favor of individual ethers sub-packages diff --git a/.changeset/tall-fans-cover.md b/.changeset/tall-fans-cover.md new file mode 100644 index 0000000000000..d709254eeb276 --- /dev/null +++ b/.changeset/tall-fans-cover.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts': patch +--- + +Significantly reduces contracts package bundle size diff --git a/.changeset/wild-feet-listen.md b/.changeset/wild-feet-listen.md new file mode 100644 index 0000000000000..91b6bf8a1a22b --- /dev/null +++ b/.changeset/wild-feet-listen.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/hardhat-node': patch +--- + +Fixes CI to properly release the hardhat-node diff --git a/.circleci/config.yml b/.circleci/config.yml index 61a2b66158200..301aa3d890fb3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -221,7 +221,7 @@ jobs: name: Check if we should run command: | shopt -s inherit_errexit - CHANGED=$(check-changed "op-(batcher|bindings|e2e|node|proposer)") + CHANGED=$(check-changed "op-(batcher|bindings|e2e|node|proposer|chain-ops)") if [[ "$CHANGED" = "FALSE" ]]; then circleci step halt fi @@ -255,6 +255,11 @@ jobs: command: | golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell ./... working_directory: op-service + - run: + name: lint op-chain-ops + command: | + golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell ./... + working_directory: op-chain-ops - run: name: prep results dir command: mkdir -p /test-results @@ -283,6 +288,11 @@ jobs: command: | gotestsum --junitfile /test-results/op-service.xml -- -coverpkg=github.com/ethereum-optimism/optimism/... -coverprofile=coverage.out -covermode=atomic ./... working_directory: op-service + - run: + name: test op-chain-ops + command: | + gotestsum --junitfile /test-results/op-chain-ops.xml -- -coverpkg=github.com/ethereum-optimism/optimism/... -coverprofile=coverage.out -covermode=atomic ./... + working_directory: op-chain-ops - store_test_results: path: /test-results - run: @@ -400,7 +410,7 @@ jobs: fi - run: name: Lint - command: golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell ./... + command: golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint -e "errors.As" -e "errors.Is" ./... working_directory: <> - store_test_results: path: /test-results @@ -497,19 +507,6 @@ jobs: name: Bring up the stack command: | make devnet-up - - run: - name: Check L2 Config - command: npx hardhat check-l2-config --network devnetL1 - working_directory: packages/contracts-bedrock - - run: - name: Do a deposit - command: | - timeout 5m npx hardhat deposit \ - --to 0xB79f76EF2c5F0286176833E7B2eEe103b1CC3244 \ - --amount-eth 1 \ - --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ - --network devnetL1 - working_directory: packages/contracts-bedrock - run: name: Deposit ERC20 through the bridge command: timeout 5m npx hardhat deposit-erc20 --network devnetL1 @@ -631,7 +628,7 @@ jobs: -sim=<> \ -sim.loglevel=5 \ -docker.pull=true \ - -client=go-ethereum,op-geth_optimism-history,op-proposer_<>,op-batcher_<>,op-node_<>,op-contracts_<> |& tee /tmp/hive.log + -client=go-ethereum,op-geth_optimism-history,op-proposer_<>,op-batcher_<>,op-node_<> |& tee /tmp/hive.log - run: command: | tar -cvf /tmp/workspace.tgz -C /home/circleci/project /home/circleci/project/workspace @@ -809,6 +806,17 @@ workflows: - gcr requires: - contracts-bedrock-tests + - docker-publish: + name: contract-artifacts-bedrock-publish-dev + docker_file: ops/docker/Dockerfile.packages + docker_tags: us-central1-docker.pkg.dev/bedrock-goerli-development/images/contract-artifacts-bedrock:<> + target: contract-artifacts-bedrock + docker_context: . + repo: us-central1-docker.pkg.dev + context: + - gcr + requires: + - contracts-bedrock-tests - hive-test: name: hive-test-rpc version: <> @@ -836,126 +844,3 @@ workflows: - op-batcher-publish-dev - op-proposer-publish-dev - deployer-bedrock-publish-dev - - - nightly: - triggers: - - schedule: - cron: "0 10 * * *" - filters: - branches: - only: - - develop - jobs: - - yarn-monorepo - - docker-publish: - name: l2geth-release - docker_file: l2geth/Dockerfile - docker_tags: ethereumoptimism/l2geth:nightly - docker_context: . - context: - - optimism - - docker-publish: - name: gas-oracle-release - docker_file: gas-oracle/Dockerfile - docker_tags: ethereumoptimism/gas-oracle:nightly - docker_context: . - context: - - optimism - - docker-publish: - name: hardhat-node-release - docker_file: ops/docker/hardhat/Dockerfile - docker_tags: ethereumoptimism/hardhat-node:nightly - docker_context: ops/docker/hardhat - context: - - optimism - - docker-publish: - name: proxyd-release - docker_file: proxyd/Dockerfile - docker_tags: ethereumoptimism/proxyd:nightly - docker_context: . - context: - - optimism - - docker-publish: - name: l2geth-exporter-release - docker_file: l2geth-exporter/Dockerfile - docker_tags: ethereumoptimism/l2geth-exporter:nightly - docker_context: . - context: - - optimism - - docker-publish: - name: op-exporter-release - docker_file: op-exporter/Dockerfile - docker_tags: ethereumoptimism/op-exporter:nightly - docker_context: . - context: - - optimism - - docker-publish: - name: fault-detector-release - docker_file: ops/docker/Dockerfile.packages - docker_tags: ethereumoptimism/fault-detector:nightly - docker_context: . - target: fault-detector - context: - - optimism - - docker-publish: - name: drippie-mon-release - docker_file: ops/docker/Dockerfile.packages - docker_tags: ethereumoptimism/drippie-mon:nightly - docker_context: . - target: drippie-mon - context: - - optimism - - docker-publish: - name: message-relayer-release - docker_file: ops/docker/Dockerfile.packages - docker_tags: ethereumoptimism/message-relayer:nightly - docker_context: . - target: message-relayer - context: - - optimism - - docker-publish: - name: data-transport-layer-release - docker_file: ops/docker/Dockerfile.packages - docker_tags: ethereumoptimism/data-transport-layer:nightly - docker_context: . - target: data-transport-layer - context: - - optimism - - docker-publish: - name: integration-tests-release - docker_file: ops/docker/Dockerfile.packages - docker_tags: ethereumoptimism/integration-tests:nightly - docker_context: . - target: integration-tests - context: - - optimism - - docker-publish: - name: replica-healthcheck-release - docker_file: ops/docker/Dockerfile.packages - docker_tags: ethereumoptimism/replica-healthcheck:nightly - docker_context: . - target: replica-healthcheck - context: - - optimism - - docker-publish: - name: batch-submitter-service-release - docker_file: batch-submitter/Dockerfile - docker_tags: ethereumoptimism/batch-submitter-service:nightly - docker_context: . - context: - - optimism - - docker-publish: - name: indexer-release - docker_file: indexer/Dockerfile - docker_tags: ethereumoptimism/indexer:nightly - docker_context: . - context: - - optimism - - docker-publish: - name: teleportr-release - docker_file: teleportr/Dockerfile - docker_tags: ethereumoptimism/teleportr:nightly - docker_context: . - context: - - optimism diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6833c232d23ca..c10e3e4dc3e74 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -134,7 +134,7 @@ jobs: hardhat-node: name: Publish Hardhat Node ${{ needs.release.outputs.hardhat-node }} needs: release - if: needs.release.hardhat-node != '' + if: needs.release.outputs.hardhat-node != '' runs-on: ubuntu-latest steps: - name: Checkout diff --git a/.github/workflows/sync-tests.yml b/.github/workflows/sync-tests.yml index 8625780e70877..4f2264ccffaec 100644 --- a/.github/workflows/sync-tests.yml +++ b/.github/workflows/sync-tests.yml @@ -61,7 +61,7 @@ jobs: if: failure() uses: jwalton/gh-docker-logs@v1 with: - images: 'ethereumoptimism/hardhat,ethereumoptimism/deployer,ethereumoptimism/data-transport-layer,ethereumoptimism/l2geth,ethereumoptimism/message-relayer,ethereumoptimism/batch-submitter,ethereumoptimism/l2geth' + images: 'ethereumoptimism/hardhat-node,ethereumoptimism/deployer,ethereumoptimism/data-transport-layer,ethereumoptimism/l2geth,ethereumoptimism/message-relayer,ethereumoptimism/batch-submitter,ethereumoptimism/l2geth' dest: './logs' - name: Tar logs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5368c6d7ca79f..4a54d8be92b50 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ There are plenty of ways to contribute, in particular we appreciate support in t - Reporting issues. For security issues see [Security policy](https://github.com/ethereum-optimism/.github/blob/master/SECURITY.md). - Fixing and responding to existing issues. You can start off with those tagged ["good first issue"](https://github.com/ethereum-optimism/optimism/contribute) which are meant as introductory issues for external contributors. - Improving the [community site](https://community.optimism.io/)[documentation](https://github.com/ethereum-optimism/community-hub) and [tutorials](https://github.com/ethereum-optimism/optimism-tutorial). -- Become an "Optimizer" and answer questions in the [Optimism Discord](https://discord.com/invite/jrnFEvq). +- Become an "Optimizer" and answer questions in the [Optimism Discord](https://discord.optimism.io). - Get involved in the protocol design process by proposing changes or new features or write parts of the spec yourself in the [optimistic-specs repo](https://github.com/ethereum-optimism/optimistic-specs). Note that we have a [Code of Conduct](https://github.com/ethereum-optimism/.github/blob/master/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. diff --git a/Makefile b/Makefile index 5b36ef1e6dfdd..3a09ed9c76add 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ mod-tidy: # Below GOPRIVATE line allows mod-tidy to be run immediately after # releasing new versions. This bypasses the Go modules proxy, which # can take a while to index new versions. - # + # # See https://proxy.golang.org/ for more info. export GOPRIVATE="github.com/ethereum-optimism" && \ cd ./op-service && go mod tidy && cd .. && \ @@ -52,6 +52,7 @@ mod-tidy: cd ./op-proposer && go mod tidy && cd .. && \ cd ./op-batcher && go mod tidy && cd .. && \ cd ./op-bindings && go mod tidy && cd .. && \ + cd ./op-chain-ops && go mod tidy && cd .. && \ cd ./op-e2e && go mod tidy && cd .. .PHONY: mod-tidy @@ -108,27 +109,5 @@ clean-node-modules: tag-bedrock-go-modules: - @if [ -z "$(VERSION)" ]; then \ - echo "You must specify a version."; \ - exit 0; \ - fi - - @FIRST_CHAR=$(shell printf '%s' "$(VERSION)" | cut -c1); \ - if [ "$$FIRST_CHAR" != "v" ]; then \ - echo "Tag must start with v."; \ - exit 0; \ - fi - - git tag "op-proposer/$(VERSION)" - git tag "op-node/$(VERSION)" - git tag "op-e2e/$(VERSION)" - git tag "op-bindings/$(VERSION)" - git tag "op-batcher/$(VERSION)" - git tag "op-service/$(VERSION)" - git push $(BEDROCK_TAGS_REMOTE) "op-proposer/$(VERSION)" - git push $(BEDROCK_TAGS_REMOTE) "op-node/$(VERSION)" - git push $(BEDROCK_TAGS_REMOTE) "op-e2e/$(VERSION)" - git push $(BEDROCK_TAGS_REMOTE) "op-bindings/$(VERSION)" - git push $(BEDROCK_TAGS_REMOTE) "op-batcher/$(VERSION)" - git push $(BEDROCK_TAGS_REMOTE) "op-service/$(VERSION)" - + ./ops/scripts/tag-bedrock-go-modules.sh $(BEDROCK_TAGS_REMOTE) $(VERSION) +.PHONY: tag-bedrock-go-modules \ No newline at end of file diff --git a/batch-submitter/drivers/sequencer/encoding.go b/batch-submitter/drivers/sequencer/encoding.go index c0e87fc3dd31e..54c2066f73d4e 100644 --- a/batch-submitter/drivers/sequencer/encoding.go +++ b/batch-submitter/drivers/sequencer/encoding.go @@ -68,10 +68,10 @@ func (c BatchContext) MarkerBatchType() BatchType { // Write encodes the BatchContext into a 16-byte stream using the following // encoding: -// - num_sequenced_txs: 3 bytes -// - num_subsequent_queue_txs: 3 bytes -// - timestamp: 5 bytes -// - block_number: 5 bytes +// - num_sequenced_txs: 3 bytes +// - num_subsequent_queue_txs: 3 bytes +// - timestamp: 5 bytes +// - block_number: 5 bytes // // Note that writing to a bytes.Buffer cannot // error, so errors are ignored here @@ -85,10 +85,10 @@ func (c *BatchContext) Write(w *bytes.Buffer) { // Read decodes the BatchContext from the passed reader. If fewer than 16-bytes // remain, an error is returned. Otherwise the first 16-bytes will be read using // the expected encoding: -// - num_sequenced_txs: 3 bytes -// - num_subsequent_queue_txs: 3 bytes -// - timestamp: 5 bytes -// - block_number: 5 bytes +// - num_sequenced_txs: 3 bytes +// - num_subsequent_queue_txs: 3 bytes +// - timestamp: 5 bytes +// - block_number: 5 bytes func (c *BatchContext) Read(r io.Reader) error { if err := readUint64(r, &c.NumSequencedTxs, 3); err != nil { return err @@ -188,13 +188,13 @@ type AppendSequencerBatchParams struct { } // Write encodes the AppendSequencerBatchParams using the following format: -// - should_start_at_element: 5 bytes -// - total_elements_to_append: 3 bytes -// - num_contexts: 3 bytes -// - num_contexts * batch_context: num_contexts * 16 bytes -// - [num txs omitted] -// - tx_len: 3 bytes -// - tx_bytes: tx_len bytes +// - should_start_at_element: 5 bytes +// - total_elements_to_append: 3 bytes +// - num_contexts: 3 bytes +// - num_contexts * batch_context: num_contexts * 16 bytes +// - [num txs omitted] +// - tx_len: 3 bytes +// - tx_bytes: tx_len bytes // // Typed batches include a dummy context as the first context // where the timestamp is 0. The blocknumber is interpreted @@ -288,13 +288,13 @@ func (p *AppendSequencerBatchParams) Serialize( // stream does not terminate cleanly with an EOF while reading a tx_len, this // method will return an error. Otherwise, the stream will be parsed according // to the following format: -// - should_start_at_element: 5 bytes -// - total_elements_to_append: 3 bytes -// - num_contexts: 3 bytes -// - num_contexts * batch_context: num_contexts * 16 bytes -// - [num txs omitted] -// - tx_len: 3 bytes -// - tx_bytes: tx_len bytes +// - should_start_at_element: 5 bytes +// - total_elements_to_append: 3 bytes +// - num_contexts: 3 bytes +// - num_contexts * batch_context: num_contexts * 16 bytes +// - [num txs omitted] +// - tx_len: 3 bytes +// - tx_bytes: tx_len bytes func (p *AppendSequencerBatchParams) Read(r io.Reader) error { if err := readUint64(r, &p.ShouldStartAtElement, 5); err != nil { return err diff --git a/batch-submitter/drivers/sequencer/encoding_test.go b/batch-submitter/drivers/sequencer/encoding_test.go index 72618737fbbe5..329df3cd34fab 100644 --- a/batch-submitter/drivers/sequencer/encoding_test.go +++ b/batch-submitter/drivers/sequencer/encoding_test.go @@ -15,10 +15,10 @@ import ( // TestBatchContextEncodeDecode tests the (de)serialization of a BatchContext // against the spec test vector. The encoding should be: -// - num_sequenced_txs: 3 bytes -// - num_subsequent_queue_txs: 3 bytes -// - timestamp: 5 bytes -// - block_number: 5 bytes +// - num_sequenced_txs: 3 bytes +// - num_subsequent_queue_txs: 3 bytes +// - timestamp: 5 bytes +// - block_number: 5 bytes func TestBatchContextEncodeDecode(t *testing.T) { t.Parallel() diff --git a/bss-core/crypto.go b/bss-core/crypto.go index fec9a1429d953..0205665323fa1 100644 --- a/bss-core/crypto.go +++ b/bss-core/crypto.go @@ -32,8 +32,8 @@ func ParseAddress(address string) (common.Address, error) { // GetConfiguredPrivateKey computes the private key for our configured services. // The two supported methods are: -// - Derived from BIP39 mnemonic and BIP32 HD derivation path. -// - Directly from a serialized private key. +// - Derived from BIP39 mnemonic and BIP32 HD derivation path. +// - Directly from a serialized private key. func GetConfiguredPrivateKey(mnemonic, hdPath, privKeyStr string) ( *ecdsa.PrivateKey, error) { diff --git a/bss-core/crypto_test.go b/bss-core/crypto_test.go index e3bd0d937a129..d8f119da9bb32 100644 --- a/bss-core/crypto_test.go +++ b/bss-core/crypto_test.go @@ -209,9 +209,9 @@ func TestParsePrivateKeyStr(t *testing.T) { } // TestGetConfiguredPrivateKey asserts that GetConfiguredPrivateKey either: -// 1) Derives the correct private key assuming the BIP39 mnemonic and BIP32 +// 1. Derives the correct private key assuming the BIP39 mnemonic and BIP32 // derivation path are both present and the private key string is omitted. -// 2) Parses the correct private key assuming only the private key string is +// 2. Parses the correct private key assuming only the private key string is // present, but the BIP39 mnemonic and BIP32 derivation path are omitted. func TestGetConfiguredPrivateKey(t *testing.T) { tests := []struct { diff --git a/bss-core/dial/l1_client.go b/bss-core/dial/l1_client.go index c7442adff61f7..bd3030ed12fcf 100644 --- a/bss-core/dial/l1_client.go +++ b/bss-core/dial/l1_client.go @@ -28,7 +28,7 @@ func L1EthClientWithTimeout(ctx context.Context, url string, disableHTTP2 bool) TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper), } } - + //nolint:staticcheck // Geth v1.10.23 uses rpc.DialOptions and rpc.WithClient, but we need to update geth first. Lint is flagged because of global go workspace usage. rpcClient, err := rpc.DialHTTPWithClient(url, httpClient) if err != nil { return nil, err diff --git a/bss-core/txmgr/txmgr.go b/bss-core/txmgr/txmgr.go index 28d6dc3fb9ee6..3e9d7362394ed 100644 --- a/bss-core/txmgr/txmgr.go +++ b/bss-core/txmgr/txmgr.go @@ -330,7 +330,8 @@ func waitMined( // CalcGasFeeCap deterministically computes the recommended gas fee cap given // the base fee and gasTipCap. The resulting gasFeeCap is equal to: -// gasTipCap + 2*baseFee. +// +// gasTipCap + 2*baseFee. func CalcGasFeeCap(baseFee, gasTipCap *big.Int) *big.Int { return new(big.Int).Add( gasTipCap, diff --git a/go.work b/go.work index 961edf2f35362..7494bd13ed609 100644 --- a/go.work +++ b/go.work @@ -19,7 +19,7 @@ use ( ./teleportr ) -replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 +replace github.com/ethereum/go-ethereum v1.10.23 => github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 // For local debugging: -//replace github.com/ethereum/go-ethereum v1.10.21 => ../go-ethereum +//replace github.com/ethereum/go-ethereum v1.10.23 => ../go-ethereum diff --git a/go.work.sum b/go.work.sum index b244efddbd15b..9a0bb5ace54f1 100644 --- a/go.work.sum +++ b/go.work.sum @@ -25,6 +25,8 @@ github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsvi github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/ethereum-optimism/op-geth v0.0.0-20220904174542-4311f9d2cead/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum-optimism/op-geth v0.0.0-20220906163738-712cb0a1c140/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= diff --git a/indexer/db/db.go b/indexer/db/db.go index 38fd5a63b0be7..fcfa060146a38 100644 --- a/indexer/db/db.go +++ b/indexer/db/db.go @@ -193,10 +193,20 @@ func (d *Database) AddIndexedL1Block(block *IndexedL1Block) error { const insertDepositStatement = ` INSERT INTO deposits - (guid, from_address, to_address, l1_token, l2_token, amount, tx_hash, log_index, block_hash, data) + (guid, from_address, to_address, l1_token, l2_token, amount, tx_hash, log_index, l1_block_hash, data) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ` + + const insertWithdrawalStatement = ` + INSERT INTO withdrawals + (guid, from_address, to_address, l1_token, l2_token, amount, tx_hash, log_index, l1_block_hash, data) + VALUES + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + ON CONFLICT (tx_hash) + DO UPDATE SET l1_block_hash = $9; + ` + return txn(d.db, func(tx *sql.Tx) error { _, err := tx.Exec( insertBlockStatement, @@ -232,6 +242,29 @@ func (d *Database) AddIndexedL1Block(block *IndexedL1Block) error { } } + if len(block.Withdrawals) == 0 { + return nil + } + + for _, withdrawal := range block.Withdrawals { + _, err = tx.Exec( + insertWithdrawalStatement, + NewGUID(), + withdrawal.FromAddress.String(), + withdrawal.ToAddress.String(), + withdrawal.L1Token.String(), + withdrawal.L2Token.String(), + withdrawal.Amount.String(), + withdrawal.TxHash.String(), + withdrawal.LogIndex, + block.Hash.String(), + withdrawal.Data, + ) + if err != nil { + return err + } + } + return nil }) } @@ -249,7 +282,7 @@ func (d *Database) AddIndexedL2Block(block *IndexedL2Block) error { const insertWithdrawalStatement = ` INSERT INTO withdrawals - (guid, from_address, to_address, l1_token, l2_token, amount, tx_hash, log_index, block_hash, data) + (guid, from_address, to_address, l1_token, l2_token, amount, tx_hash, log_index, l2_block_hash, data) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ` @@ -292,36 +325,6 @@ func (d *Database) AddIndexedL2Block(block *IndexedL2Block) error { }) } -// AddStateBatch inserts the state batches into the known state batches -// database. -func (d *Database) AddStateBatch(batches []StateBatch) error { - const insertStateBatchStatement = ` - INSERT INTO state_batches - (index, root, size, prev_total, extra_data, block_hash) - VALUES - ($1, $2, $3, $4, $5, $6) - ` - - return txn(d.db, func(tx *sql.Tx) error { - for _, sb := range batches { - _, err := tx.Exec( - insertStateBatchStatement, - sb.Index.Uint64(), - sb.Root.String(), - sb.Size.Uint64(), - sb.PrevTotal.Uint64(), - sb.ExtraData, - sb.BlockHash.String(), - ) - if err != nil { - return err - } - } - - return nil - }) -} - // GetDepositsByAddress returns the list of Deposits indexed for the given // address paginated by the given params. func (d *Database) GetDepositsByAddress(address common.Address, page PaginationParam) (*PaginatedDeposits, error) { @@ -333,7 +336,7 @@ func (d *Database) GetDepositsByAddress(address common.Address, page PaginationP l1_tokens.name, l1_tokens.symbol, l1_tokens.decimals, l1_blocks.number, l1_blocks.timestamp FROM deposits - INNER JOIN l1_blocks ON deposits.block_hash=l1_blocks.hash + INNER JOIN l1_blocks ON deposits.l1_block_hash=l1_blocks.hash INNER JOIN l1_tokens ON deposits.l1_token=l1_tokens.address WHERE deposits.from_address = $1 ORDER BY l1_blocks.timestamp LIMIT $2 OFFSET $3; ` @@ -372,7 +375,7 @@ func (d *Database) GetDepositsByAddress(address common.Address, page PaginationP SELECT count(*) FROM deposits - INNER JOIN l1_blocks ON deposits.block_hash=l1_blocks.hash + INNER JOIN l1_blocks ON deposits.l1_block_hash=l1_blocks.hash INNER JOIN l1_tokens ON deposits.l1_token=l1_tokens.address WHERE deposits.from_address = $1; ` @@ -398,54 +401,43 @@ func (d *Database) GetDepositsByAddress(address common.Address, page PaginationP }, nil } -// GetWithdrawalBatch returns the StateBatch corresponding to the given -// withdrawal transaction hash. -func (d *Database) GetWithdrawalBatch(hash common.Hash) (*StateBatchJSON, error) { - const selectWithdrawalBatchStatement = ` +// GetWithdrawalStatus returns the finalization status corresponding to the +// given withdrawal transaction hash. +func (d *Database) GetWithdrawalStatus(hash common.Hash) (*WithdrawalJSON, error) { + const selectWithdrawalStatement = ` SELECT - state_batches.index, state_batches.root, state_batches.size, state_batches.prev_total, state_batches.extra_data, state_batches.block_hash, - l1_blocks.number, l1_blocks.timestamp - FROM state_batches - INNER JOIN l1_blocks ON state_batches.block_hash = l1_blocks.hash - WHERE size + prev_total >= ( - SELECT - number - FROM - withdrawals - INNER JOIN l2_blocks ON withdrawals.block_hash = l2_blocks.hash where tx_hash=$1 - ) ORDER BY "index" LIMIT 1; + withdrawals.guid, withdrawals.from_address, withdrawals.to_address, + withdrawals.amount, withdrawals.tx_hash, withdrawals.data, + withdrawals.l1_token, withdrawals.l2_token, + l2_tokens.name, l2_tokens.symbol, l2_tokens.decimals, + l1_blocks.number, l1_blocks.timestamp, + l2_blocks.number, l2_blocks.timestamp + FROM withdrawals + INNER JOIN l1_blocks ON withdrawals.l1_block_hash=l1_blocks.hash + INNER JOIN l2_blocks ON withdrawals.l2_block_hash=l2_blocks.hash + INNER JOIN l2_tokens ON withdrawals.l2_token=l2_tokens.address + WHERE withdrawals.tx_hash = $1; ` - var batch *StateBatchJSON + var withdrawal *WithdrawalJSON err := txn(d.db, func(tx *sql.Tx) error { - row := tx.QueryRow(selectWithdrawalBatchStatement, hash.String()) + row := tx.QueryRow(selectWithdrawalStatement, hash.String()) if row.Err() != nil { return row.Err() } - var index, size, prevTotal, blockNumber, blockTimestamp uint64 - var root, blockHash string - var extraData []byte - err := row.Scan(&index, &root, &size, &prevTotal, &extraData, &blockHash, - &blockNumber, &blockTimestamp) - if err != nil { - if errors.Is(err, sql.ErrNoRows) { - batch = nil - return nil - } + var l2Token Token + if err := row.Scan( + &withdrawal.GUID, &withdrawal.FromAddress, &withdrawal.ToAddress, + &withdrawal.Amount, &withdrawal.TxHash, &withdrawal.Data, + &withdrawal.L1Token, &l2Token.Address, + &l2Token.Name, &l2Token.Symbol, &l2Token.Decimals, + &withdrawal.L1BlockNumber, &withdrawal.L1BlockTimestamp, + &withdrawal.L2BlockNumber, &withdrawal.L2BlockTimestamp, + ); err != nil { return err } - - batch = &StateBatchJSON{ - Index: index, - Root: root, - Size: size, - PrevTotal: prevTotal, - ExtraData: extraData, - BlockHash: blockHash, - BlockNumber: blockNumber, - BlockTimestamp: blockTimestamp, - } + withdrawal.L2Token = &l2Token return nil }) @@ -453,7 +445,7 @@ func (d *Database) GetWithdrawalBatch(hash common.Hash) (*StateBatchJSON, error) return nil, err } - return batch, nil + return withdrawal, nil } // GetWithdrawalsByAddress returns the list of Withdrawals indexed for the given @@ -467,7 +459,7 @@ func (d *Database) GetWithdrawalsByAddress(address common.Address, page Paginati l2_tokens.name, l2_tokens.symbol, l2_tokens.decimals, l2_blocks.number, l2_blocks.timestamp FROM withdrawals - INNER JOIN l2_blocks ON withdrawals.block_hash=l2_blocks.hash + INNER JOIN l2_blocks ON withdrawals.l2_block_hash=l2_blocks.hash INNER JOIN l2_tokens ON withdrawals.l2_token=l2_tokens.address WHERE withdrawals.from_address = $1 ORDER BY l2_blocks.timestamp LIMIT $2 OFFSET $3; ` @@ -488,7 +480,7 @@ func (d *Database) GetWithdrawalsByAddress(address common.Address, page Paginati &withdrawal.Amount, &withdrawal.TxHash, &withdrawal.Data, &withdrawal.L1Token, &l2Token.Address, &l2Token.Name, &l2Token.Symbol, &l2Token.Decimals, - &withdrawal.BlockNumber, &withdrawal.BlockTimestamp, + &withdrawal.L2BlockNumber, &withdrawal.L2BlockTimestamp, ); err != nil { return err } @@ -503,16 +495,11 @@ func (d *Database) GetWithdrawalsByAddress(address common.Address, page Paginati return nil, err } - for i := range withdrawals { - batch, _ := d.GetWithdrawalBatch(common.HexToHash(withdrawals[i].TxHash)) - withdrawals[i].Batch = batch - } - const selectWithdrawalCountStatement = ` SELECT count(*) FROM withdrawals - INNER JOIN l2_blocks ON withdrawals.block_hash=l2_blocks.hash + INNER JOIN l2_blocks ON withdrawals.l2_block_hash=l2_blocks.hash INNER JOIN l2_tokens ON withdrawals.l2_token=l2_tokens.address WHERE withdrawals.from_address = $1; ` @@ -660,9 +647,9 @@ func (d *Database) GetIndexedL1BlockByHash(hash common.Hash) (*IndexedL1Block, e } const getAirdropQuery = ` -SELECT +SELECT address, voter_amount, multisig_signer_amount, gitcoin_amount, - active_bridged_amount, op_user_amount, op_repeat_user_amount, + active_bridged_amount, op_user_amount, op_repeat_user_amount, bonus_amount, total_amount FROM airdrops WHERE address = $1 @@ -671,7 +658,7 @@ WHERE address = $1 func (d *Database) GetAirdrop(address common.Address) (*Airdrop, error) { row := d.db.QueryRow(getAirdropQuery, strings.ToLower(address.String())) if row.Err() != nil { - return nil, fmt.Errorf("error getting airdrop: %v", row.Err()) + return nil, fmt.Errorf("error getting airdrop: %w", row.Err()) } airdrop := new(Airdrop) @@ -690,7 +677,7 @@ func (d *Database) GetAirdrop(address common.Address) (*Airdrop, error) { return nil, nil } if err != nil { - return nil, fmt.Errorf("error scanning airdrop: %v", err) + return nil, fmt.Errorf("error scanning airdrop: %w", err) } return airdrop, nil } diff --git a/indexer/db/l1block.go b/indexer/db/l1block.go index 839d75010a58b..73dd33348b985 100644 --- a/indexer/db/l1block.go +++ b/indexer/db/l1block.go @@ -6,11 +6,12 @@ import ( // IndexedL1Block contains the L1 block including the deposits in it. type IndexedL1Block struct { - Hash common.Hash - ParentHash common.Hash - Number uint64 - Timestamp uint64 - Deposits []Deposit + Hash common.Hash + ParentHash common.Hash + Number uint64 + Timestamp uint64 + Deposits []Deposit + Withdrawals []Withdrawal } // String returns the block hash for the indexed l1 block. @@ -24,6 +25,7 @@ type IndexedL2Block struct { ParentHash common.Hash Number uint64 Timestamp uint64 + Deposits []Deposit Withdrawals []Withdrawal } diff --git a/indexer/db/sql.go b/indexer/db/sql.go index 08a9c8547ee6c..2bd161df879d7 100644 --- a/indexer/db/sql.go +++ b/indexer/db/sql.go @@ -28,8 +28,10 @@ CREATE TABLE IF NOT EXISTS deposits ( amount VARCHAR NOT NULL, data BYTEA NOT NULL, log_index INTEGER NOT NULL, - block_hash VARCHAR NOT NULL REFERENCES l1_blocks(hash), - tx_hash VARCHAR NOT NULL + l1_block_hash VARCHAR NOT NULL REFERENCES l1_blocks(hash), + l2_block_hash VARCHAR REFERENCES l2_blocks(hash), + tx_hash VARCHAR NOT NULL, + failed BOOLEAN NOT NULL DEFAULT false ) ` @@ -51,20 +53,6 @@ CREATE TABLE IF NOT EXISTS l2_tokens ( ) ` -const createStateBatchesTable = ` -CREATE TABLE IF NOT EXISTS state_batches ( - index INTEGER NOT NULL PRIMARY KEY, - root VARCHAR NOT NULL, - size INTEGER NOT NULL, - prev_total INTEGER NOT NULL, - extra_data BYTEA NOT NULL, - block_hash VARCHAR NOT NULL REFERENCES l1_blocks(hash) -); -CREATE INDEX IF NOT EXISTS state_batches_block_hash ON state_batches(block_hash); -CREATE INDEX IF NOT EXISTS state_batches_size ON state_batches(size); -CREATE INDEX IF NOT EXISTS state_batches_prev_total ON state_batches(prev_total); -` - const createWithdrawalsTable = ` CREATE TABLE IF NOT EXISTS withdrawals ( guid VARCHAR PRIMARY KEY NOT NULL, @@ -75,9 +63,9 @@ CREATE TABLE IF NOT EXISTS withdrawals ( amount VARCHAR NOT NULL, data BYTEA NOT NULL, log_index INTEGER NOT NULL, - block_hash VARCHAR NOT NULL REFERENCES l2_blocks(hash), + l1_block_hash VARCHAR REFERENCES l1_blocks(hash), + l2_block_hash VARCHAR NOT NULL REFERENCES l2_blocks(hash), tx_hash VARCHAR NOT NULL, - state_batch INTEGER REFERENCES state_batches(index) ) ` @@ -127,7 +115,6 @@ var schema = []string{ createL2BlocksTable, createL1TokensTable, createL2TokensTable, - createStateBatchesTable, insertETHL1Token, insertETHL2Token, createDepositsTable, diff --git a/indexer/db/state_batch.go b/indexer/db/state_batch.go deleted file mode 100644 index c8d820a4a1c2a..0000000000000 --- a/indexer/db/state_batch.go +++ /dev/null @@ -1,30 +0,0 @@ -package db - -import ( - "math/big" - - "github.com/ethereum/go-ethereum/common" -) - -// StateBatch is the state batch containing merkle root of the withdrawals -// periodically written to L1. -type StateBatch struct { - Index *big.Int - Root common.Hash - Size *big.Int - PrevTotal *big.Int - ExtraData []byte - BlockHash common.Hash -} - -// StateBatchJSON contains StateBatch data suitable for JSON serialization. -type StateBatchJSON struct { - Index uint64 `json:"index"` - Root string `json:"root"` - Size uint64 `json:"size"` - PrevTotal uint64 `json:"prevTotal"` - ExtraData []byte `json:"extraData"` - BlockHash string `json:"blockHash"` - BlockNumber uint64 `json:"blockNumber"` - BlockTimestamp uint64 `json:"blockTimestamp"` -} diff --git a/indexer/db/withdrawal.go b/indexer/db/withdrawal.go index 032b1d77101f1..da7fb1cbee799 100644 --- a/indexer/db/withdrawal.go +++ b/indexer/db/withdrawal.go @@ -26,16 +26,17 @@ func (w Withdrawal) String() string { // WithdrawalJSON contains Withdrawal data suitable for JSON serialization. type WithdrawalJSON struct { - GUID string `json:"guid"` - FromAddress string `json:"from"` - ToAddress string `json:"to"` - L1Token string `json:"l1Token"` - L2Token *Token `json:"l2Token"` - Amount string `json:"amount"` - Data []byte `json:"data"` - LogIndex uint64 `json:"logIndex"` - BlockNumber uint64 `json:"blockNumber"` - BlockTimestamp string `json:"blockTimestamp"` - TxHash string `json:"transactionHash"` - Batch *StateBatchJSON `json:"batch"` + GUID string `json:"guid"` + FromAddress string `json:"from"` + ToAddress string `json:"to"` + L1Token string `json:"l1Token"` + L2Token *Token `json:"l2Token"` + Amount string `json:"amount"` + Data []byte `json:"data"` + LogIndex uint64 `json:"logIndex"` + L1BlockNumber uint64 `json:"l1BlockNumber"` + L1BlockTimestamp string `json:"l1BlockTimestamp"` + L2BlockNumber uint64 `json:"l2BlockNumber"` + L2BlockTimestamp string `json:"l2BlockTimestamp"` + TxHash string `json:"transactionHash"` } diff --git a/indexer/indexer.go b/indexer/indexer.go index 8235f1a5903e6..eb9269b7aad67 100644 --- a/indexer/indexer.go +++ b/indexer/indexer.go @@ -212,7 +212,7 @@ func (b *Indexer) Serve() error { b.router.HandleFunc("/v1/l1/status", b.l1IndexingService.GetIndexerStatus).Methods("GET") b.router.HandleFunc("/v1/l2/status", b.l2IndexingService.GetIndexerStatus).Methods("GET") b.router.HandleFunc("/v1/deposits/0x{address:[a-fA-F0-9]{40}}", b.l1IndexingService.GetDeposits).Methods("GET") - b.router.HandleFunc("/v1/withdrawal/0x{hash:[a-fA-F0-9]{64}}", b.l2IndexingService.GetWithdrawalBatch).Methods("GET") + b.router.HandleFunc("/v1/withdrawal/0x{hash:[a-fA-F0-9]{64}}", b.l2IndexingService.GetWithdrawalStatus).Methods("GET") b.router.HandleFunc("/v1/withdrawals/0x{address:[a-fA-F0-9]{40}}", b.l2IndexingService.GetWithdrawals).Methods("GET") b.router.HandleFunc("/v1/airdrops/0x{address:[a-fA-F0-9]{40}}", b.airdropService.GetAirdrop) b.router.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { diff --git a/indexer/metrics/metrics.go b/indexer/metrics/metrics.go index 6027d13fd91e5..2a0e895ee9472 100644 --- a/indexer/metrics/metrics.go +++ b/indexer/metrics/metrics.go @@ -21,8 +21,6 @@ type Metrics struct { WithdrawalsCount *prometheus.CounterVec - StateBatchesCount prometheus.Counter - L1CatchingUp prometheus.Gauge L2CatchingUp prometheus.Gauge @@ -74,12 +72,6 @@ func NewMetrics(monitoredTokens map[string]string) *Metrics { "symbol", }), - StateBatchesCount: promauto.NewCounter(prometheus.CounterOpts{ - Name: "state_batches_count", - Help: "The number of state batches indexed.", - Namespace: metricsNamespace, - }), - L1CatchingUp: promauto.NewGauge(prometheus.GaugeOpts{ Name: "l1_catching_up", Help: "Whether or not L1 is far behind the chain tip.", @@ -168,10 +160,6 @@ func (m *Metrics) RecordWithdrawal(addr common.Address) { m.WithdrawalsCount.WithLabelValues(sym).Inc() } -func (m *Metrics) RecordStateBatches(count int) { - m.StateBatchesCount.Add(float64(count)) -} - func (m *Metrics) SetL1CatchingUp(state bool) { var catchingUp float64 if state { diff --git a/indexer/services/l1/bridge/bridge.go b/indexer/services/l1/bridge/bridge.go index 42a6b0dad35f4..9c130bc0c91f3 100644 --- a/indexer/services/l1/bridge/bridge.go +++ b/indexer/services/l1/bridge/bridge.go @@ -13,10 +13,12 @@ import ( ) type DepositsMap map[common.Hash][]db.Deposit +type WithdrawalsMap map[common.Hash][]db.Withdrawal // Finalizations type Bridge interface { Address() common.Address GetDepositsByBlockRange(uint64, uint64) (DepositsMap, error) + GetWithdrawalsByBlockRange(uint64, uint64) (WithdrawalsMap, error) String() string } diff --git a/indexer/services/l1/bridge/eth_bridge.go b/indexer/services/l1/bridge/eth_bridge.go index fd6251a74dde9..dafa87c084b60 100644 --- a/indexer/services/l1/bridge/eth_bridge.go +++ b/indexer/services/l1/bridge/eth_bridge.go @@ -50,6 +50,36 @@ func (e *EthBridge) GetDepositsByBlockRange(start, end uint64) (DepositsMap, err return depositsByBlockhash, nil } +func (s *EthBridge) GetWithdrawalsByBlockRange(start, end uint64) (WithdrawalsMap, error) { + withdrawalsByBlockHash := make(WithdrawalsMap) + + iter, err := FilterETHWithdrawalFinalizedWithRetry(s.ctx, s.filterer, &bind.FilterOpts{ + Start: start, + End: &end, + }) + + if err != nil { + logger.Error("Error fetching filter", "err", err) + } + + for iter.Next() { + withdrawalsByBlockHash[iter.Event.Raw.BlockHash] = append( + withdrawalsByBlockHash[iter.Event.Raw.BlockHash], db.Withdrawal{ + TxHash: iter.Event.Raw.TxHash, + FromAddress: iter.Event.From, + ToAddress: iter.Event.To, + Amount: iter.Event.Amount, + Data: iter.Event.ExtraData, + LogIndex: iter.Event.Raw.Index, + }) + } + if err := iter.Error(); err != nil { + return nil, err + } + + return withdrawalsByBlockHash, nil +} + func (e *EthBridge) String() string { return e.name } diff --git a/indexer/services/l1/bridge/filter.go b/indexer/services/l1/bridge/filter.go index a3ccf60b277b9..d7d8b02b65146 100644 --- a/indexer/services/l1/bridge/filter.go +++ b/indexer/services/l1/bridge/filter.go @@ -43,3 +43,35 @@ func FilterERC20DepositInitiatedWithRetry(ctx context.Context, filterer *binding time.Sleep(clientRetryInterval) } } + +// FilterETHWithdrawalFinalizedWithRetry retries the given func until it succeeds, +// waiting for clientRetryInterval duration after every call. +func FilterETHWithdrawalFinalizedWithRetry(ctx context.Context, filterer *bindings.L1StandardBridgeFilterer, opts *bind.FilterOpts) (*bindings.L1StandardBridgeETHWithdrawalFinalizedIterator, error) { + for { + ctxt, cancel := context.WithTimeout(ctx, DefaultConnectionTimeout) + opts.Context = ctxt + res, err := filterer.FilterETHWithdrawalFinalized(opts, nil, nil) + cancel() + if err == nil { + return res, nil + } + logger.Error("Error fetching filter", "err", err) + time.Sleep(clientRetryInterval) + } +} + +// FilterERC20WithdrawalFinalizedWithRetry retries the given func until it succeeds, +// waiting for clientRetryInterval duration after every call. +func FilterERC20WithdrawalFinalizedWithRetry(ctx context.Context, filterer *bindings.L1StandardBridgeFilterer, opts *bind.FilterOpts) (*bindings.L1StandardBridgeERC20WithdrawalFinalizedIterator, error) { + for { + ctxt, cancel := context.WithTimeout(ctx, DefaultConnectionTimeout) + opts.Context = ctxt + res, err := filterer.FilterERC20WithdrawalFinalized(opts, nil, nil, nil) + cancel() + if err == nil { + return res, nil + } + logger.Error("Error fetching filter", "err", err) + time.Sleep(clientRetryInterval) + } +} diff --git a/indexer/services/l1/bridge/standard_bridge.go b/indexer/services/l1/bridge/standard_bridge.go index 1a3f90b951a21..031704bbc8071 100644 --- a/indexer/services/l1/bridge/standard_bridge.go +++ b/indexer/services/l1/bridge/standard_bridge.go @@ -52,6 +52,38 @@ func (s *StandardBridge) GetDepositsByBlockRange(start, end uint64) (DepositsMap return depositsByBlockhash, nil } +func (s *StandardBridge) GetWithdrawalsByBlockRange(start, end uint64) (WithdrawalsMap, error) { + withdrawalsByBlockHash := make(WithdrawalsMap) + + iter, err := FilterERC20WithdrawalFinalizedWithRetry(s.ctx, s.filterer, &bind.FilterOpts{ + Start: start, + End: &end, + }) + + if err != nil { + logger.Error("Error fetching filter", "err", err) + } + + for iter.Next() { + withdrawalsByBlockHash[iter.Event.Raw.BlockHash] = append( + withdrawalsByBlockHash[iter.Event.Raw.BlockHash], db.Withdrawal{ + TxHash: iter.Event.Raw.TxHash, + L1Token: iter.Event.L1Token, + L2Token: iter.Event.L2Token, + FromAddress: iter.Event.From, + ToAddress: iter.Event.To, + Amount: iter.Event.Amount, + Data: iter.Event.ExtraData, + LogIndex: iter.Event.Raw.Index, + }) + } + if err := iter.Error(); err != nil { + return nil, err + } + + return withdrawalsByBlockHash, nil +} + func (s *StandardBridge) String() string { return s.name } diff --git a/indexer/services/l1/service.go b/indexer/services/l1/service.go index f79ca272438d7..710af12365233 100644 --- a/indexer/services/l1/service.go +++ b/indexer/services/l1/service.go @@ -219,6 +219,7 @@ func (s *Service) Update(newHeader *types.Header) error { startHeight := headers[0].Number.Uint64() endHeight := headers[len(headers)-1].Number.Uint64() depositsByBlockHash := make(map[common.Hash][]db.Deposit) + withdrawalsByBlockHash := make(map[common.Hash][]db.Withdrawal) start := prometheus.NewTimer(s.metrics.UpdateDuration.WithLabelValues("l1")) defer func() { @@ -227,6 +228,7 @@ func (s *Service) Update(newHeader *types.Header) error { }() bridgeDepositsCh := make(chan bridge.DepositsMap, len(s.bridges)) + bridgeWdsCh := make(chan bridge.WithdrawalsMap, len(s.bridges)) errCh := make(chan error, len(s.bridges)) for _, bridgeImpl := range s.bridges { @@ -238,6 +240,14 @@ func (s *Service) Update(newHeader *types.Header) error { } bridgeDepositsCh <- deposits }(bridgeImpl) + go func(b bridge.Bridge) { + withdrawals, err := b.GetWithdrawalsByBlockRange(startHeight, endHeight) + if err != nil { + errCh <- err + return + } + bridgeWdsCh <- withdrawals + }(bridgeImpl) } var receives int @@ -246,13 +256,23 @@ func (s *Service) Update(newHeader *types.Header) error { case bridgeDeposits := <-bridgeDepositsCh: for blockHash, deposits := range bridgeDeposits { for _, deposit := range deposits { - if err := s.cacheToken(deposit); err != nil { + if err := s.cacheToken(deposit.L1Token); err != nil { logger.Warn("error caching token", "err", err) } } depositsByBlockHash[blockHash] = append(depositsByBlockHash[blockHash], deposits...) } + case bridgeWithdrawals := <-bridgeWdsCh: + for blockHash, withdrawals := range bridgeWithdrawals { + for _, withdrawal := range withdrawals { + if err := s.cacheToken(withdrawal.L1Token); err != nil { + logger.Warn("error caching token", "err", err) + } + } + + withdrawalsByBlockHash[blockHash] = append(withdrawalsByBlockHash[blockHash], withdrawals...) + } case err := <-errCh: return err } @@ -263,6 +283,51 @@ func (s *Service) Update(newHeader *types.Header) error { } } + for i, header := range headers { + blockHash := header.Hash + number := header.Number.Uint64() + deposits := depositsByBlockHash[blockHash] + withdrawals := withdrawalsByBlockHash[blockHash] + + if len(deposits) == 0 && len(withdrawals) == 0 && i != len(headers)-1 { + continue + } + + block := &db.IndexedL1Block{ + Hash: blockHash, + ParentHash: header.ParentHash, + Number: number, + Timestamp: header.Time, + Deposits: deposits, + Withdrawals: withdrawals, + } + + err := s.cfg.DB.AddIndexedL1Block(block) + if err != nil { + logger.Error( + "Unable to import ", + "block", number, + "hash", blockHash, + "err", err, + "block", block, + ) + return err + } + + logger.Debug("Imported ", + "block", number, "hash", blockHash, "deposits", len(block.Deposits)) + for _, deposit := range block.Deposits { + token := s.tokenCache[deposit.L2Token] + logger.Info( + "indexed deposit ", + "tx_hash", deposit.TxHash, + "symbol", token.Symbol, + "amount", deposit.Amount, + ) + s.metrics.RecordDeposit(deposit.L2Token) + } + } + newHeaderNumber := newHeader.Number.Uint64() s.metrics.SetL1SyncHeight(endHeight) s.metrics.SetL1SyncPercent(endHeight, newHeaderNumber) @@ -388,33 +453,33 @@ func (s *Service) catchUp(ctx context.Context) error { return nil } -func (s *Service) cacheToken(deposit db.Deposit) error { - if s.tokenCache[deposit.L1Token] != nil { +func (s *Service) cacheToken(address common.Address) error { + if s.tokenCache[address] != nil { return nil } - token, err := s.cfg.DB.GetL1TokenByAddress(deposit.L1Token.String()) + token, err := s.cfg.DB.GetL1TokenByAddress(address.String()) if err != nil { return err } if token != nil { s.metrics.IncL1CachedTokensCount() - s.tokenCache[deposit.L1Token] = token + s.tokenCache[address] = token return nil } - token, err = QueryERC20(deposit.L1Token, s.cfg.L1Client) + token, err = QueryERC20(address, s.cfg.L1Client) if err != nil { logger.Error("Error querying ERC20 token details", - "l1_token", deposit.L1Token.String(), "err", err) + "l1_token", address.String(), "err", err) token = &db.Token{ - Address: deposit.L1Token.String(), + Address: address.String(), } } - if err := s.cfg.DB.AddL1Token(deposit.L1Token.String(), token); err != nil { + if err := s.cfg.DB.AddL1Token(address.String(), token); err != nil { return err } - s.tokenCache[deposit.L1Token] = token + s.tokenCache[address] = token s.metrics.IncL1CachedTokensCount() return nil } diff --git a/indexer/services/l2/bridge/bridge.go b/indexer/services/l2/bridge/bridge.go index 6f062ad8badff..ff420a352967f 100644 --- a/indexer/services/l2/bridge/bridge.go +++ b/indexer/services/l2/bridge/bridge.go @@ -12,10 +12,12 @@ import ( "github.com/ethereum/go-ethereum/common" ) +type DepositsMap map[common.Hash][]db.Deposit // Finalizations type WithdrawalsMap map[common.Hash][]db.Withdrawal type Bridge interface { Address() common.Address + GetDepositsByBlockRange(uint64, uint64) (DepositsMap, error) GetWithdrawalsByBlockRange(uint64, uint64) (WithdrawalsMap, error) String() string } diff --git a/indexer/services/l2/bridge/filter.go b/indexer/services/l2/bridge/filter.go index 0047342d39905..0d1987fbdff37 100644 --- a/indexer/services/l2/bridge/filter.go +++ b/indexer/services/l2/bridge/filter.go @@ -27,3 +27,35 @@ func FilterWithdrawalInitiatedWithRetry(ctx context.Context, filterer *bindings. time.Sleep(clientRetryInterval) } } + +// FilterDepositFinalizedWithRetry retries the given func until it succeeds, +// waiting for clientRetryInterval duration after every call. +func FilterDepositFinalizedWithRetry(ctx context.Context, filterer *bindings.L2StandardBridgeFilterer, opts *bind.FilterOpts) (*bindings.L2StandardBridgeDepositFinalizedIterator, error) { + for { + ctxt, cancel := context.WithTimeout(ctx, DefaultConnectionTimeout) + opts.Context = ctxt + res, err := filterer.FilterDepositFinalized(opts, nil, nil, nil) + cancel() + if err == nil { + return res, nil + } + logger.Error("Error fetching filter", "err", err) + time.Sleep(clientRetryInterval) + } +} + +// FilterDepositFailedWithRetry retries the given func until it succeeds, +// waiting for clientRetryInterval duration after every call. +func FilterDepositFailedWithRetry(ctx context.Context, filterer *bindings.L2StandardBridgeFilterer, opts *bind.FilterOpts) (*bindings.L2StandardBridgeDepositFailedIterator, error) { + for { + ctxt, cancel := context.WithTimeout(ctx, DefaultConnectionTimeout) + opts.Context = ctxt + res, err := filterer.FilterDepositFailed(opts, nil, nil, nil) + cancel() + if err == nil { + return res, nil + } + logger.Error("Error fetching filter", "err", err) + time.Sleep(clientRetryInterval) + } +} diff --git a/indexer/services/l2/bridge/standard_bridge.go b/indexer/services/l2/bridge/standard_bridge.go index f24915ae63efd..fdbed6863b61f 100644 --- a/indexer/services/l2/bridge/standard_bridge.go +++ b/indexer/services/l2/bridge/standard_bridge.go @@ -22,6 +22,37 @@ func (s *StandardBridge) Address() common.Address { return s.address } +func (s *StandardBridge) GetDepositsByBlockRange(start, end uint64) (DepositsMap, error) { + depositsByBlockhash := make(DepositsMap) + + iter, err := FilterDepositFinalizedWithRetry(s.ctx, s.filterer, &bind.FilterOpts{ + Start: start, + End: &end, + }) + if err != nil { + logger.Error("Error fetching filter", "err", err) + } + + for iter.Next() { + depositsByBlockhash[iter.Event.Raw.BlockHash] = append( + depositsByBlockhash[iter.Event.Raw.BlockHash], db.Deposit{ + TxHash: iter.Event.Raw.TxHash, + L1Token: iter.Event.L1Token, + L2Token: iter.Event.L2Token, + FromAddress: iter.Event.From, + ToAddress: iter.Event.To, + Amount: iter.Event.Amount, + Data: iter.Event.ExtraData, + LogIndex: iter.Event.Raw.Index, + }) + } + if err := iter.Error(); err != nil { + return nil, err + } + + return depositsByBlockhash, nil +} + func (s *StandardBridge) GetWithdrawalsByBlockRange(start, end uint64) (WithdrawalsMap, error) { withdrawalsByBlockhash := make(map[common.Hash][]db.Withdrawal) diff --git a/indexer/services/l2/service.go b/indexer/services/l2/service.go index ecd2e61332f9e..a6a24f13f996a 100644 --- a/indexer/services/l2/service.go +++ b/indexer/services/l2/service.go @@ -218,6 +218,7 @@ func (s *Service) Update(newHeader *types.Header) error { startHeight := headers[0].Number.Uint64() endHeight := headers[len(headers)-1].Number.Uint64() + depositsByBlockHash := make(map[common.Hash][]db.Deposit) withdrawalsByBlockHash := make(map[common.Hash][]db.Withdrawal) start := prometheus.NewTimer(s.metrics.UpdateDuration.WithLabelValues("l2")) @@ -226,10 +227,19 @@ func (s *Service) Update(newHeader *types.Header) error { logger.Info("updated index", "start_height", startHeight, "end_height", endHeight, "duration", dur) }() + bridgeDepositsCh := make(chan bridge.DepositsMap, len(s.bridges)) bridgeWdsCh := make(chan bridge.WithdrawalsMap) errCh := make(chan error, len(s.bridges)) for _, bridgeImpl := range s.bridges { + go func(b bridge.Bridge) { + deposits, err := b.GetDepositsByBlockRange(startHeight, endHeight) + if err != nil { + errCh <- err + return + } + bridgeDepositsCh <- deposits + }(bridgeImpl) go func(b bridge.Bridge) { wds, err := b.GetWithdrawalsByBlockRange(startHeight, endHeight) if err != nil { @@ -246,13 +256,23 @@ func (s *Service) Update(newHeader *types.Header) error { case bridgeWds := <-bridgeWdsCh: for blockHash, withdrawals := range bridgeWds { for _, wd := range withdrawals { - if err := s.cacheToken(wd); err != nil { + if err := s.cacheToken(wd.L2Token); err != nil { logger.Warn("error caching token", "err", err) } } withdrawalsByBlockHash[blockHash] = append(withdrawalsByBlockHash[blockHash], withdrawals...) } + case bridgeDeposits := <-bridgeDepositsCh: + for blockHash, deposits := range bridgeDeposits { + for _, deposit := range deposits { + if err := s.cacheToken(deposit.L2Token); err != nil { + logger.Warn("error caching token", "err", err) + } + } + + depositsByBlockHash[blockHash] = append(depositsByBlockHash[blockHash], deposits...) + } case err := <-errCh: return err } @@ -266,6 +286,7 @@ func (s *Service) Update(newHeader *types.Header) error { for i, header := range headers { blockHash := header.Hash() number := header.Number.Uint64() + deposits := depositsByBlockHash[blockHash] withdrawals := withdrawalsByBlockHash[blockHash] if len(withdrawals) == 0 && i != len(headers)-1 { @@ -277,6 +298,7 @@ func (s *Service) Update(newHeader *types.Header) error { ParentHash: header.ParentHash, Number: number, Timestamp: header.Time, + Deposits: deposits, Withdrawals: withdrawals, } @@ -336,16 +358,16 @@ func (s *Service) GetIndexerStatus(w http.ResponseWriter, r *http.Request) { server.RespondWithJSON(w, http.StatusOK, status) } -func (s *Service) GetWithdrawalBatch(w http.ResponseWriter, r *http.Request) { +func (s *Service) GetWithdrawalStatus(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - batch, err := s.cfg.DB.GetWithdrawalBatch(common.HexToHash(vars["hash"])) + withdrawal, err := s.cfg.DB.GetWithdrawalStatus(common.HexToHash(vars["hash"])) if err != nil { server.RespondWithError(w, http.StatusInternalServerError, err.Error()) return } - server.RespondWithJSON(w, http.StatusOK, batch) + server.RespondWithJSON(w, http.StatusOK, withdrawal) } func (s *Service) GetWithdrawals(w http.ResponseWriter, r *http.Request) { @@ -443,32 +465,32 @@ func (s *Service) catchUp(ctx context.Context) error { return nil } -func (s *Service) cacheToken(withdrawal db.Withdrawal) error { - if s.tokenCache[withdrawal.L2Token] != nil { +func (s *Service) cacheToken(address common.Address) error { + if s.tokenCache[address] != nil { return nil } - token, err := s.cfg.DB.GetL2TokenByAddress(withdrawal.L2Token.String()) + token, err := s.cfg.DB.GetL2TokenByAddress(address.String()) if err != nil { return err } if token != nil { s.metrics.IncL2CachedTokensCount() - s.tokenCache[withdrawal.L2Token] = token + s.tokenCache[address] = token return nil } - token, err = QueryERC20(withdrawal.L2Token, s.cfg.L2Client) + token, err = QueryERC20(address, s.cfg.L2Client) if err != nil { logger.Error("Error querying ERC20 token details", - "l2_token", withdrawal.L2Token.String(), "err", err) + "l2_token", address.String(), "err", err) token = &db.Token{ - Address: withdrawal.L2Token.String(), + Address: address.String(), } } - if err := s.cfg.DB.AddL2Token(withdrawal.L2Token.String(), token); err != nil { + if err := s.cfg.DB.AddL2Token(address.String(), token); err != nil { return err } - s.tokenCache[withdrawal.L2Token] = token + s.tokenCache[address] = token s.metrics.IncL2CachedTokensCount() return nil } diff --git a/l2geth/internal/ethapi/api.go b/l2geth/internal/ethapi/api.go index a99fc73f7e248..c009509c2c9cd 100644 --- a/l2geth/internal/ethapi/api.go +++ b/l2geth/internal/ethapi/api.go @@ -1062,9 +1062,12 @@ func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash // EstimateGas returns an estimate of the amount of gas needed to execute the // given transaction against the current pending block. This is modified to // encode the fee in wei as gas price is always 1 -func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) { - blockNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) - return DoEstimateGas(ctx, s.b, args, blockNrOrHash, s.b.RPCGasCap()) +func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs, blockNrOrHash *rpc.BlockNumberOrHash) (hexutil.Uint64, error) { + bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + if blockNrOrHash != nil { + bNrOrHash = *blockNrOrHash + } + return DoEstimateGas(ctx, s.b, args, bNrOrHash, s.b.RPCGasCap()) } // ExecutionResult groups all structured logs emitted by the EVM diff --git a/op-batcher/Makefile b/op-batcher/Makefile index 3984219f257cf..b168dd5c0323a 100644 --- a/op-batcher/Makefile +++ b/op-batcher/Makefile @@ -17,7 +17,7 @@ test: go test -v ./... lint: - golangci-lint run -E asciicheck,goimports,misspell ./... + golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint -e "errors.As" -e "errors.Is" .PHONY: \ op-batcher \ diff --git a/op-batcher/batch_submitter.go b/op-batcher/batch_submitter.go index 4fed5942f0b04..2a38e218af601 100644 --- a/op-batcher/batch_submitter.go +++ b/op-batcher/batch_submitter.go @@ -284,7 +284,11 @@ mainLoop: l.log.Warn("issue fetching L2 head", "err", err) continue } - l.log.Info("Got new L2 sync status", "safe_head", syncStatus.SafeL2, "unsafe_head", syncStatus.UnsafeL2, "last_submitted", l.lastSubmittedBlock) + if syncStatus.HeadL1 == (eth.L1BlockRef{}) { + l.log.Info("Rollup node has no L1 head info yet") + continue + } + l.log.Info("Got new L2 sync status", "safe_head", syncStatus.SafeL2, "unsafe_head", syncStatus.UnsafeL2, "last_submitted", l.lastSubmittedBlock, "l1_head", syncStatus.HeadL1) if syncStatus.SafeL2.Number >= syncStatus.UnsafeL2.Number { l.log.Trace("No unsubmitted blocks from sequencer") continue @@ -299,7 +303,7 @@ mainLoop: l.log.Warn("last submitted block lagged behind L2 safe head: batch submission will continue from the safe head now", "last", l.lastSubmittedBlock, "safe", syncStatus.SafeL2) l.lastSubmittedBlock = syncStatus.SafeL2.ID() } - if ch, err := derive.NewChannelOut(syncStatus.HeadL1.Time); err != nil { + if ch, err := derive.NewChannelOut(); err != nil { l.log.Error("Error creating channel", "err", err) continue } else { diff --git a/op-batcher/go.mod b/op-batcher/go.mod index 6a80f92def790..e0e4e15754124 100644 --- a/op-batcher/go.mod +++ b/op-batcher/go.mod @@ -3,10 +3,10 @@ module github.com/ethereum-optimism/optimism/op-batcher go 1.18 require ( - github.com/ethereum-optimism/optimism/op-node v0.5.0 - github.com/ethereum-optimism/optimism/op-proposer v0.5.0 - github.com/ethereum-optimism/optimism/op-service v0.5.0 - github.com/ethereum/go-ethereum v1.10.21 + github.com/ethereum-optimism/optimism/op-node v0.8.6 + github.com/ethereum-optimism/optimism/op-proposer v0.8.6 + github.com/ethereum-optimism/optimism/op-service v0.8.6 + github.com/ethereum/go-ethereum v1.10.23 github.com/miguelmota/go-ethereum-hdwallet v0.1.1 github.com/urfave/cli v1.22.9 ) @@ -22,7 +22,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/ethereum-optimism/optimism/op-bindings v0.5.0 // indirect + github.com/ethereum-optimism/optimism/op-bindings v0.8.6 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -70,4 +70,4 @@ require ( gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect ) -replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 +replace github.com/ethereum/go-ethereum v1.10.23 => github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 diff --git a/op-batcher/go.sum b/op-batcher/go.sum index d28a3cbe38360..00277cb6b9bdc 100644 --- a/op-batcher/go.sum +++ b/op-batcher/go.sum @@ -147,16 +147,16 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 h1:+WfrwiRELp3hoeb1bnPws3FtUUoYCDDYsCkwvKek5FY= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0 h1:bJT8KmDu5YAVOqPQHxHkntGlRrtRdTIsH+X28LOIcqU= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0/go.mod h1:Ft+sL57mlBysH6nuXZA11GLMMajfBa8SjpEBtitl1Vw= -github.com/ethereum-optimism/optimism/op-node v0.5.0 h1:MwNvYDBFS4quSWkEzfJBGJkzI1yveqQ/GuVK6aTJJ0A= -github.com/ethereum-optimism/optimism/op-node v0.5.0/go.mod h1:jzsaU998O9OISO7ybwpKKm01pQZFpydRPSXP9+U8MYA= -github.com/ethereum-optimism/optimism/op-proposer v0.5.0 h1:GHU2ldpH22/Nv8ZwLmoR5tQChm1yYzoMuExKlb4EazM= -github.com/ethereum-optimism/optimism/op-proposer v0.5.0/go.mod h1:WgjPZHTHuiFoA0rATQJ2vCr7sbM/NgdvJMeCfkh2YIY= -github.com/ethereum-optimism/optimism/op-service v0.5.0 h1:D0OyBbRGttT3geECT935W4DPhbVAibPWZAayWpEd+e4= -github.com/ethereum-optimism/optimism/op-service v0.5.0/go.mod h1:otr/BXzgcZmJKUl18v+WLJjtWoIwqoJ/L0/cNvIIkUs= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 h1:W/ZU6BZH7ilTrpdoJOF9N4OReqXbpeRtUB6klIpEdMA= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6 h1:jJYhmygt7hqGzYa+8sme9SdnKt1c3Y6EbWgIrRONoxw= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6/go.mod h1:gUX5317IAvRMjB4GftayM87JVln3DTqukfirwJpEWnE= +github.com/ethereum-optimism/optimism/op-node v0.8.6 h1:xNwN+Q/Rt17vSKawhBeG9qTcqcyh8JU8PGjK1iuGkF4= +github.com/ethereum-optimism/optimism/op-node v0.8.6/go.mod h1:gkyzgVHV3+tIhLZ8GhT+bL9GrrmouQCW4mKYukS0SHg= +github.com/ethereum-optimism/optimism/op-proposer v0.8.6 h1:iy8XAtkvrURBy3TT2Lf540cbWztxit7K4+BghZ4IsMI= +github.com/ethereum-optimism/optimism/op-proposer v0.8.6/go.mod h1:tuCLnXcO4MrtVyis1Yfo7wtL8EQta1u6zFdzHHj+RAc= +github.com/ethereum-optimism/optimism/op-service v0.8.6 h1:ruZp/BxL8TGn1y9EJmygypPTeVAFlAA0A/h8LsCoV+M= +github.com/ethereum-optimism/optimism/op-service v0.8.6/go.mod h1:gm8YNzERrL/CHBPWx3+01mR/NOVpLLw4GEUSnnTdyFU= github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= diff --git a/op-bindings/Makefile b/op-bindings/Makefile index afdbe547f9030..73c9cb876da40 100644 --- a/op-bindings/Makefile +++ b/op-bindings/Makefile @@ -2,10 +2,11 @@ SHELL := /bin/bash pkg := bindings -all: mkdir bindings deployed +all: mkdir bindings more bindings: l1block-bindings \ - l1-standard-bridge-bindings \ + l1-cross-domain-messenger-bindings \ + l1-standard-bridge-bindings \ l2-to-l1-message-passer-bindings \ optimism-portal-bindings \ l2-output-oracle-bindings \ @@ -16,70 +17,78 @@ bindings: l1block-bindings \ sequencer-fee-vault-bindings \ optimism-mintable-erc20-factory-bindings \ optimism-mintable-erc20-bindings \ + proxy-bindings \ + proxy-admin-bindings \ erc20-bindings \ weth9-bindings -deployed: l1-block-deployed \ - optimism-portal-deployed \ - l2-to-l1-message-passer-deployed \ - gas-price-oracle-deployed +compile: + cd ../packages/contracts-bedrock/ && \ + forge build -o ./tmp-artifacts -l1-block-deployed: l1block-bindings - ./gen_deployed_bytecode.sh L1Block $(pkg) +l1-cross-domain-messenger-bindings: compile + ./gen_bindings.sh contracts/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger $(pkg) -l1-standard-bridge-bindings: +l1-standard-bridge-bindings: compile ./gen_bindings.sh contracts/L1/L1StandardBridge.sol:L1StandardBridge $(pkg) -optimism-portal-deployed: optimism-portal-bindings - ./gen_deployed_bytecode.sh OptimismPortal $(pkg) - -l2-to-l1-message-passer-deployed: l2-to-l1-message-passer-bindings - ./gen_deployed_bytecode.sh L2ToL1MessagePasser $(pkg) - -gas-price-oracle-deployed: gas-price-oracle-bindings - ./gen_deployed_bytecode.sh GasPriceOracle $(pkg) - -optimism-portal-bindings: +optimism-portal-bindings: compile ./gen_bindings.sh contracts/L1/OptimismPortal.sol:OptimismPortal $(pkg) -l2-output-oracle-bindings: +l2-output-oracle-bindings: compile ./gen_bindings.sh contracts/L1/L2OutputOracle.sol:L2OutputOracle $(pkg) -address-manager-bindings: +address-manager-bindings: compile ./gen_bindings.sh contracts/legacy/AddressManager.sol:AddressManager $(pkg) -l1block-bindings: +l1block-bindings: compile ./gen_bindings.sh contracts/L2/L1Block.sol:L1Block $(pkg) -l2-to-l1-message-passer-bindings: +l2-to-l1-message-passer-bindings: compile ./gen_bindings.sh contracts/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser $(pkg) -gas-price-oracle-bindings: +gas-price-oracle-bindings: compile ./gen_bindings.sh contracts/L2/GasPriceOracle.sol:GasPriceOracle $(pkg) -l2-cross-domain-messenger-bindings: +l2-cross-domain-messenger-bindings: compile ./gen_bindings.sh contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger $(pkg) -l2-standard-bridge-bindings: +l2-standard-bridge-bindings: compile ./gen_bindings.sh contracts/L2/L2StandardBridge.sol:L2StandardBridge $(pkg) -sequencer-fee-vault-bindings: +sequencer-fee-vault-bindings: compile ./gen_bindings.sh contracts/L2/SequencerFeeVault.sol:SequencerFeeVault $(pkg) -optimism-mintable-erc20-factory-bindings: +optimism-mintable-erc20-factory-bindings: compile ./gen_bindings.sh contracts/universal/OptimismMintableERC20Factory.sol:OptimismMintableERC20Factory $(pkg) -optimism-mintable-erc20-bindings: +optimism-mintable-erc20-bindings: compile ./gen_bindings.sh contracts/universal/OptimismMintableERC20.sol:OptimismMintableERC20 $(pkg) -erc20-bindings: +proxy-bindings: compile + ./gen_bindings.sh contracts/universal/Proxy.sol:Proxy $(pkg) + +proxy-admin-bindings: compile + ./gen_bindings.sh contracts/universal/ProxyAdmin.sol:ProxyAdmin $(pkg) + +erc20-bindings: compile ./gen_bindings.sh ERC20 $(pkg) -weth9-bindings: +weth9-bindings: compile ./gen_bindings.sh contracts/vendor/WETH9.sol:WETH9 $(pkg) +more: + go run ./gen/main.go \ + -artifacts ../packages/contracts-bedrock/artifacts,../packages/contracts-governance/artifacts \ + -out ./bindings \ + -contracts OptimismMintableERC20Factory,L2StandardBridge,L1BlockNumber,DeployerWhitelist,Proxy,OptimismPortal,L2ToL1MessagePasser,L2CrossDomainMessenger,GasPriceOracle,SequencerFeeVault,L1Block,LegacyERC20ETH,WETH9,GovernanceToken \ + -package bindings + mkdir: mkdir -p bin $(pkg) clean: rm -rf bin $(pkg) + +test: + go test ./... diff --git a/op-bindings/bindings/deployerwhitelist_more.go b/op-bindings/bindings/deployerwhitelist_more.go new file mode 100755 index 0000000000000..69d40a2b4398a --- /dev/null +++ b/op-bindings/bindings/deployerwhitelist_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const DeployerWhitelistStorageLayoutJSON = "{\"storage\":[{\"astId\":2700,\"contract\":\"contracts/legacy/DeployerWhitelist.sol:DeployerWhitelist\",\"label\":\"owner\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":2705,\"contract\":\"contracts/legacy/DeployerWhitelist.sol:DeployerWhitelist\",\"label\":\"whitelist\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_bool)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"}}}" + +var DeployerWhitelistStorageLayout = new(solc.StorageLayout) + +var DeployerWhitelistDeployedBin = "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80638da5cb5b1161005b5780638da5cb5b146100c85780639b19251a1461010d578063b1540a0114610140578063bdc7b54f1461015357600080fd5b806308fd63221461008257806313af40351461009757806354fd4d50146100aa575b600080fd5b61009561009036600461088a565b61015b565b005b6100956100a53660046108c6565b6102bb565b6100b26104ec565b6040516100bf9190610918565b60405180910390f35b6000546100e89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100bf565b61013061011b3660046108c6565b60016020526000908152604090205460ff1681565b60405190151581526020016100bf565b61013061014e3660046108c6565b61058f565b6100956105e0565b60005473ffffffffffffffffffffffffffffffffffffffff16331461022d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f8daaf060c3306c38e068a75c054bf96ecd85a3db1252712c4d93632744c42e0d910160405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a401610224565b73ffffffffffffffffffffffffffffffffffffffff8116610451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4465706c6f79657257686974656c6973743a2063616e206f6e6c79206265206460448201527f697361626c65642076696120656e61626c65417262697472617279436f6e747260648201527f6163744465706c6f796d656e7400000000000000000000000000000000000000608482015260a401610224565b6000546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606105177f0000000000000000000000000000000000000000000000000000000000000000610724565b6105407f0000000000000000000000000000000000000000000000000000000000000000610724565b6105697f0000000000000000000000000000000000000000000000000000000000000000610724565b60405160200161057b93929190610969565b604051602081830303815290604052905090565b6000805473ffffffffffffffffffffffffffffffffffffffff1615806105da575073ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff165b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f4465706c6f79657257686974656c6973743a2066756e6374696f6e2063616e2060448201527f6f6e6c792062652063616c6c656420627920746865206f776e6572206f66207460648201527f68697320636f6e74726163740000000000000000000000000000000000000000608482015260a401610224565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681527fc0e106cf568e50698fdbde1eff56f5a5c966cc7958e37e276918e9e4ccdf8cd49060200160405180910390a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60608160000361076757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610791578061077b81610a0e565b915061078a9050600a83610a75565b915061076b565b60008167ffffffffffffffff8111156107ac576107ac610a89565b6040519080825280601f01601f1916602001820160405280156107d6576020820181803683370190505b5090505b8415610859576107eb600183610ab8565b91506107f8600a86610acf565b610803906030610ae3565b60f81b81838151811061081857610818610afb565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610852600a86610a75565b94506107da565b949350505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088557600080fd5b919050565b6000806040838503121561089d57600080fd5b6108a683610861565b9150602083013580151581146108bb57600080fd5b809150509250929050565b6000602082840312156108d857600080fd5b6108e182610861565b9392505050565b60005b838110156109035781810151838201526020016108eb565b83811115610912576000848401525b50505050565b60208152600082518060208401526109378160408501602087016108e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000845161097b8184602089016108e8565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516109b7816001850160208a016108e8565b600192019182015283516109d28160028401602088016108e8565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610a3f57610a3f6109df565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610a8457610a84610a46565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082821015610aca57610aca6109df565b500390565b600082610ade57610ade610a46565b500690565b60008219821115610af657610af66109df565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(DeployerWhitelistStorageLayoutJSON), DeployerWhitelistStorageLayout); err != nil { + panic(err) + } + + layouts["DeployerWhitelist"] = DeployerWhitelistStorageLayout + deployedBytecodes["DeployerWhitelist"] = DeployerWhitelistDeployedBin +} diff --git a/op-bindings/bindings/gaspriceoracle_deployed.go b/op-bindings/bindings/gaspriceoracle_more.go old mode 100644 new mode 100755 similarity index 80% rename from op-bindings/bindings/gaspriceoracle_deployed.go rename to op-bindings/bindings/gaspriceoracle_more.go index fbde91fd9b75f..e080dcad8582b --- a/op-bindings/bindings/gaspriceoracle_deployed.go +++ b/op-bindings/bindings/gaspriceoracle_more.go @@ -1,5 +1,25 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. + package bindings +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const GasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":26690,\"contract\":\"contracts/L2/GasPriceOracle.sol:GasPriceOracle\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1663,\"contract\":\"contracts/L2/GasPriceOracle.sol:GasPriceOracle\",\"label\":\"spacer0\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint256\"},{\"astId\":1666,\"contract\":\"contracts/L2/GasPriceOracle.sol:GasPriceOracle\",\"label\":\"spacer1\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1669,\"contract\":\"contracts/L2/GasPriceOracle.sol:GasPriceOracle\",\"label\":\"overhead\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_uint256\"},{\"astId\":1672,\"contract\":\"contracts/L2/GasPriceOracle.sol:GasPriceOracle\",\"label\":\"scalar\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_uint256\"},{\"astId\":1675,\"contract\":\"contracts/L2/GasPriceOracle.sol:GasPriceOracle\",\"label\":\"decimals\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" + +var GasPriceOracleStorageLayout = new(solc.StorageLayout) + var GasPriceOracleDeployedBin = "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80637046559711610097578063de26c4a111610066578063de26c4a1146101c0578063f2fde38b146101d3578063f45e65d8146101e6578063fe173b971461016457600080fd5b8063704655971461016a578063715018a61461017d5780638c8885c8146101855780638da5cb5b1461019857600080fd5b806349948e0e116100d357806349948e0e14610134578063519b4bd31461014757806354fd4d501461014f5780636ef25c3a1461016457600080fd5b80630c18c162146100fa578063313ce567146101165780633577afc51461011f575b600080fd5b61010360035481565b6040519081526020015b60405180910390f35b61010360055481565b61013261012d3660046107e8565b6101ef565b005b610103610142366004610830565b610233565b610103610293565b61015761031d565b60405161010d919061092f565b48610103565b6101326101783660046107e8565b6103c0565b6101326103fd565b6101326101933660046107e8565b610411565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010d565b6101036101ce366004610830565b61044e565b6101326101e1366004610980565b6104f9565b61010360045481565b6101f76105b5565b60038190556040518181527f32740b35c0ea213650f60d44366b4fb211c9033b50714e4a1d34e65d5beb9bb4906020015b60405180910390a150565b60008061023f8361044e565b9050600061024b610293565b61025590836109ec565b90506000600554600a6102689190610b4b565b905060006004548361027a91906109ec565b905060006102888383610b86565b979650505050505050565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103189190610b9a565b905090565b60606103487f0000000000000000000000000000000000000000000000000000000000000000610636565b6103717f0000000000000000000000000000000000000000000000000000000000000000610636565b61039a7f0000000000000000000000000000000000000000000000000000000000000000610636565b6040516020016103ac93929190610bb3565b604051602081830303815290604052905090565b6103c86105b5565b60048190556040518181527f3336cd9708eaf2769a0f0dc0679f30e80f15dcd88d1921b5a16858e8b85c591a90602001610228565b6104056105b5565b61040f6000610773565b565b6104196105b5565b60058190556040518181527fd68112a8707e326d08be3656b528c1bcc5bbbfc47f4177e2179b14d8640838c190602001610228565b80516000908190815b818110156104d15784818151811061047157610471610c29565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036104b1576104aa600484610c58565b92506104bf565b6104bc601084610c58565b92505b806104c981610c70565b915050610457565b506000600354836104e29190610c58565b90506104f081610440610c58565b95945050505050565b6105016105b5565b73ffffffffffffffffffffffffffffffffffffffff81166105a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105b281610773565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461040f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b60608160000361067957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156106a3578061068d81610c70565b915061069c9050600a83610b86565b915061067d565b60008167ffffffffffffffff8111156106be576106be610801565b6040519080825280601f01601f1916602001820160405280156106e8576020820181803683370190505b5090505b841561076b576106fd600183610ca8565b915061070a600a86610cbf565b610715906030610c58565b60f81b81838151811061072a5761072a610c29565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610764600a86610b86565b94506106ec565b949350505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156107fa57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561084257600080fd5b813567ffffffffffffffff8082111561085a57600080fd5b818401915084601f83011261086e57600080fd5b81358181111561088057610880610801565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156108c6576108c6610801565b816040528281528760208487010111156108df57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60005b8381101561091a578181015183820152602001610902565b83811115610929576000848401525b50505050565b602081526000825180602084015261094e8160408501602087016108ff565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60006020828403121561099257600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146109b657600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610a2457610a246109bd565b500290565b600181815b80851115610a8257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610a6857610a686109bd565b80851615610a7557918102915b93841c9390800290610a2e565b509250929050565b600082610a9957506001610b45565b81610aa657506000610b45565b8160018114610abc5760028114610ac657610ae2565b6001915050610b45565b60ff841115610ad757610ad76109bd565b50506001821b610b45565b5060208310610133831016604e8410600b8410161715610b05575081810a610b45565b610b0f8383610a29565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610b4157610b416109bd565b0290505b92915050565b60006109b68383610a8a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610b9557610b95610b57565b500490565b600060208284031215610bac57600080fd5b5051919050565b60008451610bc58184602089016108ff565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551610c01816001850160208a016108ff565b60019201918201528351610c1c8160028401602088016108ff565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008219821115610c6b57610c6b6109bd565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ca157610ca16109bd565b5060010190565b600082821015610cba57610cba6109bd565b500390565b600082610cce57610cce610b57565b50069056fea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(GasPriceOracleStorageLayoutJSON), GasPriceOracleStorageLayout); err != nil { + panic(err) + } + + layouts["GasPriceOracle"] = GasPriceOracleStorageLayout + deployedBytecodes["GasPriceOracle"] = GasPriceOracleDeployedBin +} diff --git a/op-bindings/bindings/governancetoken_more.go b/op-bindings/bindings/governancetoken_more.go new file mode 100755 index 0000000000000..0917a128fabed --- /dev/null +++ b/op-bindings/bindings/governancetoken_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const GovernanceTokenStorageLayoutJSON = "{\"storage\":[{\"astId\":198,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_balances\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":204,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_allowances\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":206,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupply\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":208,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_name\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_string_storage\"},{\"astId\":210,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_symbol\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_string_storage\"},{\"astId\":1577,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_nonces\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_mapping(t_address,t_struct(Counter)1787_storage)\"},{\"astId\":918,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_delegates\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":924,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_checkpoints\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_address,t_array(t_struct(Checkpoint)909_storage)dyn_storage)\"},{\"astId\":928,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupplyCheckpoints\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_array(t_struct(Checkpoint)909_storage)dyn_storage\"},{\"astId\":7,\"contract\":\"contracts/GovernanceToken.sol:GovernanceToken\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"9\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(Checkpoint)909_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct ERC20Votes.Checkpoint[]\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_address)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e address)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_address\"},\"t_mapping(t_address,t_array(t_struct(Checkpoint)909_storage)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct ERC20Votes.Checkpoint[])\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_array(t_struct(Checkpoint)909_storage)dyn_storage\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(Counter)1787_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Counters.Counter)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Counter)1787_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_struct(Checkpoint)909_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ERC20Votes.Checkpoint\",\"numberOfBytes\":\"32\"},\"t_struct(Counter)1787_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Counters.Counter\",\"numberOfBytes\":\"32\"},\"t_uint224\":{\"encoding\":\"inplace\",\"label\":\"uint224\",\"numberOfBytes\":\"28\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"}}}" + +var GovernanceTokenStorageLayout = new(solc.StorageLayout) + +var GovernanceTokenDeployedBin = "0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063a457c2d711610097578063d505accf11610071578063d505accf14610553578063dd62ed3e1461056f578063f1127ed81461059f578063f2fde38b146105cf576101c4565b8063a457c2d7146104d7578063a9059cbb14610507578063c3cda52014610537576101c4565b80638da5cb5b116100d35780638da5cb5b1461043b5780638e539e8c1461045957806395d89b41146104895780639ab24eb0146104a7576101c4565b8063715018a6146103e557806379cc6790146103ef5780637ecebe001461040b576101c4565b80633a46b1a811610166578063587cde1e11610140578063587cde1e146103395780635c19a95c146103695780636fcfff451461038557806370a08231146103b5576101c4565b80633a46b1a8146102d157806340c10f191461030157806342966c681461031d576101c4565b806323b872dd116101a257806323b872dd14610235578063313ce567146102655780633644e5151461028357806339509351146102a1576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610217575b600080fd5b6101d16105eb565b6040516101de9190612a9e565b60405180910390f35b61020160048036038101906101fc9190612b59565b61067d565b60405161020e9190612bb4565b60405180910390f35b61021f6106a0565b60405161022c9190612bde565b60405180910390f35b61024f600480360381019061024a9190612bf9565b6106aa565b60405161025c9190612bb4565b60405180910390f35b61026d6106d9565b60405161027a9190612c68565b60405180910390f35b61028b6106e2565b6040516102989190612c9c565b60405180910390f35b6102bb60048036038101906102b69190612b59565b6106f1565b6040516102c89190612bb4565b60405180910390f35b6102eb60048036038101906102e69190612b59565b61079b565b6040516102f89190612bde565b60405180910390f35b61031b60048036038101906103169190612b59565b61082f565b005b61033760048036038101906103329190612cb7565b6108b9565b005b610353600480360381019061034e9190612ce4565b6108cd565b6040516103609190612d20565b60405180910390f35b610383600480360381019061037e9190612ce4565b610936565b005b61039f600480360381019061039a9190612ce4565b61094a565b6040516103ac9190612d5a565b60405180910390f35b6103cf60048036038101906103ca9190612ce4565b61099e565b6040516103dc9190612bde565b60405180910390f35b6103ed6109e6565b005b61040960048036038101906104049190612b59565b610a6e565b005b61042560048036038101906104209190612ce4565b610a8e565b6040516104329190612bde565b60405180910390f35b610443610ade565b6040516104509190612d20565b60405180910390f35b610473600480360381019061046e9190612cb7565b610b08565b6040516104809190612bde565b60405180910390f35b610491610b5e565b60405161049e9190612a9e565b60405180910390f35b6104c160048036038101906104bc9190612ce4565b610bf0565b6040516104ce9190612bde565b60405180910390f35b6104f160048036038101906104ec9190612b59565b610d01565b6040516104fe9190612bb4565b60405180910390f35b610521600480360381019061051c9190612b59565b610deb565b60405161052e9190612bb4565b60405180910390f35b610551600480360381019061054c9190612dcd565b610e0e565b005b61056d60048036038101906105689190612e5a565b610f12565b005b61058960048036038101906105849190612efc565b611054565b6040516105969190612bde565b60405180910390f35b6105b960048036038101906105b49190612f68565b6110db565b6040516105c6919061301d565b60405180910390f35b6105e960048036038101906105e49190612ce4565b6111eb565b005b6060600380546105fa90613067565b80601f016020809104026020016040519081016040528092919081815260200182805461062690613067565b80156106735780601f1061064857610100808354040283529160200191610673565b820191906000526020600020905b81548152906001019060200180831161065657829003601f168201915b5050505050905090565b6000806106886112e3565b90506106958185856112eb565b600191505092915050565b6000600254905090565b6000806106b56112e3565b90506106c28582856114b6565b6106cd858585611542565b60019150509392505050565b60006012905090565b60006106ec6117c3565b905090565b6000806106fc6112e3565b9050610790818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461078b91906130c8565b6112eb565b600191505092915050565b60004382106107df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d69061316a565b60405180910390fd5b610827600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836118dd565b905092915050565b6108376112e3565b73ffffffffffffffffffffffffffffffffffffffff16610855610ade565b73ffffffffffffffffffffffffffffffffffffffff16146108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a2906131d6565b60405180910390fd5b6108b582826119e9565b5050565b6108ca6108c46112e3565b826119f7565b50565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109476109416112e3565b82611a05565b50565b6000610997600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611b1f565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6109ee6112e3565b73ffffffffffffffffffffffffffffffffffffffff16610a0c610ade565b73ffffffffffffffffffffffffffffffffffffffff1614610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a59906131d6565b60405180910390fd5b610a6c6000611b72565b565b610a8082610a7a6112e3565b836114b6565b610a8a82826119f7565b5050565b6000610ad7600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611c38565b9050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000438210610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b439061316a565b60405180910390fd5b610b576008836118dd565b9050919050565b606060048054610b6d90613067565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9990613067565b8015610be65780601f10610bbb57610100808354040283529160200191610be6565b820191906000526020600020905b815481529060010190602001808311610bc957829003601f168201915b5050505050905090565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610cd857600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610c8c91906131f6565b81548110610c9d57610c9c61322a565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610cdb565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610d0c6112e3565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc9906132cb565b60405180910390fd5b610ddf82868684036112eb565b60019250505092915050565b600080610df66112e3565b9050610e03818585611542565b600191505092915050565b83421115610e51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4890613337565b60405180910390fd5b6000610eb3610eab7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610e909493929190613357565b60405160208183030381529060405280519060200120611c46565b858585611c60565b9050610ebe81611c8b565b8614610eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef6906133e8565b60405180910390fd5b610f098188611a05565b50505050505050565b83421115610f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4c90613454565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610f848c611c8b565b89604051602001610f9a96959493929190613474565b6040516020818303038152906040528051906020012090506000610fbd82611c46565b90506000610fcd82878787611c60565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461103d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103490613521565b60405180910390fd5b6110488a8a8a6112eb565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6110e36129c7565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff168154811061113a5761113961322a565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b6111f36112e3565b73ffffffffffffffffffffffffffffffffffffffff16611211610ade565b73ffffffffffffffffffffffffffffffffffffffff1614611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e906131d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce906135b3565b60405180910390fd5b6112e081611b72565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561135b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135290613645565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c2906136d7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114a99190612bde565b60405180910390a3505050565b60006114c28484611054565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461153c578181101561152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613743565b60405180910390fd5b61153b84848484036112eb565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a9906137d5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990613867565b60405180910390fd5b61162d838383611ce9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156116b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116aa906138f9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461174691906130c8565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117aa9190612bde565b60405180910390a36117bd848484611cee565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561183f57507f000000000000000000000000000000000000000000000000000000000000000046145b1561186c577f000000000000000000000000000000000000000000000000000000000000000090506118da565b6118d77f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611cfe565b90505b90565b6000808380549050905060005b8181101561195c5760006118fe8284611d38565b9050848682815481106119145761191361322a565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561194657809250611956565b60018161195391906130c8565b91505b506118ea565b600082146119be578460018361197291906131f6565b815481106119835761198261322a565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166119c1565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6119f38282611d5e565b5050565b611a018282611deb565b5050565b6000611a10836108cd565b90506000611a1d8461099e565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b19828483611e09565b50505050565b600063ffffffff8016821115611b6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b619061398b565b60405180910390fd5b819050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000611c59611c536117c3565b83612002565b9050919050565b6000806000611c7187878787612035565b91509150611c7e81612142565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611cd881611c38565b9150611ce381612317565b50919050565b505050565b611cf983838361232d565b505050565b60008383834630604051602001611d199594939291906139ab565b6040516020818303038152906040528051906020012090509392505050565b60006002828418611d499190613a2d565b828416611d5691906130c8565b905092915050565b611d688282612358565b611d706124b8565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611d966106a0565b1115611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90613ad0565b60405180910390fd5b611de560086124dc836124f2565b50505050565b611df5828261276a565b611e036008612941836124f2565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611e455750600081115b15611ffd57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f2357600080611ecc600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612941856124f2565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f18929190613af0565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611ffc57600080611fa5600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124dc856124f2565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611ff1929190613af0565b60405180910390a250505b5b505050565b60008282604051602001612017929190613b91565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612070576000600391509150612139565b601b8560ff16141580156120885750601c8560ff1614155b1561209a576000600491509150612139565b6000600187878787604051600081526020016040526040516120bf9493929190613bc8565b6020604051602081039080840390855afa1580156120e1573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561213057600060019250925050612139565b80600092509250505b94509492505050565b6000600481111561215657612155613c0d565b5b81600481111561216957612168613c0d565b5b141561217457612314565b6001600481111561218857612187613c0d565b5b81600481111561219b5761219a613c0d565b5b14156121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d390613c88565b60405180910390fd5b600260048111156121f0576121ef613c0d565b5b81600481111561220357612202613c0d565b5b1415612244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223b90613cf4565b60405180910390fd5b6003600481111561225857612257613c0d565b5b81600481111561226b5761226a613c0d565b5b14156122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a390613d86565b60405180910390fd5b6004808111156122bf576122be613c0d565b5b8160048111156122d2576122d1613c0d565b5b1415612313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230a90613e18565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b612338838383612957565b612353612344846108cd565b61234d846108cd565b83611e09565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90613e84565b60405180910390fd5b6123d460008383611ce9565b80600260008282546123e691906130c8565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243b91906130c8565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124a09190612bde565b60405180910390a36124b460008383611cee565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b600081836124ea91906130c8565b905092915050565b60008060008580549050905060008114612560578560018261251491906131f6565b815481106125255761252461322a565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612563565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16925061259183858763ffffffff16565b91506000811180156125e4575043866001836125ad91906131f6565b815481106125be576125bd61322a565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15612671576125f28261295c565b8660018361260091906131f6565b815481106126115761261061322a565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550612761565b85604051806040016040528061268643611b1f565b63ffffffff16815260200161269a8561295c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d190613f16565b60405180910390fd5b6127e682600083611ce9565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561286c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286390613fa8565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546128c391906131f6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129289190612bde565b60405180910390a361293c83600084611cee565b505050565b6000818361294f91906131f6565b905092915050565b505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156129bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b69061403a565b60405180910390fd5b819050919050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a3f578082015181840152602081019050612a24565b83811115612a4e576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a7082612a05565b612a7a8185612a10565b9350612a8a818560208601612a21565b612a9381612a54565b840191505092915050565b60006020820190508181036000830152612ab88184612a65565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612af082612ac5565b9050919050565b612b0081612ae5565b8114612b0b57600080fd5b50565b600081359050612b1d81612af7565b92915050565b6000819050919050565b612b3681612b23565b8114612b4157600080fd5b50565b600081359050612b5381612b2d565b92915050565b60008060408385031215612b7057612b6f612ac0565b5b6000612b7e85828601612b0e565b9250506020612b8f85828601612b44565b9150509250929050565b60008115159050919050565b612bae81612b99565b82525050565b6000602082019050612bc96000830184612ba5565b92915050565b612bd881612b23565b82525050565b6000602082019050612bf36000830184612bcf565b92915050565b600080600060608486031215612c1257612c11612ac0565b5b6000612c2086828701612b0e565b9350506020612c3186828701612b0e565b9250506040612c4286828701612b44565b9150509250925092565b600060ff82169050919050565b612c6281612c4c565b82525050565b6000602082019050612c7d6000830184612c59565b92915050565b6000819050919050565b612c9681612c83565b82525050565b6000602082019050612cb16000830184612c8d565b92915050565b600060208284031215612ccd57612ccc612ac0565b5b6000612cdb84828501612b44565b91505092915050565b600060208284031215612cfa57612cf9612ac0565b5b6000612d0884828501612b0e565b91505092915050565b612d1a81612ae5565b82525050565b6000602082019050612d356000830184612d11565b92915050565b600063ffffffff82169050919050565b612d5481612d3b565b82525050565b6000602082019050612d6f6000830184612d4b565b92915050565b612d7e81612c4c565b8114612d8957600080fd5b50565b600081359050612d9b81612d75565b92915050565b612daa81612c83565b8114612db557600080fd5b50565b600081359050612dc781612da1565b92915050565b60008060008060008060c08789031215612dea57612de9612ac0565b5b6000612df889828a01612b0e565b9650506020612e0989828a01612b44565b9550506040612e1a89828a01612b44565b9450506060612e2b89828a01612d8c565b9350506080612e3c89828a01612db8565b92505060a0612e4d89828a01612db8565b9150509295509295509295565b600080600080600080600060e0888a031215612e7957612e78612ac0565b5b6000612e878a828b01612b0e565b9750506020612e988a828b01612b0e565b9650506040612ea98a828b01612b44565b9550506060612eba8a828b01612b44565b9450506080612ecb8a828b01612d8c565b93505060a0612edc8a828b01612db8565b92505060c0612eed8a828b01612db8565b91505092959891949750929550565b60008060408385031215612f1357612f12612ac0565b5b6000612f2185828601612b0e565b9250506020612f3285828601612b0e565b9150509250929050565b612f4581612d3b565b8114612f5057600080fd5b50565b600081359050612f6281612f3c565b92915050565b60008060408385031215612f7f57612f7e612ac0565b5b6000612f8d85828601612b0e565b9250506020612f9e85828601612f53565b9150509250929050565b612fb181612d3b565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b612fe881612fb7565b82525050565b6040820160008201516130046000850182612fa8565b5060208201516130176020850182612fdf565b50505050565b60006040820190506130326000830184612fee565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061307f57607f821691505b6020821081141561309357613092613038565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006130d382612b23565b91506130de83612b23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561311357613112613099565b5b828201905092915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000613154601f83612a10565b915061315f8261311e565b602082019050919050565b6000602082019050818103600083015261318381613147565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006131c0602083612a10565b91506131cb8261318a565b602082019050919050565b600060208201905081810360008301526131ef816131b3565b9050919050565b600061320182612b23565b915061320c83612b23565b92508282101561321f5761321e613099565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006132b5602583612a10565b91506132c082613259565b604082019050919050565b600060208201905081810360008301526132e4816132a8565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000613321601d83612a10565b915061332c826132eb565b602082019050919050565b6000602082019050818103600083015261335081613314565b9050919050565b600060808201905061336c6000830187612c8d565b6133796020830186612d11565b6133866040830185612bcf565b6133936060830184612bcf565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b60006133d2601983612a10565b91506133dd8261339c565b602082019050919050565b60006020820190508181036000830152613401816133c5565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b600061343e601d83612a10565b915061344982613408565b602082019050919050565b6000602082019050818103600083015261346d81613431565b9050919050565b600060c0820190506134896000830189612c8d565b6134966020830188612d11565b6134a36040830187612d11565b6134b06060830186612bcf565b6134bd6080830185612bcf565b6134ca60a0830184612bcf565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b600061350b601e83612a10565b9150613516826134d5565b602082019050919050565b6000602082019050818103600083015261353a816134fe565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061359d602683612a10565b91506135a882613541565b604082019050919050565b600060208201905081810360008301526135cc81613590565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061362f602483612a10565b915061363a826135d3565b604082019050919050565b6000602082019050818103600083015261365e81613622565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006136c1602283612a10565b91506136cc82613665565b604082019050919050565b600060208201905081810360008301526136f0816136b4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061372d601d83612a10565b9150613738826136f7565b602082019050919050565b6000602082019050818103600083015261375c81613720565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006137bf602583612a10565b91506137ca82613763565b604082019050919050565b600060208201905081810360008301526137ee816137b2565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613851602383612a10565b915061385c826137f5565b604082019050919050565b6000602082019050818103600083015261388081613844565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006138e3602683612a10565b91506138ee82613887565b604082019050919050565b60006020820190508181036000830152613912816138d6565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000613975602683612a10565b915061398082613919565b604082019050919050565b600060208201905081810360008301526139a481613968565b9050919050565b600060a0820190506139c06000830188612c8d565b6139cd6020830187612c8d565b6139da6040830186612c8d565b6139e76060830185612bcf565b6139f46080830184612d11565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613a3882612b23565b9150613a4383612b23565b925082613a5357613a526139fe565b5b828204905092915050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000613aba603083612a10565b9150613ac582613a5e565b604082019050919050565b60006020820190508181036000830152613ae981613aad565b9050919050565b6000604082019050613b056000830185612bcf565b613b126020830184612bcf565b9392505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613b5a600283613b19565b9150613b6582613b24565b600282019050919050565b6000819050919050565b613b8b613b8682612c83565b613b70565b82525050565b6000613b9c82613b4d565b9150613ba88285613b7a565b602082019150613bb88284613b7a565b6020820191508190509392505050565b6000608082019050613bdd6000830187612c8d565b613bea6020830186612c59565b613bf76040830185612c8d565b613c046060830184612c8d565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000613c72601883612a10565b9150613c7d82613c3c565b602082019050919050565b60006020820190508181036000830152613ca181613c65565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000613cde601f83612a10565b9150613ce982613ca8565b602082019050919050565b60006020820190508181036000830152613d0d81613cd1565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d70602283612a10565b9150613d7b82613d14565b604082019050919050565b60006020820190508181036000830152613d9f81613d63565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e02602283612a10565b9150613e0d82613da6565b604082019050919050565b60006020820190508181036000830152613e3181613df5565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613e6e601f83612a10565b9150613e7982613e38565b602082019050919050565b60006020820190508181036000830152613e9d81613e61565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f00602183612a10565b9150613f0b82613ea4565b604082019050919050565b60006020820190508181036000830152613f2f81613ef3565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f92602283612a10565b9150613f9d82613f36565b604082019050919050565b60006020820190508181036000830152613fc181613f85565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000614024602783612a10565b915061402f82613fc8565b604082019050919050565b6000602082019050818103600083015261405381614017565b905091905056fea264697066735822122045dad6b0baf930a578db6b014d4fbf359073e8c1d7d2777a11b487c012850a4564736f6c634300080c0033" + +func init() { + if err := json.Unmarshal([]byte(GovernanceTokenStorageLayoutJSON), GovernanceTokenStorageLayout); err != nil { + panic(err) + } + + layouts["GovernanceToken"] = GovernanceTokenStorageLayout + deployedBytecodes["GovernanceToken"] = GovernanceTokenDeployedBin +} diff --git a/op-bindings/bindings/l1block_deployed.go b/op-bindings/bindings/l1block_more.go old mode 100644 new mode 100755 similarity index 73% rename from op-bindings/bindings/l1block_deployed.go rename to op-bindings/bindings/l1block_more.go index ac4240e5fc601..dbbf17f13a626 --- a/op-bindings/bindings/l1block_deployed.go +++ b/op-bindings/bindings/l1block_more.go @@ -1,5 +1,25 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. + package bindings +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const L1BlockStorageLayoutJSON = "{\"storage\":[{\"astId\":1909,\"contract\":\"contracts/L2/L1Block.sol:L1Block\",\"label\":\"number\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint64\"},{\"astId\":1912,\"contract\":\"contracts/L2/L1Block.sol:L1Block\",\"label\":\"timestamp\",\"offset\":8,\"slot\":\"0\",\"type\":\"t_uint64\"},{\"astId\":1915,\"contract\":\"contracts/L2/L1Block.sol:L1Block\",\"label\":\"basefee\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint256\"},{\"astId\":1918,\"contract\":\"contracts/L2/L1Block.sol:L1Block\",\"label\":\"hash\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_bytes32\"},{\"astId\":1921,\"contract\":\"contracts/L2/L1Block.sol:L1Block\",\"label\":\"sequenceNumber\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_uint64\"}],\"types\":{\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"}}}" + +var L1BlockStorageLayout = new(solc.StorageLayout) + var L1BlockDeployedBin = "0x608060405234801561001057600080fd5b50600436106100885760003560e01c806364ca23ef1161005b57806364ca23ef146100dc5780638381f58a14610109578063b80777ea1461011d578063e591b2821461013d57600080fd5b8063042c2f571461008d57806309bd5a60146100a257806354fd4d50146100be5780635cf24969146100d3575b600080fd5b6100a061009b3660046104a6565b61017d565b005b6100ab60025481565b6040519081526020015b60405180910390f35b6100c66102a9565b6040516100b5919061052d565b6100ab60015481565b6003546100f09067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016100b5565b6000546100f09067ffffffffffffffff1681565b6000546100f09068010000000000000000900467ffffffffffffffff1681565b61015873deaddeaddeaddeaddeaddeaddeaddeaddead000181565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff9687167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090911617680100000000000000009587169590950294909417909355600191909155600255600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001691909216179055565b60606102d47f000000000000000000000000000000000000000000000000000000000000000061034c565b6102fd7f000000000000000000000000000000000000000000000000000000000000000061034c565b6103267f000000000000000000000000000000000000000000000000000000000000000061034c565b6040516020016103389392919061057e565b604051602081830303815290604052905090565b60608160000361038f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156103b957806103a381610623565b91506103b29050600a8361068a565b9150610393565b60008167ffffffffffffffff8111156103d4576103d461069e565b6040519080825280601f01601f1916602001820160405280156103fe576020820181803683370190505b5090505b8415610481576104136001836106cd565b9150610420600a866106e4565b61042b9060306106f8565b60f81b81838151811061044057610440610710565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061047a600a8661068a565b9450610402565b949350505050565b803567ffffffffffffffff811681146104a157600080fd5b919050565b600080600080600060a086880312156104be57600080fd5b6104c786610489565b94506104d560208701610489565b935060408601359250606086013591506104f160808701610489565b90509295509295909350565b60005b83811015610518578181015183820152602001610500565b83811115610527576000848401525b50505050565b602081526000825180602084015261054c8160408501602087016104fd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600084516105908184602089016104fd565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516105cc816001850160208a016104fd565b600192019182015283516105e78160028401602088016104fd565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610654576106546105f4565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826106995761069961065b565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156106df576106df6105f4565b500390565b6000826106f3576106f361065b565b500690565b6000821982111561070b5761070b6105f4565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(L1BlockStorageLayoutJSON), L1BlockStorageLayout); err != nil { + panic(err) + } + + layouts["L1Block"] = L1BlockStorageLayout + deployedBytecodes["L1Block"] = L1BlockDeployedBin +} diff --git a/op-bindings/bindings/l1blocknumber_more.go b/op-bindings/bindings/l1blocknumber_more.go new file mode 100755 index 0000000000000..2e5d4b7917c9f --- /dev/null +++ b/op-bindings/bindings/l1blocknumber_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const L1BlockNumberStorageLayoutJSON = "{\"storage\":null,\"types\":null}" + +var L1BlockNumberStorageLayout = new(solc.StorageLayout) + +var L1BlockNumberDeployedBin = "0x60806040526004361061002d5760003560e01c806354fd4d5014610052578063b9b3efe91461007d57610048565b3661004857600061003c6100a0565b90508060005260206000f35b600061003c6100a0565b34801561005e57600080fd5b50610067610134565b6040516100749190610344565b60405180910390f35b34801561008957600080fd5b506100926100a0565b604051908152602001610074565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638381f58a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610101573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101259190610395565b67ffffffffffffffff16905090565b606061015f7f00000000000000000000000000000000000000000000000000000000000000006101d7565b6101887f00000000000000000000000000000000000000000000000000000000000000006101d7565b6101b17f00000000000000000000000000000000000000000000000000000000000000006101d7565b6040516020016101c3939291906103c6565b604051602081830303815290604052905090565b60608160000361021a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610244578061022e8161046b565b915061023d9050600a836104d2565b915061021e565b60008167ffffffffffffffff81111561025f5761025f6104e6565b6040519080825280601f01601f191660200182016040528015610289576020820181803683370190505b5090505b841561030c5761029e600183610515565b91506102ab600a8661052c565b6102b6906030610540565b60f81b8183815181106102cb576102cb610558565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610305600a866104d2565b945061028d565b949350505050565b60005b8381101561032f578181015183820152602001610317565b8381111561033e576000848401525b50505050565b6020815260008251806020840152610363816040850160208701610314565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000602082840312156103a757600080fd5b815167ffffffffffffffff811681146103bf57600080fd5b9392505050565b600084516103d8818460208901610314565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551610414816001850160208a01610314565b6001920191820152835161042f816002840160208801610314565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361049c5761049c61043c565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826104e1576104e16104a3565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156105275761052761043c565b500390565b60008261053b5761053b6104a3565b500690565b600082198211156105535761055361043c565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(L1BlockNumberStorageLayoutJSON), L1BlockNumberStorageLayout); err != nil { + panic(err) + } + + layouts["L1BlockNumber"] = L1BlockNumberStorageLayout + deployedBytecodes["L1BlockNumber"] = L1BlockNumberDeployedBin +} diff --git a/op-bindings/bindings/l1crossdomainmessenger.go b/op-bindings/bindings/l1crossdomainmessenger.go new file mode 100644 index 0000000000000..07fa00b54de51 --- /dev/null +++ b/op-bindings/bindings/l1crossdomainmessenger.go @@ -0,0 +1,1981 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// L1CrossDomainMessengerMetaData contains all meta data concerning the L1CrossDomainMessenger contract. +var L1CrossDomainMessengerMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractOptimismPortal\",\"name\":\"_portal\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SentMessageExtension1\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSAGE_VERSION\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_CALLDATA_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_CONSTANT_OVERHEAD\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"baseGas\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"blockedSystemAddresses\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"otherMessenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"portal\",\"outputs\":[{\"internalType\":\"contractOptimismPortal\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"receivedMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"relayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_minGasLimit\",\"type\":\"uint32\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"successfulMessages\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x6101006040523480156200001257600080fd5b5060405162002bb738038062002bb7833981016040819052620000359162000510565b6000608081905260a052600160c0526001600160a01b03811660e0526200005b62000062565b5062000580565b600054610100900460ff1615808015620000835750600054600160ff909116105b80620000b35750620000a030620001fc60201b6200128e1760201c565b158015620000b3575060005460ff166001145b6200011c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000140576000805461ff0019166101001790555b60408051600180825281830190925260009160208083019080368337019050509050308160008151811062000179576200017962000542565b6001600160a01b0390921660209283029190910190910152620001b1734200000000000000000000000000000000000007826200020b565b508015620001f9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff16620002675760405162461bcd60e51b815260206004820152602b602482015260008051602062002b9783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000113565b60ca805461dead6001600160a01b03199182161790915560cc80549091166001600160a01b03841617905560005b81518110156200030157600160ce6000848481518110620002ba57620002ba62000542565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620002f88162000558565b91505062000295565b506200030c6200032e565b620003166200038c565b62000320620003f3565b6200032a6200045b565b5050565b600054610100900460ff166200038a5760405162461bcd60e51b815260206004820152602b602482015260008051602062002b9783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000113565b565b600054610100900460ff16620003e85760405162461bcd60e51b815260206004820152602b602482015260008051602062002b9783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000113565b6200038a33620004be565b600054610100900460ff166200044f5760405162461bcd60e51b815260206004820152602b602482015260008051602062002b9783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000113565b6065805460ff19169055565b600054610100900460ff16620004b75760405162461bcd60e51b815260206004820152602b602482015260008051602062002b9783398151915260448201526a6e697469616c697a696e6760a81b606482015260840162000113565b6001609755565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200052357600080fd5b81516001600160a01b03811681146200053b57600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016200057957634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516125c8620005cf600039600081816102be015281816112e70152818161195801526119c7015260006107ae015260006107850152600061075c01526125c86000f3fe6080604052600436106101805760003560e01c8063715018a6116100d6578063b28ade251161007f578063ecc7042811610059578063ecc704281461042b578063f2fde38b14610490578063f69f8151146104b057600080fd5b8063b28ade25146103cb578063d764ad0b146103eb578063db505d80146103fe57600080fd5b80638456cb59116100b05780638456cb591461035b5780638da5cb5b14610370578063b1b1b2091461039b57600080fd5b8063715018a61461031a5780637dea7cc31461032f5780638129fc1c1461034657600080fd5b80633f827a5a116101385780635c975abb116101125780635c975abb146102945780636425666b146102ac5780636e296e451461030557600080fd5b80633f827a5a1461020a5780634b134ce71461023257806354fd4d501461027257600080fd5b80632828d7e8116101695780632828d7e8146101ca5780633dbb202b146101e05780633f4ba83a146101f557600080fd5b8063028f85f7146101855780630c568498146101b4575b600080fd5b34801561019157600080fd5b5061019a601081565b60405163ffffffff90911681526020015b60405180910390f35b3480156101c057600080fd5b5061019a6103e881565b3480156101d657600080fd5b5061019a6103f881565b6101f36101ee366004611f6c565b6104e0565b005b34801561020157600080fd5b506101f3610743565b34801561021657600080fd5b5061021f600181565b60405161ffff90911681526020016101ab565b34801561023e57600080fd5b5061026261024d366004611fd3565b60ce6020526000908152604090205460ff1681565b60405190151581526020016101ab565b34801561027e57600080fd5b50610287610755565b6040516101ab9190612071565b3480156102a057600080fd5b5060655460ff16610262565b3480156102b857600080fd5b506102e07f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ab565b34801561031157600080fd5b506102e06107f8565b34801561032657600080fd5b506101f36108e4565b34801561033b57600080fd5b5061019a62030d4081565b34801561035257600080fd5b506101f36108f6565b34801561036757600080fd5b506101f3610b0f565b34801561037c57600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166102e0565b3480156103a757600080fd5b506102626103b6366004612084565b60c96020526000908152604090205460ff1681565b3480156103d757600080fd5b5061019a6103e636600461209d565b610b1f565b6101f36103f93660046120f1565b610b65565b34801561040a57600080fd5b5060cc546102e09073ffffffffffffffffffffffffffffffffffffffff1681565b34801561043757600080fd5b5061048260cb547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ab565b34801561049c57600080fd5b506101f36104ab366004611fd3565b6111da565b3480156104bc57600080fd5b506102626104cb366004612084565b60cd6020526000908152604090205460ff1681565b60cc546106189073ffffffffffffffffffffffffffffffffffffffff16610508858585610b1f565b63ffffffff16347fd764ad0b0000000000000000000000000000000000000000000000000000000061057a60cb547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c60405160240161059697969594939291906121c0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526112aa565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561069d60cb547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106af95949392919061221f565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cb80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b61074b61135f565b6107536113e0565b565b60606107807f000000000000000000000000000000000000000000000000000000000000000061145d565b6107a97f000000000000000000000000000000000000000000000000000000000000000061145d565b6107d27f000000000000000000000000000000000000000000000000000000000000000061145d565b6040516020016107e49392919061226d565b604051602081830303815290604052905090565b60ca5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016108c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060ca5473ffffffffffffffffffffffffffffffffffffffff1690565b6108ec61135f565b6107536000611592565b600054610100900460ff16158080156109165750600054600160ff909116105b806109305750303b158015610930575060005460ff166001145b6109bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108be565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a1a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b604080516001808252818301909252600091602080830190803683370190505090503081600081518110610a5057610a50612312565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610aa873420000000000000000000000000000000000000782611609565b508015610b0c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610b1761135f565b6107536117a8565b600062030d40610b30601085612370565b6103e8610b3f6103f886612370565b610b4991906123cb565b610b5391906123ee565b610b5d91906123ee565b949350505050565b600260975403610bd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108be565b6002609755610bde611803565b6000610c24888888888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061187092505050565b9050610c2e61193e565b15610cc757843414610cc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f43726f7373446f6d61696e4d657373656e6765723a206d69736d61746368656460448201527f206d6573736167652076616c756500000000000000000000000000000000000060648201526084016108be565b610e19565b3415610d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016108be565b600081815260cd602052604090205460ff16610e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016108be565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260ce602052604090205460ff1615610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016108be565b600081815260c9602052604090205460ff1615610f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016108be565b610fa061afc885612416565b5a101561102f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a20696e737566666963696560448201527f6e742067617320746f2072656c6179206d65737361676500000000000000000060648201526084016108be565b60ca80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff891617905560006110cb8761108361138861afc861242e565b5a61108e919061242e565b8887878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a5292505050565b60ca80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560010361116657600082815260c9602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26111c5565b600082815260cd602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b5050600160975550505050505050565b905090565b6111e261135f565b73ffffffffffffffffffffffffffffffffffffffff8116611285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108be565b610b0c81611592565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063e9e05c42908490611327908890839089906000908990600401612445565b6000604051808303818588803b15801561134057600080fd5b505af1158015611354573d6000803e3d6000fd5b505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108be565b6113e8611a6c565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6060816000036114a057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156114ca57806114b48161249d565b91506114c39050600a836124d5565b91506114a4565b60008167ffffffffffffffff8111156114e5576114e56122e3565b6040519080825280601f01601f19166020018201604052801561150f576020820181803683370190505b5090505b8415610b5d5761152460018361242e565b9150611531600a866124e9565b61153c906030612416565b60f81b81838151811061155157611551612312565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061158b600a866124d5565b9450611513565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108be565b60ca805461dead7fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911673ffffffffffffffffffffffffffffffffffffffff841617905560005b815181101561178357600160ce600084848151811061171457611714612312565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790558061177b8161249d565b9150506116f3565b5061178c611ad8565b611794611b6f565b61179c611c0f565b6117a4611cd0565b5050565b6117b0611803565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114333390565b60655460ff1615610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016108be565b600060f087901c8082036118925761188a8688858b611d6e565b915050611934565b8061ffff166001036118ac5761188a888888888888611d8d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f48617368696e673a20756e6b6e6f776e2063726f737320646f6d61696e206d6560448201527f73736167652076657273696f6e0000000000000000000000000000000000000060648201526084016108be565b9695505050505050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480156111d5575060cc54604080517f9bf62d82000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff928316927f00000000000000000000000000000000000000000000000000000000000000001691639bf62d829160048083019260209291908290030181865afa158015611a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3691906124fd565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600080600080845160208601878a8af19695505050505050565b60655460ff16610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016108be565b600054610100900460ff16610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108be565b600054610100900460ff16611c06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108be565b61075333611592565b600054610100900460ff16611ca6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108be565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600054610100900460ff16611d67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108be565b6001609755565b6000611d7c85858585611db0565b805190602001209050949350505050565b6000611d9d878787878787611e49565b8051906020012090509695505050505050565b606084848484604051602401611dc9949392919061251a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611e6696959493929190612564565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b0c57600080fd5b60008083601f840112611f1c57600080fd5b50813567ffffffffffffffff811115611f3457600080fd5b602083019150836020828501011115611f4c57600080fd5b9250929050565b803563ffffffff81168114611f6757600080fd5b919050565b60008060008060608587031215611f8257600080fd5b8435611f8d81611ee8565b9350602085013567ffffffffffffffff811115611fa957600080fd5b611fb587828801611f0a565b9094509250611fc8905060408601611f53565b905092959194509250565b600060208284031215611fe557600080fd5b8135611ff081611ee8565b9392505050565b60005b83811015612012578181015183820152602001611ffa565b83811115612021576000848401525b50505050565b6000815180845261203f816020860160208601611ff7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611ff06020830184612027565b60006020828403121561209657600080fd5b5035919050565b6000806000604084860312156120b257600080fd5b833567ffffffffffffffff8111156120c957600080fd5b6120d586828701611f0a565b90945092506120e8905060208501611f53565b90509250925092565b600080600080600080600060c0888a03121561210c57600080fd5b87359650602088013561211e81611ee8565b9550604088013561212e81611ee8565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561215857600080fd5b6121648a828b01611f0a565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a083015261221260c083018486612177565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8616815260806020820152600061224f608083018688612177565b905083604083015263ffffffff831660608301529695505050505050565b6000845161227f818460208901611ff7565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516122bb816001850160208a01611ff7565b600192019182015283516122d6816002840160208801611ff7565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff8083168185168183048111821515161561239357612393612341565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff808416806123e2576123e261239c565b92169190910492915050565b600063ffffffff80831681851680830382111561240d5761240d612341565b01949350505050565b6000821982111561242957612429612341565b500190565b60008282101561244057612440612341565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061249260a0830184612027565b979650505050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124ce576124ce612341565b5060010190565b6000826124e4576124e461239c565b500490565b6000826124f8576124f861239c565b500690565b60006020828403121561250f57600080fd5b8151611ff081611ee8565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526125536080830185612027565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526125af60c0830184612027565b9897505050505050505056fea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", +} + +// L1CrossDomainMessengerABI is the input ABI used to generate the binding from. +// Deprecated: Use L1CrossDomainMessengerMetaData.ABI instead. +var L1CrossDomainMessengerABI = L1CrossDomainMessengerMetaData.ABI + +// L1CrossDomainMessengerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use L1CrossDomainMessengerMetaData.Bin instead. +var L1CrossDomainMessengerBin = L1CrossDomainMessengerMetaData.Bin + +// DeployL1CrossDomainMessenger deploys a new Ethereum contract, binding an instance of L1CrossDomainMessenger to it. +func DeployL1CrossDomainMessenger(auth *bind.TransactOpts, backend bind.ContractBackend, _portal common.Address) (common.Address, *types.Transaction, *L1CrossDomainMessenger, error) { + parsed, err := L1CrossDomainMessengerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1CrossDomainMessengerBin), backend, _portal) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &L1CrossDomainMessenger{L1CrossDomainMessengerCaller: L1CrossDomainMessengerCaller{contract: contract}, L1CrossDomainMessengerTransactor: L1CrossDomainMessengerTransactor{contract: contract}, L1CrossDomainMessengerFilterer: L1CrossDomainMessengerFilterer{contract: contract}}, nil +} + +// L1CrossDomainMessenger is an auto generated Go binding around an Ethereum contract. +type L1CrossDomainMessenger struct { + L1CrossDomainMessengerCaller // Read-only binding to the contract + L1CrossDomainMessengerTransactor // Write-only binding to the contract + L1CrossDomainMessengerFilterer // Log filterer for contract events +} + +// L1CrossDomainMessengerCaller is an auto generated read-only Go binding around an Ethereum contract. +type L1CrossDomainMessengerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1CrossDomainMessengerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type L1CrossDomainMessengerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1CrossDomainMessengerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type L1CrossDomainMessengerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1CrossDomainMessengerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type L1CrossDomainMessengerSession struct { + Contract *L1CrossDomainMessenger // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L1CrossDomainMessengerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type L1CrossDomainMessengerCallerSession struct { + Contract *L1CrossDomainMessengerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// L1CrossDomainMessengerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type L1CrossDomainMessengerTransactorSession struct { + Contract *L1CrossDomainMessengerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L1CrossDomainMessengerRaw is an auto generated low-level Go binding around an Ethereum contract. +type L1CrossDomainMessengerRaw struct { + Contract *L1CrossDomainMessenger // Generic contract binding to access the raw methods on +} + +// L1CrossDomainMessengerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type L1CrossDomainMessengerCallerRaw struct { + Contract *L1CrossDomainMessengerCaller // Generic read-only contract binding to access the raw methods on +} + +// L1CrossDomainMessengerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type L1CrossDomainMessengerTransactorRaw struct { + Contract *L1CrossDomainMessengerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewL1CrossDomainMessenger creates a new instance of L1CrossDomainMessenger, bound to a specific deployed contract. +func NewL1CrossDomainMessenger(address common.Address, backend bind.ContractBackend) (*L1CrossDomainMessenger, error) { + contract, err := bindL1CrossDomainMessenger(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &L1CrossDomainMessenger{L1CrossDomainMessengerCaller: L1CrossDomainMessengerCaller{contract: contract}, L1CrossDomainMessengerTransactor: L1CrossDomainMessengerTransactor{contract: contract}, L1CrossDomainMessengerFilterer: L1CrossDomainMessengerFilterer{contract: contract}}, nil +} + +// NewL1CrossDomainMessengerCaller creates a new read-only instance of L1CrossDomainMessenger, bound to a specific deployed contract. +func NewL1CrossDomainMessengerCaller(address common.Address, caller bind.ContractCaller) (*L1CrossDomainMessengerCaller, error) { + contract, err := bindL1CrossDomainMessenger(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerCaller{contract: contract}, nil +} + +// NewL1CrossDomainMessengerTransactor creates a new write-only instance of L1CrossDomainMessenger, bound to a specific deployed contract. +func NewL1CrossDomainMessengerTransactor(address common.Address, transactor bind.ContractTransactor) (*L1CrossDomainMessengerTransactor, error) { + contract, err := bindL1CrossDomainMessenger(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerTransactor{contract: contract}, nil +} + +// NewL1CrossDomainMessengerFilterer creates a new log filterer instance of L1CrossDomainMessenger, bound to a specific deployed contract. +func NewL1CrossDomainMessengerFilterer(address common.Address, filterer bind.ContractFilterer) (*L1CrossDomainMessengerFilterer, error) { + contract, err := bindL1CrossDomainMessenger(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerFilterer{contract: contract}, nil +} + +// bindL1CrossDomainMessenger binds a generic wrapper to an already deployed contract. +func bindL1CrossDomainMessenger(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(L1CrossDomainMessengerABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L1CrossDomainMessenger *L1CrossDomainMessengerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.L1CrossDomainMessengerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L1CrossDomainMessenger.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.contract.Transact(opts, method, params...) +} + +// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a. +// +// Solidity: function MESSAGE_VERSION() view returns(uint16) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MESSAGEVERSION(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MESSAGE_VERSION") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a. +// +// Solidity: function MESSAGE_VERSION() view returns(uint16) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MESSAGEVERSION() (uint16, error) { + return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts) +} + +// MESSAGEVERSION is a free data retrieval call binding the contract method 0x3f827a5a. +// +// Solidity: function MESSAGE_VERSION() view returns(uint16) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MESSAGEVERSION() (uint16, error) { + return _L1CrossDomainMessenger.Contract.MESSAGEVERSION(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7. +// +// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASCALLDATAOVERHEAD(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CALLDATA_OVERHEAD") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7. +// +// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASCALLDATAOVERHEAD() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASCALLDATAOVERHEAD is a free data retrieval call binding the contract method 0x028f85f7. +// +// Solidity: function MIN_GAS_CALLDATA_OVERHEAD() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASCALLDATAOVERHEAD() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASCALLDATAOVERHEAD(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x7dea7cc3. +// +// Solidity: function MIN_GAS_CONSTANT_OVERHEAD() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASCONSTANTOVERHEAD(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_CONSTANT_OVERHEAD") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// MINGASCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x7dea7cc3. +// +// Solidity: function MIN_GAS_CONSTANT_OVERHEAD() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASCONSTANTOVERHEAD() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASCONSTANTOVERHEAD is a free data retrieval call binding the contract method 0x7dea7cc3. +// +// Solidity: function MIN_GAS_CONSTANT_OVERHEAD() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASCONSTANTOVERHEAD() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASCONSTANTOVERHEAD(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498. +// +// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADDENOMINATOR(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498. +// +// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASDYNAMICOVERHEADDENOMINATOR is a free data retrieval call binding the contract method 0x0c568498. +// +// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADDENOMINATOR() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADDENOMINATOR(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8. +// +// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MINGASDYNAMICOVERHEADNUMERATOR(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8. +// +// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts) +} + +// MINGASDYNAMICOVERHEADNUMERATOR is a free data retrieval call binding the contract method 0x2828d7e8. +// +// Solidity: function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MINGASDYNAMICOVERHEADNUMERATOR() (uint32, error) { + return _L1CrossDomainMessenger.Contract.MINGASDYNAMICOVERHEADNUMERATOR(&_L1CrossDomainMessenger.CallOpts) +} + +// BaseGas is a free data retrieval call binding the contract method 0xb28ade25. +// +// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) BaseGas(opts *bind.CallOpts, _message []byte, _minGasLimit uint32) (uint32, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "baseGas", _message, _minGasLimit) + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// BaseGas is a free data retrieval call binding the contract method 0xb28ade25. +// +// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint32, error) { + return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit) +} + +// BaseGas is a free data retrieval call binding the contract method 0xb28ade25. +// +// Solidity: function baseGas(bytes _message, uint32 _minGasLimit) pure returns(uint32) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) BaseGas(_message []byte, _minGasLimit uint32) (uint32, error) { + return _L1CrossDomainMessenger.Contract.BaseGas(&_L1CrossDomainMessenger.CallOpts, _message, _minGasLimit) +} + +// BlockedSystemAddresses is a free data retrieval call binding the contract method 0x4b134ce7. +// +// Solidity: function blockedSystemAddresses(address ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) BlockedSystemAddresses(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "blockedSystemAddresses", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// BlockedSystemAddresses is a free data retrieval call binding the contract method 0x4b134ce7. +// +// Solidity: function blockedSystemAddresses(address ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) BlockedSystemAddresses(arg0 common.Address) (bool, error) { + return _L1CrossDomainMessenger.Contract.BlockedSystemAddresses(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// BlockedSystemAddresses is a free data retrieval call binding the contract method 0x4b134ce7. +// +// Solidity: function blockedSystemAddresses(address ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) BlockedSystemAddresses(arg0 common.Address) (bool, error) { + return _L1CrossDomainMessenger.Contract.BlockedSystemAddresses(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// MessageNonce is a free data retrieval call binding the contract method 0xecc70428. +// +// Solidity: function messageNonce() view returns(uint256) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) MessageNonce(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "messageNonce") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MessageNonce is a free data retrieval call binding the contract method 0xecc70428. +// +// Solidity: function messageNonce() view returns(uint256) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) MessageNonce() (*big.Int, error) { + return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts) +} + +// MessageNonce is a free data retrieval call binding the contract method 0xecc70428. +// +// Solidity: function messageNonce() view returns(uint256) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) MessageNonce() (*big.Int, error) { + return _L1CrossDomainMessenger.Contract.MessageNonce(&_L1CrossDomainMessenger.CallOpts) +} + +// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80. +// +// Solidity: function otherMessenger() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) OtherMessenger(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "otherMessenger") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80. +// +// Solidity: function otherMessenger() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) OtherMessenger() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts) +} + +// OtherMessenger is a free data retrieval call binding the contract method 0xdb505d80. +// +// Solidity: function otherMessenger() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) OtherMessenger() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.OtherMessenger(&_L1CrossDomainMessenger.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Owner() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.Owner(&_L1CrossDomainMessenger.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Owner() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.Owner(&_L1CrossDomainMessenger.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Paused(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "paused") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Paused() (bool, error) { + return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Paused() (bool, error) { + return _L1CrossDomainMessenger.Contract.Paused(&_L1CrossDomainMessenger.CallOpts) +} + +// Portal is a free data retrieval call binding the contract method 0x6425666b. +// +// Solidity: function portal() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Portal(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "portal") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Portal is a free data retrieval call binding the contract method 0x6425666b. +// +// Solidity: function portal() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Portal() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts) +} + +// Portal is a free data retrieval call binding the contract method 0x6425666b. +// +// Solidity: function portal() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Portal() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.Portal(&_L1CrossDomainMessenger.CallOpts) +} + +// ReceivedMessages is a free data retrieval call binding the contract method 0xf69f8151. +// +// Solidity: function receivedMessages(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) ReceivedMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "receivedMessages", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ReceivedMessages is a free data retrieval call binding the contract method 0xf69f8151. +// +// Solidity: function receivedMessages(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) ReceivedMessages(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.ReceivedMessages(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// ReceivedMessages is a free data retrieval call binding the contract method 0xf69f8151. +// +// Solidity: function receivedMessages(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) ReceivedMessages(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.ReceivedMessages(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209. +// +// Solidity: function successfulMessages(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) SuccessfulMessages(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "successfulMessages", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209. +// +// Solidity: function successfulMessages(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// SuccessfulMessages is a free data retrieval call binding the contract method 0xb1b1b209. +// +// Solidity: function successfulMessages(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) SuccessfulMessages(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.SuccessfulMessages(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) Version(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "version") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Version() (string, error) { + return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) Version() (string, error) { + return _L1CrossDomainMessenger.Contract.Version(&_L1CrossDomainMessenger.CallOpts) +} + +// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45. +// +// Solidity: function xDomainMessageSender() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) XDomainMessageSender(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "xDomainMessageSender") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45. +// +// Solidity: function xDomainMessageSender() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) XDomainMessageSender() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts) +} + +// XDomainMessageSender is a free data retrieval call binding the contract method 0x6e296e45. +// +// Solidity: function xDomainMessageSender() view returns(address) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) XDomainMessageSender() (common.Address, error) { + return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1CrossDomainMessenger.contract.Transact(opts, "initialize") +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Initialize() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c. +// +// Solidity: function initialize() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Initialize() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.Initialize(&_L1CrossDomainMessenger.TransactOpts) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1CrossDomainMessenger.contract.Transact(opts, "pause") +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Pause() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.Pause(&_L1CrossDomainMessenger.TransactOpts) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Pause() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.Pause(&_L1CrossDomainMessenger.TransactOpts) +} + +// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b. +// +// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) RelayMessage(opts *bind.TransactOpts, _nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) { + return _L1CrossDomainMessenger.contract.Transact(opts, "relayMessage", _nonce, _sender, _target, _value, _minGasLimit, _message) +} + +// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b. +// +// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message) +} + +// RelayMessage is a paid mutator transaction binding the contract method 0xd764ad0b. +// +// Solidity: function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) RelayMessage(_nonce *big.Int, _sender common.Address, _target common.Address, _value *big.Int, _minGasLimit *big.Int, _message []byte) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.RelayMessage(&_L1CrossDomainMessenger.TransactOpts, _nonce, _sender, _target, _value, _minGasLimit, _message) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1CrossDomainMessenger.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) RenounceOwnership() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.RenounceOwnership(&_L1CrossDomainMessenger.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.RenounceOwnership(&_L1CrossDomainMessenger.TransactOpts) +} + +// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b. +// +// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) SendMessage(opts *bind.TransactOpts, _target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) { + return _L1CrossDomainMessenger.contract.Transact(opts, "sendMessage", _target, _message, _minGasLimit) +} + +// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b. +// +// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit) +} + +// SendMessage is a paid mutator transaction binding the contract method 0x3dbb202b. +// +// Solidity: function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) SendMessage(_target common.Address, _message []byte, _minGasLimit uint32) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.SendMessage(&_L1CrossDomainMessenger.TransactOpts, _target, _message, _minGasLimit) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _L1CrossDomainMessenger.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.TransferOwnership(&_L1CrossDomainMessenger.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.TransferOwnership(&_L1CrossDomainMessenger.TransactOpts, newOwner) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1CrossDomainMessenger.contract.Transact(opts, "unpause") +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) Unpause() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.Unpause(&_L1CrossDomainMessenger.TransactOpts) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Unpause() (*types.Transaction, error) { + return _L1CrossDomainMessenger.Contract.Unpause(&_L1CrossDomainMessenger.TransactOpts) +} + +// L1CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerFailedRelayedMessageIterator struct { + Event *L1CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerFailedRelayedMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerFailedRelayedMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerFailedRelayedMessageIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerFailedRelayedMessage represents a FailedRelayedMessage event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerFailedRelayedMessage struct { + MsgHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterFailedRelayedMessage is a free log retrieval operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f. +// +// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterFailedRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerFailedRelayedMessageIterator, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "FailedRelayedMessage", msgHashRule) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerFailedRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "FailedRelayedMessage", logs: logs, sub: sub}, nil +} + +// WatchFailedRelayedMessage is a free log subscription operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f. +// +// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchFailedRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerFailedRelayedMessage, msgHash [][32]byte) (event.Subscription, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "FailedRelayedMessage", msgHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerFailedRelayedMessage) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseFailedRelayedMessage is a log parse operation binding the contract event 0x99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f. +// +// Solidity: event FailedRelayedMessage(bytes32 indexed msgHash) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseFailedRelayedMessage(log types.Log) (*L1CrossDomainMessengerFailedRelayedMessage, error) { + event := new(L1CrossDomainMessengerFailedRelayedMessage) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "FailedRelayedMessage", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1CrossDomainMessengerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerInitializedIterator struct { + Event *L1CrossDomainMessengerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerInitialized represents a Initialized event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1CrossDomainMessengerInitializedIterator, error) { + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerInitializedIterator{contract: _L1CrossDomainMessenger.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerInitialized) (event.Subscription, error) { + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerInitialized) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseInitialized(log types.Log) (*L1CrossDomainMessengerInitialized, error) { + event := new(L1CrossDomainMessengerInitialized) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1CrossDomainMessengerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerOwnershipTransferredIterator struct { + Event *L1CrossDomainMessengerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerOwnershipTransferred represents a OwnershipTransferred event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*L1CrossDomainMessengerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerOwnershipTransferredIterator{contract: _L1CrossDomainMessenger.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerOwnershipTransferred) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseOwnershipTransferred(log types.Log) (*L1CrossDomainMessengerOwnershipTransferred, error) { + event := new(L1CrossDomainMessengerOwnershipTransferred) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1CrossDomainMessengerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerPausedIterator struct { + Event *L1CrossDomainMessengerPaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerPausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerPausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerPausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerPaused represents a Paused event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerPaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterPaused(opts *bind.FilterOpts) (*L1CrossDomainMessengerPausedIterator, error) { + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "Paused") + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerPausedIterator{contract: _L1CrossDomainMessenger.contract, event: "Paused", logs: logs, sub: sub}, nil +} + +// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerPaused) (event.Subscription, error) { + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "Paused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerPaused) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Paused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParsePaused(log types.Log) (*L1CrossDomainMessengerPaused, error) { + event := new(L1CrossDomainMessengerPaused) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Paused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1CrossDomainMessengerRelayedMessageIterator is returned from FilterRelayedMessage and is used to iterate over the raw logs and unpacked data for RelayedMessage events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerRelayedMessageIterator struct { + Event *L1CrossDomainMessengerRelayedMessage // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerRelayedMessageIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerRelayedMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerRelayedMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerRelayedMessageIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerRelayedMessageIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerRelayedMessage represents a RelayedMessage event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerRelayedMessage struct { + MsgHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRelayedMessage is a free log retrieval operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c. +// +// Solidity: event RelayedMessage(bytes32 indexed msgHash) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterRelayedMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*L1CrossDomainMessengerRelayedMessageIterator, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "RelayedMessage", msgHashRule) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerRelayedMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "RelayedMessage", logs: logs, sub: sub}, nil +} + +// WatchRelayedMessage is a free log subscription operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c. +// +// Solidity: event RelayedMessage(bytes32 indexed msgHash) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchRelayedMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerRelayedMessage, msgHash [][32]byte) (event.Subscription, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "RelayedMessage", msgHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerRelayedMessage) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRelayedMessage is a log parse operation binding the contract event 0x4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c. +// +// Solidity: event RelayedMessage(bytes32 indexed msgHash) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseRelayedMessage(log types.Log) (*L1CrossDomainMessengerRelayedMessage, error) { + event := new(L1CrossDomainMessengerRelayedMessage) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "RelayedMessage", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1CrossDomainMessengerSentMessageIterator is returned from FilterSentMessage and is used to iterate over the raw logs and unpacked data for SentMessage events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerSentMessageIterator struct { + Event *L1CrossDomainMessengerSentMessage // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerSentMessageIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerSentMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerSentMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerSentMessageIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerSentMessageIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerSentMessage represents a SentMessage event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerSentMessage struct { + Target common.Address + Sender common.Address + Message []byte + MessageNonce *big.Int + GasLimit *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSentMessage is a free log retrieval operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a. +// +// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessage(opts *bind.FilterOpts, target []common.Address) (*L1CrossDomainMessengerSentMessageIterator, error) { + + var targetRule []interface{} + for _, targetItem := range target { + targetRule = append(targetRule, targetItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessage", targetRule) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerSentMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessage", logs: logs, sub: sub}, nil +} + +// WatchSentMessage is a free log subscription operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a. +// +// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessage, target []common.Address) (event.Subscription, error) { + + var targetRule []interface{} + for _, targetItem := range target { + targetRule = append(targetRule, targetItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessage", targetRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerSentMessage) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSentMessage is a log parse operation binding the contract event 0xcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a. +// +// Solidity: event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessage(log types.Log) (*L1CrossDomainMessengerSentMessage, error) { + event := new(L1CrossDomainMessengerSentMessage) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessage", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1CrossDomainMessengerSentMessageExtension1Iterator is returned from FilterSentMessageExtension1 and is used to iterate over the raw logs and unpacked data for SentMessageExtension1 events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerSentMessageExtension1Iterator struct { + Event *L1CrossDomainMessengerSentMessageExtension1 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerSentMessageExtension1) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerSentMessageExtension1) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerSentMessageExtension1Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerSentMessageExtension1 represents a SentMessageExtension1 event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerSentMessageExtension1 struct { + Sender common.Address + Value *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSentMessageExtension1 is a free log retrieval operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546. +// +// Solidity: event SentMessageExtension1(address indexed sender, uint256 value) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterSentMessageExtension1(opts *bind.FilterOpts, sender []common.Address) (*L1CrossDomainMessengerSentMessageExtension1Iterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "SentMessageExtension1", senderRule) + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerSentMessageExtension1Iterator{contract: _L1CrossDomainMessenger.contract, event: "SentMessageExtension1", logs: logs, sub: sub}, nil +} + +// WatchSentMessageExtension1 is a free log subscription operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546. +// +// Solidity: event SentMessageExtension1(address indexed sender, uint256 value) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchSentMessageExtension1(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerSentMessageExtension1, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "SentMessageExtension1", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerSentMessageExtension1) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSentMessageExtension1 is a log parse operation binding the contract event 0x8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d546. +// +// Solidity: event SentMessageExtension1(address indexed sender, uint256 value) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseSentMessageExtension1(log types.Log) (*L1CrossDomainMessengerSentMessageExtension1, error) { + event := new(L1CrossDomainMessengerSentMessageExtension1) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "SentMessageExtension1", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1CrossDomainMessengerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerUnpausedIterator struct { + Event *L1CrossDomainMessengerUnpaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1CrossDomainMessengerUnpausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1CrossDomainMessengerUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1CrossDomainMessengerUnpausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1CrossDomainMessengerUnpausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1CrossDomainMessengerUnpaused represents a Unpaused event raised by the L1CrossDomainMessenger contract. +type L1CrossDomainMessengerUnpaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterUnpaused(opts *bind.FilterOpts) (*L1CrossDomainMessengerUnpausedIterator, error) { + + logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return &L1CrossDomainMessengerUnpausedIterator{contract: _L1CrossDomainMessenger.contract, event: "Unpaused", logs: logs, sub: sub}, nil +} + +// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerUnpaused) (event.Subscription, error) { + + logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1CrossDomainMessengerUnpaused) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Unpaused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseUnpaused(log types.Log) (*L1CrossDomainMessengerUnpaused, error) { + event := new(L1CrossDomainMessengerUnpaused) + if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "Unpaused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-bindings/bindings/l2crossdomainmessenger_more.go b/op-bindings/bindings/l2crossdomainmessenger_more.go new file mode 100755 index 0000000000000..18d16ec403626 --- /dev/null +++ b/op-bindings/bindings/l2crossdomainmessenger_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const L2CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":26067,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":26070,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":26681,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":25939,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":26059,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":26232,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":26337,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":26352,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"_status\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":26396,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":23674,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"successfulMessages\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":23677,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"xDomainMsgSender\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_address\"},{\"astId\":23680,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"msgNonce\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_uint240\"},{\"astId\":23683,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"otherMessenger\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_address\"},{\"astId\":23688,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"receivedMessages\",\"offset\":0,\"slot\":\"205\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":23693,\"contract\":\"contracts/L2/L2CrossDomainMessenger.sol:L2CrossDomainMessenger\",\"label\":\"blockedSystemAddresses\",\"offset\":0,\"slot\":\"206\",\"type\":\"t_mapping(t_address,t_bool)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_uint240\":{\"encoding\":\"inplace\",\"label\":\"uint240\",\"numberOfBytes\":\"30\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" + +var L2CrossDomainMessengerStorageLayout = new(solc.StorageLayout) + +var L2CrossDomainMessengerDeployedBin = "0x6080604052600436106101805760003560e01c80637dea7cc3116100d6578063c4d66de81161007f578063ecc7042811610059578063ecc704281461042d578063f2fde38b14610492578063f69f8151146104b257600080fd5b8063c4d66de8146103cd578063d764ad0b146103ed578063db505d801461040057600080fd5b8063a7119869116100b0578063a711986914610352578063b1b1b2091461037d578063b28ade25146103ad57600080fd5b80637dea7cc3146102fb5780638456cb59146103125780638da5cb5b1461032757600080fd5b80633f827a5a116101385780635c975abb116101125780635c975abb146102945780636e296e45146102ac578063715018a6146102e657600080fd5b80633f827a5a1461020a5780634b134ce71461023257806354fd4d501461027257600080fd5b80632828d7e8116101695780632828d7e8146101ca5780633dbb202b146101e05780633f4ba83a146101f557600080fd5b8063028f85f7146101855780630c568498146101b4575b600080fd5b34801561019157600080fd5b5061019a601081565b60405163ffffffff90911681526020015b60405180910390f35b3480156101c057600080fd5b5061019a6103e881565b3480156101d657600080fd5b5061019a6103f881565b6101f36101ee366004611ed0565b6104e2565b005b34801561020157600080fd5b506101f3610745565b34801561021657600080fd5b5061021f600181565b60405161ffff90911681526020016101ab565b34801561023e57600080fd5b5061026261024d366004611f35565b60ce6020526000908152604090205460ff1681565b60405190151581526020016101ab565b34801561027e57600080fd5b50610287610757565b6040516101ab9190611fd1565b3480156102a057600080fd5b5060655460ff16610262565b3480156102b857600080fd5b506102c16107fa565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ab565b3480156102f257600080fd5b506101f36108e6565b34801561030757600080fd5b5061019a62030d4081565b34801561031e57600080fd5b506101f36108f8565b34801561033357600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166102c1565b34801561035e57600080fd5b5060cc5473ffffffffffffffffffffffffffffffffffffffff166102c1565b34801561038957600080fd5b50610262610398366004611fe4565b60c96020526000908152604090205460ff1681565b3480156103b957600080fd5b5061019a6103c8366004611ffd565b610908565b3480156103d957600080fd5b506101f36103e8366004611f35565b61094e565b6101f36103fb366004612051565b610bc9565b34801561040c57600080fd5b5060cc546102c19073ffffffffffffffffffffffffffffffffffffffff1681565b34801561043957600080fd5b5061048460cb547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b6040519081526020016101ab565b34801561049e57600080fd5b506101f36104ad366004611f35565b611278565b3480156104be57600080fd5b506102626104cd366004611fe4565b60cd6020526000908152604090205460ff1681565b60cc5461061a9073ffffffffffffffffffffffffffffffffffffffff1661050a858585610908565b63ffffffff16347fd764ad0b0000000000000000000000000000000000000000000000000000000061057c60cb547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b338a34898c8c604051602401610598979695949392919061211c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261134b565b8373ffffffffffffffffffffffffffffffffffffffff167fcb0f7ffd78f9aee47a248fae8db181db6eee833039123e026dcbff529522e52a33858561069f60cb547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790565b866040516106b195949392919061217b565b60405180910390a260405134815233907f8ebb2ec2465bdb2a06a66fc37a0963af8a2a6a1479d81d56fdb8cbb98096d5469060200160405180910390a2505060cb80547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b61074d6113d9565b61075561145a565b565b60606107827f00000000000000000000000000000000000000000000000000000000000000006114d7565b6107ab7f00000000000000000000000000000000000000000000000000000000000000006114d7565b6107d47f00000000000000000000000000000000000000000000000000000000000000006114d7565b6040516020016107e6939291906121c9565b604051602081830303815290604052905090565b60ca5460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2153016108c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060ca5473ffffffffffffffffffffffffffffffffffffffff1690565b6108ee6113d9565b610755600061160c565b6109006113d9565b610755611683565b600062030d4061091960108561226e565b6103e86109286103f88661226e565b61093291906122c9565b61093c91906122ec565b61094691906122ec565b949350505050565b600054610100900460ff161580801561096e5750600054600160ff909116105b806109885750303b158015610988575060005460ff166001145b610a14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108c0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a7257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60408051600280825260608201835260009260208301908036833701905050905073420000000000000000000000000000000000000781600081518110610abb57610abb612343565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073420000000000000000000000000000000000000081600181518110610b1d57610b1d612343565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610b6183826116de565b508015610bc557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600260975403610c35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108c0565b6002609755610c42611879565b6000610c88888888888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506118e692505050565b9050610cd160cc54337fffffffffffffffffffffffffeeeeffffffffffffffffffffffffffffffffeeef0173ffffffffffffffffffffffffffffffffffffffff90811691161490565b15610d6a57843414610d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f43726f7373446f6d61696e4d657373656e6765723a206d69736d61746368656460448201527f206d6573736167652076616c756500000000000000000000000000000000000060648201526084016108c0565b610ebc565b3415610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016108c0565b600081815260cd602052604090205460ff16610ebc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016108c0565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260ce602052604090205460ff1615610f98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016108c0565b600081815260c9602052604090205460ff1615611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016108c0565b61104361afc885612372565b5a10156110d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f43726f7373446f6d61696e4d657373656e6765723a20696e737566666963696560448201527f6e742067617320746f2072656c6179206d65737361676500000000000000000060648201526084016108c0565b60ca80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8916179055600061116e8761112661138861afc861238a565b5a611131919061238a565b8887878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506119b492505050565b60ca80547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080151560010361120957600082815260c9602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611268565b600082815260cd602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a25b5050600160975550505050505050565b6112806113d9565b73ffffffffffffffffffffffffffffffffffffffff8116611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108c0565b61132c8161160c565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fc2b3e5ac0000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000009063c2b3e5ac9084906113a1908890889087906004016123a1565b6000604051808303818588803b1580156113ba57600080fd5b505af11580156113ce573d6000803e3d6000fd5b505050505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c0565b6114626119ce565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60608160000361151a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611544578061152e816123e9565b915061153d9050600a83612421565b915061151e565b60008167ffffffffffffffff81111561155f5761155f612314565b6040519080825280601f01601f191660200182016040528015611589576020820181803683370190505b5090505b84156109465761159e60018361238a565b91506115ab600a86612435565b6115b6906030612372565b60f81b8183815181106115cb576115cb612343565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611605600a86612421565b945061158d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61168b611879565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114ad3390565b600054610100900460ff16611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c0565b60ca805461dead7fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560cc805490911673ffffffffffffffffffffffffffffffffffffffff841617905560005b815181101561185857600160ce60008484815181106117e9576117e9612343565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905580611850816123e9565b9150506117c8565b50611861611a3a565b611869611ad1565b611871611b71565b610bc5611c32565b60655460ff1615610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016108c0565b600060f087901c808203611908576119008688858b611cd0565b9150506119aa565b8061ffff1660010361192257611900888888888888611cef565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f48617368696e673a20756e6b6e6f776e2063726f737320646f6d61696e206d6560448201527f73736167652076657273696f6e0000000000000000000000000000000000000060648201526084016108c0565b9695505050505050565b600080600080845160208601878a8af19695505050505050565b60655460ff16610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016108c0565b600054610100900460ff16610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c0565b600054610100900460ff16611b68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c0565b6107553361160c565b600054610100900460ff16611c08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c0565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600054610100900460ff16611cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108c0565b6001609755565b6000611cde85858585611d12565b805190602001209050949350505050565b6000611cff878787878787611dab565b8051906020012090509695505050505050565b606084848484604051602401611d2b9493929190612449565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcbd4ece9000000000000000000000000000000000000000000000000000000001790529050949350505050565b6060868686868686604051602401611dc896959493929190612493565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611e6e57600080fd5b919050565b60008083601f840112611e8557600080fd5b50813567ffffffffffffffff811115611e9d57600080fd5b602083019150836020828501011115611eb557600080fd5b9250929050565b803563ffffffff81168114611e6e57600080fd5b60008060008060608587031215611ee657600080fd5b611eef85611e4a565b9350602085013567ffffffffffffffff811115611f0b57600080fd5b611f1787828801611e73565b9094509250611f2a905060408601611ebc565b905092959194509250565b600060208284031215611f4757600080fd5b611f5082611e4a565b9392505050565b60005b83811015611f72578181015183820152602001611f5a565b83811115611f81576000848401525b50505050565b60008151808452611f9f816020860160208601611f57565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611f506020830184611f87565b600060208284031215611ff657600080fd5b5035919050565b60008060006040848603121561201257600080fd5b833567ffffffffffffffff81111561202957600080fd5b61203586828701611e73565b9094509250612048905060208501611ebc565b90509250925092565b600080600080600080600060c0888a03121561206c57600080fd5b8735965061207c60208901611e4a565b955061208a60408901611e4a565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156120b457600080fd5b6120c08a828b01611e73565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a083015261216e60c0830184866120d3565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff861681526080602082015260006121ab6080830186886120d3565b905083604083015263ffffffff831660608301529695505050505050565b600084516121db818460208901611f57565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551612217816001850160208a01611f57565b60019201918201528351612232816002840160208801611f57565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818516818304811182151516156122915761229161223f565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600063ffffffff808416806122e0576122e061229a565b92169190910492915050565b600063ffffffff80831681851680830382111561230b5761230b61223f565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082198211156123855761238561223f565b500190565b60008282101561239c5761239c61223f565b500390565b73ffffffffffffffffffffffffffffffffffffffff8416815267ffffffffffffffff831660208201526060604082015260006123e06060830184611f87565b95945050505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361241a5761241a61223f565b5060010190565b6000826124305761243061229a565b500490565b6000826124445761244461229a565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526124826080830185611f87565b905082606083015295945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526124de60c0830184611f87565b9897505050505050505056fea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(L2CrossDomainMessengerStorageLayoutJSON), L2CrossDomainMessengerStorageLayout); err != nil { + panic(err) + } + + layouts["L2CrossDomainMessenger"] = L2CrossDomainMessengerStorageLayout + deployedBytecodes["L2CrossDomainMessenger"] = L2CrossDomainMessengerDeployedBin +} diff --git a/op-bindings/bindings/l2standardbridge_more.go b/op-bindings/bindings/l2standardbridge_more.go new file mode 100755 index 0000000000000..3360e55e6f6e9 --- /dev/null +++ b/op-bindings/bindings/l2standardbridge_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const L2StandardBridgeStorageLayoutJSON = "{\"storage\":[{\"astId\":26067,\"contract\":\"contracts/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":26070,\"contract\":\"contracts/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":25154,\"contract\":\"contracts/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"messenger\",\"offset\":2,\"slot\":\"0\",\"type\":\"t_contract(CrossDomainMessenger)24067\"},{\"astId\":25158,\"contract\":\"contracts/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"otherBridge\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_contract(StandardBridge)25835\"},{\"astId\":25165,\"contract\":\"contracts/L2/L2StandardBridge.sol:L2StandardBridge\",\"label\":\"deposits\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_contract(CrossDomainMessenger)24067\":{\"encoding\":\"inplace\",\"label\":\"contract CrossDomainMessenger\",\"numberOfBytes\":\"20\"},\"t_contract(StandardBridge)25835\":{\"encoding\":\"inplace\",\"label\":\"contract StandardBridge\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" + +var L2StandardBridgeStorageLayout = new(solc.StorageLayout) + +var L2StandardBridgeDeployedBin = "0x6080604052600436106100ec5760003560e01c8063662a633a1161008a578063af565a1311610059578063af565a131461032f578063c4d66de81461034f578063c89701a21461036f578063e11013dd1461039c57600080fd5b8063662a633a146102a357806387087623146102b65780638f601f66146102d6578063a3a795481461031c57600080fd5b806332b7006d116100c657806332b7006d146101f15780633cb747bf14610204578063540abf731461026157806354fd4d501461028157600080fd5b80630166a07a146101ab57806309fc8843146101cb5780631635f5fd146101de57600080fd5b366101a657333b15610185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b6101a433333462030d40604051806020016040528060008152506103cb565b005b600080fd5b3480156101b757600080fd5b506101a46101c636600461248e565b610567565b6101a46101d936600461253f565b6108b2565b6101a46101ec366004612592565b610989565b6101a46101ff366004612605565b610d6e565b34801561021057600080fd5b506000546102379062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561026d57600080fd5b506101a461027c366004612659565b610e13565b34801561028d57600080fd5b50610296610e23565b6040516102589190612746565b6101a46102b136600461248e565b610ec6565b3480156102c257600080fd5b506101a46102d1366004612759565b610fb3565b3480156102e257600080fd5b5061030e6102f13660046127dc565b600260209081526000928352604080842090915290825290205481565b604051908152602001610258565b6101a461032a366004612759565b611052565b34801561033b57600080fd5b506101a461034a366004612815565b611061565b34801561035b57600080fd5b506101a461036a366004612866565b611374565b34801561037b57600080fd5b506001546102379073ffffffffffffffffffffffffffffffffffffffff1681565b6101a46103aa366004612883565b61151d565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af5858460405161042a9291906128e6565b60405180910390a360005460015460405173ffffffffffffffffffffffffffffffffffffffff62010000909304831692633dbb202b9287929116907f1635f5fd000000000000000000000000000000000000000000000000000000009061049b908b908b9086908a906024016128ff565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261052e92918890600401612948565b6000604051808303818588803b15801561054757600080fd5b505af115801561055b573d6000803e3d6000fd5b50505050505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331480156106495750600154600054604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416936201000090930490921691636e296e45916004808201926020929091908290030181865afa15801561060d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610631919061298d565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161017c565b6040517faf565a1300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808916600483015280881660248301528516604482015260648101849052309063af565a1390608401600060405180830381600087803b15801561077957600080fd5b505af192505050801561078a575060015b6108265761079f878786888760008888611560565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f2755817676249910615f0a6a240ad225abe5343df8d527f7294c4af36a92009a8787878760405161081994939291906129f3565b60405180910390a46108a9565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd878787876040516108a094939291906129f3565b60405180910390a45b50505050505050565b333b15610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161017c565b6109843333348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103cb92505050565b505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633148015610a6b5750600154600054604080517f6e296e45000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416936201000090930490921691636e296e45916004808201926020929091908290030181865afa158015610a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a53919061298d565b73ffffffffffffffffffffffffffffffffffffffff16145b610b1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161017c565b823414610bac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e74207265717569726564000000000000606482015260840161017c565b3073ffffffffffffffffffffffffffffffffffffffff851603610c51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c660000000000000000000000000000000000000000000000000000000000606482015260840161017c565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d858585604051610cb293929190612a29565b60405180910390a36000610cd7855a866040518060200160405280600081525061171d565b905080610d66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161017c565b505050505050565b333b15610dfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161017c565b610e0c85333387878787611737565b5050505050565b6108a9878733888888888861196e565b6060610e4e7f0000000000000000000000000000000000000000000000000000000000000000611c18565b610e777f0000000000000000000000000000000000000000000000000000000000000000611c18565b610ea07f0000000000000000000000000000000000000000000000000000000000000000611c18565b604051602001610eb293929190612a4c565b604051602081830303815290604052905090565b73ffffffffffffffffffffffffffffffffffffffff8716158015610f13575073ffffffffffffffffffffffffffffffffffffffff861673deaddeaddeaddeaddeaddeaddeaddeaddead0000145b15610f2a57610f258585858585610989565b610f39565b610f3986888787878787610567565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fb0444523268717a02698be47d0803aa7468c00acbed2f8bd93a0459cde61dd89878787876040516108a094939291906129f3565b333b15611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161017c565b610d66868633338888888861196e565b610d6686338787878787611737565b3330146110f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642062792073656c6600000000000000000000000000606482015260840161017c565b3073ffffffffffffffffffffffffffffffffffffffff851603611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5374616e646172644272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161017c565b61119e84611d55565b156112ec576111ad8484611d87565b61125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a40161017c565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390528516906340c10f1990604401600060405180830381600087803b1580156112cf57600080fd5b505af11580156112e3573d6000803e3d6000fd5b5050505061136e565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526002602090815260408083209387168352929052205461132a908290612af1565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526002602090815260408083209489168352939052919091209190915561136e908383611e2e565b50505050565b600054610100900460ff16158080156113945750600054600160ff909116105b806113ae5750303b1580156113ae575060005460ff166001145b61143a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161017c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561149857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6114b673420000000000000000000000000000000000000783611f02565b801561151957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b61136e3385348686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103cb92505050565b60005460015460405173ffffffffffffffffffffffffffffffffffffffff62010000909304831692633dbb202b9216907f0166a07a00000000000000000000000000000000000000000000000000000000906115cc908c908e908d908d908d908c908c90602401612b08565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b909216825261165f92918890600401612948565b600060405180830381600087803b15801561167957600080fd5b505af115801561168d573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8888878760405161170b94939291906129f3565b60405180910390a45050505050505050565b600080600080845160208601878a8af19695505050505050565b60008773ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a8919061298d565b90507fffffffffffffffffffffffff215221522152215221522152215221522153000073ffffffffffffffffffffffffffffffffffffffff8916016118e45784341461189c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4c325374616e646172644272696467653a20455448207769746864726177616c60448201527f73206d75737420696e636c7564652073756666696369656e742045544820766160648201527f6c75650000000000000000000000000000000000000000000000000000000000608482015260a40161017c565b6118df8787878787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103cb92505050565b6118f4565b6118f4888289898989898961196e565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f73d170910aba9e6d50b102db522b1dbcd796216f5128b445aa2135272886497e8989888860405161170b94939291906129f3565b3073ffffffffffffffffffffffffffffffffffffffff891603611a13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5374616e646172644272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c6600000000000000000000000000000000000000000000606482015260840161017c565b611a1c88611d55565b15611b6a57611a2b8888611d87565b611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204f7074696d69736d204d696e7461626c65204552433230206c60648201527f6f63616c20746f6b656e00000000000000000000000000000000000000000000608482015260a40161017c565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260248201869052891690639dc29fac90604401600060405180830381600087803b158015611b4d57600080fd5b505af1158015611b61573d6000803e3d6000fd5b50505050611bfe565b611b8c73ffffffffffffffffffffffffffffffffffffffff891687308761200e565b73ffffffffffffffffffffffffffffffffffffffff8089166000908152600260209081526040808320938b1683529290522054611bca908590612b65565b73ffffffffffffffffffffffffffffffffffffffff808a166000908152600260209081526040808320938c16835292905220555b611c0e8888888888888888611560565b5050505050505050565b606081600003611c5b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c855780611c6f81612b7d565b9150611c7e9050600a83612be4565b9150611c5f565b60008167ffffffffffffffff811115611ca057611ca0612bf8565b6040519080825280601f01601f191660200182016040528015611cca576020820181803683370190505b5090505b8415611d4d57611cdf600183612af1565b9150611cec600a86612c27565b611cf7906030612b65565b60f81b818381518110611d0c57611d0c612c3b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d46600a86612be4565b9450611cce565b949350505050565b6000611d81827f1d1d8b630000000000000000000000000000000000000000000000000000000061206c565b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663c01e1bd66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df8919061298d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109849084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261208f565b600054610100900460ff16611f99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161017c565b600080547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff94851602179055600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261136e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e80565b60006120778361219b565b8015612088575061208883836121ff565b9392505050565b60006120f1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122ce9092919063ffffffff16565b805190915015610984578080602001905181019061210f9190612c6a565b610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161017c565b60006121c7827f01ffc9a7000000000000000000000000000000000000000000000000000000006121ff565b8015611d8157506121f8827fffffffff000000000000000000000000000000000000000000000000000000006121ff565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156122b7575060208210155b80156122c35750600081115b979650505050505050565b6060611d4d84846000858573ffffffffffffffffffffffffffffffffffffffff85163b612357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161017c565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516123809190612c8c565b60006040518083038185875af1925050503d80600081146123bd576040519150601f19603f3d011682016040523d82523d6000602084013e6123c2565b606091505b50915091506122c3828286606083156123dc575081612088565b8251156123ec5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017c9190612746565b73ffffffffffffffffffffffffffffffffffffffff8116811461244257600080fd5b50565b60008083601f84011261245757600080fd5b50813567ffffffffffffffff81111561246f57600080fd5b60208301915083602082850101111561248757600080fd5b9250929050565b600080600080600080600060c0888a0312156124a957600080fd5b87356124b481612420565b965060208801356124c481612420565b955060408801356124d481612420565b945060608801356124e481612420565b93506080880135925060a088013567ffffffffffffffff81111561250757600080fd5b6125138a828b01612445565b989b979a50959850939692959293505050565b803563ffffffff8116811461253a57600080fd5b919050565b60008060006040848603121561255457600080fd5b61255d84612526565b9250602084013567ffffffffffffffff81111561257957600080fd5b61258586828701612445565b9497909650939450505050565b6000806000806000608086880312156125aa57600080fd5b85356125b581612420565b945060208601356125c581612420565b935060408601359250606086013567ffffffffffffffff8111156125e857600080fd5b6125f488828901612445565b969995985093965092949392505050565b60008060008060006080868803121561261d57600080fd5b853561262881612420565b94506020860135935061263d60408701612526565b9250606086013567ffffffffffffffff8111156125e857600080fd5b600080600080600080600060c0888a03121561267457600080fd5b873561267f81612420565b9650602088013561268f81612420565b9550604088013561269f81612420565b9450606088013593506126b460808901612526565b925060a088013567ffffffffffffffff81111561250757600080fd5b60005b838110156126eb5781810151838201526020016126d3565b8381111561136e5750506000910152565b600081518084526127148160208601602086016126d0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061208860208301846126fc565b60008060008060008060a0878903121561277257600080fd5b863561277d81612420565b9550602087013561278d81612420565b9450604087013593506127a260608801612526565b9250608087013567ffffffffffffffff8111156127be57600080fd5b6127ca89828a01612445565b979a9699509497509295939492505050565b600080604083850312156127ef57600080fd5b82356127fa81612420565b9150602083013561280a81612420565b809150509250929050565b6000806000806080858703121561282b57600080fd5b843561283681612420565b9350602085013561284681612420565b9250604085013561285681612420565b9396929550929360600135925050565b60006020828403121561287857600080fd5b813561208881612420565b6000806000806060858703121561289957600080fd5b84356128a481612420565b93506128b260208601612526565b9250604085013567ffffffffffffffff8111156128ce57600080fd5b6128da87828801612445565b95989497509550505050565b828152604060208201526000611d4d60408301846126fc565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261293e60808301846126fc565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815260606020820152600061297760608301856126fc565b905063ffffffff83166040830152949350505050565b60006020828403121561299f57600080fd5b815161208881612420565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061293e6060830184866129aa565b838152604060208201526000612a436040830184866129aa565b95945050505050565b60008451612a5e8184602089016126d0565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551612a9a816001850160208a016126d0565b60019201918201528351612ab58160028401602088016126d0565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612b0357612b03612ac2565b500390565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152612b5860c0830184866129aa565b9998505050505050505050565b60008219821115612b7857612b78612ac2565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612bae57612bae612ac2565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612bf357612bf3612bb5565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082612c3657612c36612bb5565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612c7c57600080fd5b8151801515811461208857600080fd5b60008251612c9e8184602087016126d0565b919091019291505056fea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(L2StandardBridgeStorageLayoutJSON), L2StandardBridgeStorageLayout); err != nil { + panic(err) + } + + layouts["L2StandardBridge"] = L2StandardBridgeStorageLayout + deployedBytecodes["L2StandardBridge"] = L2StandardBridgeDeployedBin +} diff --git a/op-bindings/bindings/l2tol1messagepasser_deployed.go b/op-bindings/bindings/l2tol1messagepasser_more.go old mode 100644 new mode 100755 similarity index 78% rename from op-bindings/bindings/l2tol1messagepasser_deployed.go rename to op-bindings/bindings/l2tol1messagepasser_more.go index 9f6c83895df08..3ce9619d99a98 --- a/op-bindings/bindings/l2tol1messagepasser_deployed.go +++ b/op-bindings/bindings/l2tol1messagepasser_more.go @@ -1,5 +1,25 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. + package bindings +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const L2ToL1MessagePasserStorageLayoutJSON = "{\"storage\":[{\"astId\":2393,\"contract\":\"contracts/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser\",\"label\":\"sentMessages\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":2396,\"contract\":\"contracts/L2/L2ToL1MessagePasser.sol:L2ToL1MessagePasser\",\"label\":\"nonce\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint256\"}],\"types\":{\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" + +var L2ToL1MessagePasserStorageLayout = new(solc.StorageLayout) + var L2ToL1MessagePasserDeployedBin = "0x60806040526004361061005e5760003560e01c806382e3702d1161004357806382e3702d146100c7578063affed0e014610107578063c2b3e5ac1461012b57600080fd5b806344df8e701461008757806354fd4d501461009c57600080fd5b366100825761008033620186a060405180602001604052806000815250610139565b005b600080fd5b34801561009357600080fd5b5061008061026d565b3480156100a857600080fd5b506100b16102a5565b6040516100be9190610587565b60405180910390f35b3480156100d357600080fd5b506100f76100e23660046105a1565b60006020819052908152604090205460ff1681565b60405190151581526020016100be565b34801561011357600080fd5b5061011d60015481565b6040519081526020016100be565b6100806101393660046105e9565b600061019e6040518060c0016040528060015481526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200134815260200185815260200184815250610348565b6000818152602081905260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915554905191925073ffffffffffffffffffffffffffffffffffffffff8616913391907f87bf7b546c8de873abb0db5b579ec131f8d0cf5b14f39933551cf9ced23a61369061022c903490899089906106ed565b60405180910390a460405181907f2ef6ceb1668fdd882b1f89ddd53a666b0c1113d14cf90c0fbf97c7b1ad880fbb90600090a2505060018054810190555050565b4761027781610395565b60405181907f7967de617a5ac1cc7eba2d6f37570a0135afa950d8bb77cdd35f0d0b4e85a16f90600090a250565b60606102d07f00000000000000000000000000000000000000000000000000000000000000006103c4565b6102f97f00000000000000000000000000000000000000000000000000000000000000006103c4565b6103227f00000000000000000000000000000000000000000000000000000000000000006103c4565b60405160200161033493929190610715565b604051602081830303815290604052905090565b80516020808301516040808501516060860151608087015160a0880151935160009761037897909695910161078b565b604051602081830303815290604052805190602001209050919050565b806040516103a290610501565b6040518091039082f09050801580156103bf573d6000803e3d6000fd5b505050565b60608160000361040757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115610431578061041b81610811565b915061042a9050600a83610878565b915061040b565b60008167ffffffffffffffff81111561044c5761044c6105ba565b6040519080825280601f01601f191660200182016040528015610476576020820181803683370190505b5090505b84156104f95761048b60018361088c565b9150610498600a866108a3565b6104a39060306108b7565b60f81b8183815181106104b8576104b86108cf565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506104f2600a86610878565b945061047a565b949350505050565b6008806108ff83390190565b60005b83811015610528578181015183820152602001610510565b83811115610537576000848401525b50505050565b6000815180845261055581602086016020860161050d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061059a602083018461053d565b9392505050565b6000602082840312156105b357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156105fe57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461062257600080fd5b925060208401359150604084013567ffffffffffffffff8082111561064657600080fd5b818601915086601f83011261065a57600080fd5b81358181111561066c5761066c6105ba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156106b2576106b26105ba565b816040528281528960208487010111156106cb57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b83815282602082015260606040820152600061070c606083018461053d565b95945050505050565b6000845161072781846020890161050d565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551610763816001850160208a0161050d565b6001920191820152835161077e81600284016020880161050d565b0160020195945050505050565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a08301526107d660c083018461053d565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610842576108426107e2565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261088757610887610849565b500490565b60008282101561089e5761089e6107e2565b500390565b6000826108b2576108b2610849565b500690565b600082198211156108ca576108ca6107e2565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe608060405230fffea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(L2ToL1MessagePasserStorageLayoutJSON), L2ToL1MessagePasserStorageLayout); err != nil { + panic(err) + } + + layouts["L2ToL1MessagePasser"] = L2ToL1MessagePasserStorageLayout + deployedBytecodes["L2ToL1MessagePasser"] = L2ToL1MessagePasserDeployedBin +} diff --git a/op-bindings/bindings/legacyerc20eth_more.go b/op-bindings/bindings/legacyerc20eth_more.go new file mode 100755 index 0000000000000..aac08a3b8a178 --- /dev/null +++ b/op-bindings/bindings/legacyerc20eth_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const LegacyERC20ETHStorageLayoutJSON = "{\"storage\":[{\"astId\":26811,\"contract\":\"contracts/legacy/LegacyERC20ETH.sol:LegacyERC20ETH\",\"label\":\"_balances\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":26817,\"contract\":\"contracts/legacy/LegacyERC20ETH.sol:LegacyERC20ETH\",\"label\":\"_allowances\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":26819,\"contract\":\"contracts/legacy/LegacyERC20ETH.sol:LegacyERC20ETH\",\"label\":\"_totalSupply\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":26821,\"contract\":\"contracts/legacy/LegacyERC20ETH.sol:LegacyERC20ETH\",\"label\":\"_name\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_string_storage\"},{\"astId\":26823,\"contract\":\"contracts/legacy/LegacyERC20ETH.sol:LegacyERC20ETH\",\"label\":\"_symbol\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_string_storage\"},{\"astId\":24078,\"contract\":\"contracts/legacy/LegacyERC20ETH.sol:LegacyERC20ETH\",\"label\":\"remoteToken\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_address\"},{\"astId\":24081,\"contract\":\"contracts/legacy/LegacyERC20ETH.sol:LegacyERC20ETH\",\"label\":\"bridge\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" + +var LegacyERC20ETHStorageLayout = new(solc.StorageLayout) + +var LegacyERC20ETHDeployedBin = "0x608060405234801561001057600080fd5b50600436106101365760003560e01c806395d89b41116100b2578063ae1f6aaf11610081578063d6c0b2c411610066578063d6c0b2c4146102bb578063dd62ed3e146102db578063e78cea921461032157600080fd5b8063ae1f6aaf1461025e578063c01e1bd61461029d57600080fd5b806395d89b411461021d5780639dc29fac14610225578063a457c2d714610238578063a9059cbb1461024b57600080fd5b806323b872dd1161010957806339509351116100ee57806339509351146101bf57806340c10f19146101d257806370a08231146101e757600080fd5b806323b872dd1461019d578063313ce567146101b057600080fd5b806301ffc9a71461013b57806306fdde0314610163578063095ea7b31461017857806318160ddd1461018b575b600080fd5b61014e610149366004610852565b610341565b60405190151581526020015b60405180910390f35b61016b610432565b60405161015a919061089b565b61014e610186366004610937565b6104c4565b6002545b60405190815260200161015a565b61014e6101ab366004610961565b610554565b6040516012815260200161015a565b61014e6101cd366004610937565b6105df565b6101e56101e0366004610937565b61066a565b005b61018f6101f536600461099d565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61016b6106cc565b6101e5610233366004610937565b6106db565b61014e610246366004610937565b61073d565b61014e610259366004610937565b6107c8565b60065473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015a565b60055473ffffffffffffffffffffffffffffffffffffffff16610278565b6005546102789073ffffffffffffffffffffffffffffffffffffffff1681565b61018f6102e93660046109b8565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6006546102789073ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007f0bc32271000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806103fa57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061042957507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b606060038054610441906109eb565b80601f016020809104026020016040519081016040528092919081815260200182805461046d906109eb565b80156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b5050505050905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4c656761637945524332304554483a20617070726f766520697320646973616260448201527f6c6564000000000000000000000000000000000000000000000000000000000060648201526000906084015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4c656761637945524332304554483a207472616e7366657246726f6d2069732060448201527f64697361626c6564000000000000000000000000000000000000000000000000606482015260009060840161054b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4c656761637945524332304554483a20696e637265617365416c6c6f77616e6360448201527f652069732064697361626c656400000000000000000000000000000000000000606482015260009060840161054b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c656761637945524332304554483a206d696e742069732064697361626c6564604482015260640161054b565b606060048054610441906109eb565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4c656761637945524332304554483a206275726e2069732064697361626c6564604482015260640161054b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4c656761637945524332304554483a206465637265617365416c6c6f77616e6360448201527f652069732064697361626c656400000000000000000000000000000000000000606482015260009060840161054b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4c656761637945524332304554483a207472616e73666572206973206469736160448201527f626c656400000000000000000000000000000000000000000000000000000000606482015260009060840161054b565b60006020828403121561086457600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461089457600080fd5b9392505050565b600060208083528351808285015260005b818110156108c8578581018301518582016040015282016108ac565b818111156108da576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461093257600080fd5b919050565b6000806040838503121561094a57600080fd5b6109538361090e565b946020939093013593505050565b60008060006060848603121561097657600080fd5b61097f8461090e565b925061098d6020850161090e565b9150604084013590509250925092565b6000602082840312156109af57600080fd5b6108948261090e565b600080604083850312156109cb57600080fd5b6109d48361090e565b91506109e26020840161090e565b90509250929050565b600181811c908216806109ff57607f821691505b602082108103610a38577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b5091905056fea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(LegacyERC20ETHStorageLayoutJSON), LegacyERC20ETHStorageLayout); err != nil { + panic(err) + } + + layouts["LegacyERC20ETH"] = LegacyERC20ETHStorageLayout + deployedBytecodes["LegacyERC20ETH"] = LegacyERC20ETHDeployedBin +} diff --git a/op-bindings/bindings/optimismmintableerc20factory_more.go b/op-bindings/bindings/optimismmintableerc20factory_more.go new file mode 100755 index 0000000000000..ce2409575302d --- /dev/null +++ b/op-bindings/bindings/optimismmintableerc20factory_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const OptimismMintableERC20FactoryStorageLayoutJSON = "{\"storage\":null,\"types\":null}" + +var OptimismMintableERC20FactoryStorageLayout = new(solc.StorageLayout) + +var OptimismMintableERC20FactoryDeployedBin = "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063896f93d114610046578063ce5ac90f14610082578063e78cea9214610095575b600080fd5b610059610054366004610371565b6100bc565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b610059610090366004610371565b6100d1565b6100597f000000000000000000000000000000000000000000000000000000000000000081565b60006100c98484846100d1565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff841661017a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d4d696e7461626c654552433230466163746f72793a206d7560448201527f73742070726f766964652072656d6f746520746f6b656e206164647265737300606482015260840160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008585856040516101ac9061028a565b6101b9949392919061046b565b604051809103906000f0801580156101d5573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fceeb8e7d520d7f3b65fc11a262b91066940193b05d4f93df07cfdced0eb551cf60405160405180910390a360405133815273ffffffffffffffffffffffffffffffffffffffff80831691908716907f52fe89dd5930f343d25650b62fd367bae47088bcddffd2a88350a6ecdd620cdb9060200160405180910390a3949350505050565b61164b806104c283390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126102d757600080fd5b813567ffffffffffffffff808211156102f2576102f2610297565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561033857610338610297565b8160405283815286602085880101111561035157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561038657600080fd5b833573ffffffffffffffffffffffffffffffffffffffff811681146103aa57600080fd5b9250602084013567ffffffffffffffff808211156103c757600080fd5b6103d3878388016102c6565b935060408601359150808211156103e957600080fd5b506103f6868287016102c6565b9150509250925092565b6000815180845260005b818110156104265760208185018101518683018201520161040a565b81811115610438576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250608060408301526104a46080830185610400565b82810360608401526104b68185610400565b97965050505050505056fe60806040523480156200001157600080fd5b506040516200164b3803806200164b833981016040819052620000349162000179565b8181600362000044838262000298565b50600462000053828262000298565b5050600580546001600160a01b039586166001600160a01b03199182161790915560068054969095169516949094179092555062000364915050565b80516001600160a01b0381168114620000a757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000d457600080fd5b81516001600160401b0380821115620000f157620000f1620000ac565b604051601f8301601f19908116603f011681019082821181831017156200011c576200011c620000ac565b816040528381526020925086838588010111156200013957600080fd5b600091505b838210156200015d57858201830151818301840152908201906200013e565b838211156200016f5760008385830101525b9695505050505050565b600080600080608085870312156200019057600080fd5b6200019b856200008f565b9350620001ab602086016200008f565b60408601519093506001600160401b0380821115620001c957600080fd5b620001d788838901620000c2565b93506060870151915080821115620001ee57600080fd5b50620001fd87828801620000c2565b91505092959194509250565b600181811c908216806200021e57607f821691505b6020821081036200023f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029357600081815260208120601f850160051c810160208610156200026e5750805b601f850160051c820191505b818110156200028f578281556001016200027a565b5050505b505050565b81516001600160401b03811115620002b457620002b4620000ac565b620002cc81620002c5845462000209565b8462000245565b602080601f831160018114620003045760008415620002eb5750858301515b600019600386901b1c1916600185901b1785556200028f565b600085815260208120601f198616915b82811015620003355788860151825594840194600190910190840162000314565b5085821015620003545787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6112d780620003746000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806395d89b41116100b2578063ae1f6aaf11610081578063d6c0b2c411610066578063d6c0b2c4146102bb578063dd62ed3e146102db578063e78cea921461032157600080fd5b8063ae1f6aaf1461025e578063c01e1bd61461029d57600080fd5b806395d89b411461021d5780639dc29fac14610225578063a457c2d714610238578063a9059cbb1461024b57600080fd5b806323b872dd1161010957806339509351116100ee57806339509351146101bf57806340c10f19146101d257806370a08231146101e757600080fd5b806323b872dd1461019d578063313ce567146101b057600080fd5b806301ffc9a71461013b57806306fdde0314610163578063095ea7b31461017857806318160ddd1461018b575b600080fd5b61014e610149366004611080565b610341565b60405190151581526020015b60405180910390f35b61016b610432565b60405161015a91906110c9565b61014e610186366004611165565b6104c4565b6002545b60405190815260200161015a565b61014e6101ab36600461118f565b6104dc565b6040516012815260200161015a565b61014e6101cd366004611165565b610500565b6101e56101e0366004611165565b61054c565b005b61018f6101f53660046111cb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61016b610656565b6101e5610233366004611165565b610665565b61014e610246366004611165565b61075e565b61014e610259366004611165565b61082f565b60065473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161015a565b60055473ffffffffffffffffffffffffffffffffffffffff16610278565b6005546102789073ffffffffffffffffffffffffffffffffffffffff1681565b61018f6102e93660046111e6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6006546102789073ffffffffffffffffffffffffffffffffffffffff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f1d1d8b63000000000000000000000000000000000000000000000000000000007f0bc32271000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000085168314806103fa57507fffffffff00000000000000000000000000000000000000000000000000000000858116908316145b8061042957507fffffffff00000000000000000000000000000000000000000000000000000000858116908216145b95945050505050565b60606003805461044190611219565b80601f016020809104026020016040519081016040528092919081815260200182805461046d90611219565b80156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b5050505050905090565b6000336104d281858561083d565b5060019392505050565b6000336104ea8582856109f1565b6104f5858585610ac8565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d2908290869061054790879061129b565b61083d565b60065473ffffffffffffffffffffffffffffffffffffffff1633146105f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084015b60405180910390fd5b6106028282610d7b565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161064a91815260200190565b60405180910390a25050565b60606004805461044190611219565b60065473ffffffffffffffffffffffffffffffffffffffff16331461070c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4f7074696d69736d4d696e7461626c6545524332303a206f6e6c79206272696460448201527f67652063616e206d696e7420616e64206275726e00000000000000000000000060648201526084016105ef565b6107168282610e9b565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161064a91815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105ef565b6104f5828686840361083d565b6000336104d2818585610ac8565b73ffffffffffffffffffffffffffffffffffffffff83166108df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105ef565b73ffffffffffffffffffffffffffffffffffffffff8216610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105ef565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ac25781811015610ab5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105ef565b610ac2848484840361083d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105ef565b73ffffffffffffffffffffffffffffffffffffffff8216610c0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105ef565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105ef565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610d0890849061129b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d6e91815260200190565b60405180910390a3610ac2565b73ffffffffffffffffffffffffffffffffffffffff8216610df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105ef565b8060026000828254610e0a919061129b565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604081208054839290610e4490849061129b565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610f3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105ef565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610ff4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105ef565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906110309084906112b3565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016109e4565b60006020828403121561109257600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146110c257600080fd5b9392505050565b600060208083528351808285015260005b818110156110f6578581018301518582016040015282016110da565b81811115611108576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461116057600080fd5b919050565b6000806040838503121561117857600080fd5b6111818361113c565b946020939093013593505050565b6000806000606084860312156111a457600080fd5b6111ad8461113c565b92506111bb6020850161113c565b9150604084013590509250925092565b6000602082840312156111dd57600080fd5b6110c28261113c565b600080604083850312156111f957600080fd5b6112028361113c565b91506112106020840161113c565b90509250929050565b600181811c9082168061122d57607f821691505b602082108103611266577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156112ae576112ae61126c565b500190565b6000828210156112c5576112c561126c565b50039056fea164736f6c634300080f000aa164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(OptimismMintableERC20FactoryStorageLayoutJSON), OptimismMintableERC20FactoryStorageLayout); err != nil { + panic(err) + } + + layouts["OptimismMintableERC20Factory"] = OptimismMintableERC20FactoryStorageLayout + deployedBytecodes["OptimismMintableERC20Factory"] = OptimismMintableERC20FactoryDeployedBin +} diff --git a/op-bindings/bindings/optimismportal_deployed.go b/op-bindings/bindings/optimismportal_more.go old mode 100644 new mode 100755 similarity index 91% rename from op-bindings/bindings/optimismportal_deployed.go rename to op-bindings/bindings/optimismportal_more.go index e66640ec10dfb..bcda4761d407b --- a/op-bindings/bindings/optimismportal_deployed.go +++ b/op-bindings/bindings/optimismportal_more.go @@ -1,5 +1,25 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. + package bindings +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const OptimismPortalStorageLayoutJSON = "{\"storage\":[{\"astId\":26067,\"contract\":\"contracts/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":26070,\"contract\":\"contracts/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1388,\"contract\":\"contracts/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"params\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_struct(ResourceParams)1358_storage\"},{\"astId\":1393,\"contract\":\"contracts/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":961,\"contract\":\"contracts/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"l2Sender\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":974,\"contract\":\"contracts/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"finalizedWithdrawals\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":979,\"contract\":\"contracts/L1/OptimismPortal.sol:OptimismPortal\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"53\",\"type\":\"t_array(t_uint256)48_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)48_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[48]\",\"numberOfBytes\":\"1536\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_struct(ResourceParams)1358_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ResourceMetering.ResourceParams\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" + +var OptimismPortalStorageLayout = new(solc.StorageLayout) + var OptimismPortalDeployedBin = "0x6080604052600436106100f65760003560e01c8063a14238e71161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063f4daa291146103ab578063fdc9fe1d146103df57600080fd5b8063a14238e71461026d578063c4fc4798146102ad578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780638129fc1c14610215578063867ead131461022a5780639bf62d821461024057600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b60405161017791906132fa565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b5061011b610962565b34801561023657600080fd5b506101f261271081565b34801561024c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027957600080fd5b5061029d61028836600461330d565b60346020526000908152604090205460ff1681565b6040519015158152602001610177565b3480156102b957600080fd5b5061029d6102c836600461330d565b610b20565b3480156102d957600080fd5b506101f2610be5565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a6366004613452565b6103f2565b3480156103b757600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b61011b6103ed366004613540565b610bf6565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e5959493929190613634565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161055591906132fa565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436136c8565b9050801561071e5760006105ad6004627a120061370e565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff16613776565b9050600060086105ec6004627a120061370e565b60015461060c9085906fffffffffffffffffffffffffffffffff166137ea565b610616919061370e565b610620919061370e565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff166138a6565b612710611297565b6fffffffffffffffffffffffffffffffff6112b2565b905060018411156106df576106dc610656670de0b6b3a76400006106c861069460088361370e565b6106a690670de0b6b3a7640000613776565b6106b160018a6136c8565b6106c390670de0b6b3a764000061391a565b6112c1565b6106d290856137ea565b61064e919061370e565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff16613957565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616613983565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca006112f2565b61088790836139bb565b905060005a61089690866136c8565b9050808211156108b2576108b26108ad82846136c8565b611302565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611330565b6109137f0000000000000000000000000000000000000000000000000000000000000000611330565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611330565b60405160200161094e939291906139cf565b604051602081830303815290604052905090565b600054610100900460ff16158080156109825750600054600160ff909116105b8061099c5750303b15801561099c575060005460ff166001145b610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610a8657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610aba61146d565b8015610b1d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd39190613a45565b9050610bde81611550565b9392505050565b610bf36004627a120061370e565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610c9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610d5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610deb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0f9190613a45565b9050610e1a81611550565b610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b610ebd610eb836869003860186613a94565b61158a565b815114610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b6000610f57876115e6565b9050610f9e81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161692505050565b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff16156110c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055608087015161111290614e2090613afa565b5a10156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b8660200151603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000611204886040015189608001518a606001518b60a001516116dd565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061126990841515815260200190565b60405180910390a25050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156112a757816112a9565b825b90505b92915050565b60008183126112a757816112a9565b60006112a9670de0b6b3a7640000836112d9866116f7565b6112e391906137ea565b6112ed919061370e565b61193b565b6000818310156112a757816112a9565b6000805a90505b825a61131590836136c8565b101561132b5761132482613b12565b9150611309565b505050565b60608160000361137357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561139d578061138781613b12565b91506113969050600a836139bb565b9150611377565b60008167ffffffffffffffff8111156113b8576113b861334f565b6040519080825280601f01601f1916602001820160405280156113e2576020820181803683370190505b5090505b8415611465576113f76001836136c8565b9150611404600a86613b4a565b61140f906030613afa565b60f81b81838151811061142457611424613b5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061145e600a866139bb565b94506113e6565b949350505050565b600054610100900460ff16611504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60007f000000000000000000000000000000000000000000000000000000000000000082602001516115829190613afa565b421192915050565b600081600001518260200151836040015184606001516040516020016115c9949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a088015193516000976115c9979096959101613b8d565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506116d49101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611b7a565b95945050505050565b600080600080845160208601878a8af19695505050505050565b6000808213611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b6000606061176f84611b9e565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361196c57506000919050565b680755bf798b4a1bf1e582126119de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611b8686611c74565b9050611b9481868686611ca6565b9695505050505050565b6000808211611c09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611c9091815260200190565b6040516020818303038152906040529050919050565b6000806000611cb6878686611ce3565b91509150818015611cd857508051602080830191909120875191880191909120145b979650505050505050565b600060606000611cf285611dfe565b90506000806000611d04848a89611ef9565b81519295509093509150158080611d185750815b611da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b600081611dc05760405180602001604052806000815250611dec565b611dec86611dcf6001886136c8565b81518110611ddf57611ddf613b5e565b6020026020010151612482565b919b919a509098505050505050505050565b60606000611e0b836124ac565b90506000815167ffffffffffffffff811115611e2957611e2961334f565b604051908082528060200260200182016040528015611e6e57816020015b6040805180820190915260608082526020820152815260200190600190039081611e475790505b50905060005b8251811015611ef1576000611ea1848381518110611e9457611e94613b5e565b60200260200101516124df565b90506040518060400160405280828152602001611ebd836124ac565b815250838381518110611ed257611ed2613b5e565b6020026020010181905250508080611ee990613b12565b915050611e74565b509392505050565b60006060818080611f09876125a6565b90506000869050600080611f30604051806040016040528060608152602001606081525090565b60005b8c5181101561243e578c8181518110611f4e57611f4e613b5e565b602002602001015191508284611f649190613afa565b9350611f71600188613afa565b965083600003611ff257815180516020909101208514611fed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b61212e565b81515160201161209457815180516020909101208514611fed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b815185906120a190613be4565b1461212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b61213a60106001613afa565b826020015151036121ac578551841461243e57600086858151811061216157612161613b5e565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061218c5761218c613b5e565b6020026020010151905061219f81612729565b965060019450505061242c565b6002826020015151036123a45760006121c48361275f565b90506000816000815181106121db576121db613b5e565b016020015160f81c905060006121f2600283613c26565b6121fd906002613c48565b9050600061220e848360ff16612783565b9050600061221c8b8a612783565b9050600061222a83836127b9565b905060ff851660021480612241575060ff85166003145b15612297578083511480156122565750808251145b1561226857612265818b613afa565b99505b507f8000000000000000000000000000000000000000000000000000000000000000995061243e945050505050565b60ff851615806122aa575060ff85166001145b1561231c57825181146122e657507f8000000000000000000000000000000000000000000000000000000000000000995061243e945050505050565b61230d886020015160018151811061230057612300613b5e565b6020026020010151612729565b9a50975061242c945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b8061243681613b12565b915050611f33565b507f800000000000000000000000000000000000000000000000000000000000000084148661246d8786612783565b909e909d50909b509950505050505050505050565b602081015180516060916112ac9161249c906001906136c8565b81518110611e9457611e94613b5e565b6040805180820182526000808252602091820152815180830190925282518252808301908201526060906112ac90612865565b606060008060006124ef85612abe565b91945092509050600081600181111561250a5761250a613c6b565b14612597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6116d485602001518484612fa9565b60606000825160026125b8919061391a565b67ffffffffffffffff8111156125d0576125d061334f565b6040519080825280601f01601f1916602001820160405280156125fa576020820181803683370190505b50905060005b835181101561272257600484828151811061261d5761261d613b5e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261265283600261391a565b8151811061266257612662613b5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106126a5576126a5613b5e565b01602001516126b7919060f81c613c26565b60f81b826126c683600261391a565b6126d1906001613afa565b815181106126e1576126e1613b5e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061271a81613b12565b915050612600565b5092915050565b6000606060208360000151101561274a5761274383613087565b9050612756565b612753836124df565b90505b610bde81613be4565b60606112ac61277e8360200151600081518110611e9457611e94613b5e565b6125a6565b6060825182106127a257506040805160208101909152600081526112ac565b6112a983838486516127b491906136c8565b613092565b6000805b8084511180156127cd5750808351115b801561284e57508281815181106127e6576127e6613b5e565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061282557612825613b5e565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156112a9578061285d81613b12565b9150506127bd565b606060008061287384612abe565b9193509091506001905081600181111561288f5761288f613c6b565b1461291c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129355790505090506000835b8651811015612ab357602082106129fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612a386040518060400160405280858c60000151612a1c91906136c8565b8152602001858c60200151612a319190613afa565b9052612abe565b509150915060405180604001604052808383612a549190613afa565b8152602001848b60200151612a699190613afa565b815250858581518110612a7e57612a7e613b5e565b6020908102919091010152612a94600185613afa565b9350612aa08183613afa565b612aaa9084613afa565b92505050612962565b508152949350505050565b600080600080846000015111612b56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612b7b576000600160009450945094505050612fa2565b60b78111612c37576000612b906080836136c8565b905080876000015111612c25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250612fa2915050565b60bf8111612da6576000612c4c60b7836136c8565b905080876000015111612ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612cfb8183613afa565b885111612d8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b612d95826001613afa565b9650945060009350612fa292505050565b60f78111612e61576000612dbb60c0836136c8565b905080876000015111612e50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250612fa2915050565b6000612e6e60f7836136c8565b905080876000015111612f03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612f1d8183613afa565b885111612f86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b612f91826001613afa565b9650945060019350612fa292505050565b9193909250565b606060008267ffffffffffffffff811115612fc657612fc661334f565b6040519080825280601f01601f191660200182016040528015612ff0576020820181803683370190505b5090508051600003613003579050610bde565b600061300f8587613afa565b90506020820160005b6130236020876139bb565b81101561305a5782518252613039602084613afa565b9250613046602083613afa565b91508061305281613b12565b915050613018565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b60606112ac8261326a565b60608182601f011015613101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b82828401101561316d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b818301845110156131da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b6060821580156131f95760405191506000825260208201604052613261565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561323257805183526020928301920161321a565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60606112ac826020015160008460000151612fa9565b60005b8381101561329b578181015183820152602001613283565b838111156132aa576000848401525b50505050565b600081518084526132c8816020860160208601613280565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006112a960208301846132b0565b60006020828403121561331f57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461334a57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156133a1576133a161334f565b60405290565b600082601f8301126133b857600080fd5b813567ffffffffffffffff808211156133d3576133d361334f565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156134195761341961334f565b8160405283815286602085880101111561343257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561346a57600080fd5b61347386613326565b945060208601359350604086013567ffffffffffffffff808216821461349857600080fd5b90935060608701359081151582146134af57600080fd5b909250608087013590808211156134c557600080fd5b506134d2888289016133a7565b9150509295509295909350565b6000608082840312156134f157600080fd5b50919050565b60008083601f84011261350957600080fd5b50813567ffffffffffffffff81111561352157600080fd5b60208301915083602082850101111561353957600080fd5b9250929050565b600080600080600060e0868803121561355857600080fd5b853567ffffffffffffffff8082111561357057600080fd5b9087019060c0828a03121561358457600080fd5b61358c61337e565b8235815261359c60208401613326565b60208201526135ad60408401613326565b6040820152606083013560608201526080830135608082015260a0830135828111156135d857600080fd5b6135e48b8286016133a7565b60a0830152509650602088013595506136008960408a016134df565b945060c088013591508082111561361657600080fd5b50613623888289016134f7565b969995985093965092949392505050565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251613688816049850160208701613280565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156136da576136da613699565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261371d5761371d6136df565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561377157613771613699565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156137b0576137b0613699565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156137e4576137e4613699565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561382b5761382b613699565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561386657613866613699565b6000871292508782058712848416161561388257613882613699565b8785058712818416161561389857613898613699565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156138e0576138e0613699565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561391457613914613699565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561395257613952613699565b500290565b600067ffffffffffffffff80831681851680830382111561397a5761397a613699565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156139b2576139b2613699565b02949350505050565b6000826139ca576139ca6136df565b500490565b600084516139e1818460208901613280565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613a1d816001850160208a01613280565b60019201918201528351613a38816002840160208801613280565b0160020195945050505050565b600060408284031215613a5757600080fd5b6040516040810181811067ffffffffffffffff82111715613a7a57613a7a61334f565b604052825181526020928301519281019290925250919050565b600060808284031215613aa657600080fd5b6040516080810181811067ffffffffffffffff82111715613ac957613ac961334f565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60008219821115613b0d57613b0d613699565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b4357613b43613699565b5060010190565b600082613b5957613b596136df565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613bd860c08301846132b0565b98975050505050505050565b805160208083015191908110156134f1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b600060ff831680613c3957613c396136df565b8060ff84160691505092915050565b600060ff821660ff841680821015613c6257613c62613699565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(OptimismPortalStorageLayoutJSON), OptimismPortalStorageLayout); err != nil { + panic(err) + } + + layouts["OptimismPortal"] = OptimismPortalStorageLayout + deployedBytecodes["OptimismPortal"] = OptimismPortalDeployedBin +} diff --git a/op-bindings/bindings/proxy.go b/op-bindings/bindings/proxy.go new file mode 100644 index 0000000000000..f5979284702f9 --- /dev/null +++ b/op-bindings/bindings/proxy.go @@ -0,0 +1,628 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// ProxyMetaData contains all meta data concerning the Proxy contract. +var ProxyMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x608060405234801561001057600080fd5b5060405161091838038061091883398101604081905261002f916100b2565b6100388161003e565b506100e2565b60006100566000805160206108f88339815191525490565b6000805160206108f8833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b610807806100f16000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", +} + +// ProxyABI is the input ABI used to generate the binding from. +// Deprecated: Use ProxyMetaData.ABI instead. +var ProxyABI = ProxyMetaData.ABI + +// ProxyBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ProxyMetaData.Bin instead. +var ProxyBin = ProxyMetaData.Bin + +// DeployProxy deploys a new Ethereum contract, binding an instance of Proxy to it. +func DeployProxy(auth *bind.TransactOpts, backend bind.ContractBackend, _admin common.Address) (common.Address, *types.Transaction, *Proxy, error) { + parsed, err := ProxyMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ProxyBin), backend, _admin) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Proxy{ProxyCaller: ProxyCaller{contract: contract}, ProxyTransactor: ProxyTransactor{contract: contract}, ProxyFilterer: ProxyFilterer{contract: contract}}, nil +} + +// Proxy is an auto generated Go binding around an Ethereum contract. +type Proxy struct { + ProxyCaller // Read-only binding to the contract + ProxyTransactor // Write-only binding to the contract + ProxyFilterer // Log filterer for contract events +} + +// ProxyCaller is an auto generated read-only Go binding around an Ethereum contract. +type ProxyCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ProxyTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ProxyFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ProxySession struct { + Contract *Proxy // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProxyCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ProxyCallerSession struct { + Contract *ProxyCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ProxyTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ProxyTransactorSession struct { + Contract *ProxyTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProxyRaw is an auto generated low-level Go binding around an Ethereum contract. +type ProxyRaw struct { + Contract *Proxy // Generic contract binding to access the raw methods on +} + +// ProxyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ProxyCallerRaw struct { + Contract *ProxyCaller // Generic read-only contract binding to access the raw methods on +} + +// ProxyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ProxyTransactorRaw struct { + Contract *ProxyTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewProxy creates a new instance of Proxy, bound to a specific deployed contract. +func NewProxy(address common.Address, backend bind.ContractBackend) (*Proxy, error) { + contract, err := bindProxy(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Proxy{ProxyCaller: ProxyCaller{contract: contract}, ProxyTransactor: ProxyTransactor{contract: contract}, ProxyFilterer: ProxyFilterer{contract: contract}}, nil +} + +// NewProxyCaller creates a new read-only instance of Proxy, bound to a specific deployed contract. +func NewProxyCaller(address common.Address, caller bind.ContractCaller) (*ProxyCaller, error) { + contract, err := bindProxy(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ProxyCaller{contract: contract}, nil +} + +// NewProxyTransactor creates a new write-only instance of Proxy, bound to a specific deployed contract. +func NewProxyTransactor(address common.Address, transactor bind.ContractTransactor) (*ProxyTransactor, error) { + contract, err := bindProxy(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ProxyTransactor{contract: contract}, nil +} + +// NewProxyFilterer creates a new log filterer instance of Proxy, bound to a specific deployed contract. +func NewProxyFilterer(address common.Address, filterer bind.ContractFilterer) (*ProxyFilterer, error) { + contract, err := bindProxy(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ProxyFilterer{contract: contract}, nil +} + +// bindProxy binds a generic wrapper to an already deployed contract. +func bindProxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(ProxyABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Proxy *ProxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Proxy.Contract.ProxyCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Proxy *ProxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proxy.Contract.ProxyTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Proxy *ProxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Proxy.Contract.ProxyTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Proxy *ProxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Proxy.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Proxy *ProxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proxy.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Proxy *ProxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Proxy.Contract.contract.Transact(opts, method, params...) +} + +// Admin is a paid mutator transaction binding the contract method 0xf851a440. +// +// Solidity: function admin() returns(address) +func (_Proxy *ProxyTransactor) Admin(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proxy.contract.Transact(opts, "admin") +} + +// Admin is a paid mutator transaction binding the contract method 0xf851a440. +// +// Solidity: function admin() returns(address) +func (_Proxy *ProxySession) Admin() (*types.Transaction, error) { + return _Proxy.Contract.Admin(&_Proxy.TransactOpts) +} + +// Admin is a paid mutator transaction binding the contract method 0xf851a440. +// +// Solidity: function admin() returns(address) +func (_Proxy *ProxyTransactorSession) Admin() (*types.Transaction, error) { + return _Proxy.Contract.Admin(&_Proxy.TransactOpts) +} + +// ChangeAdmin is a paid mutator transaction binding the contract method 0x8f283970. +// +// Solidity: function changeAdmin(address _admin) returns() +func (_Proxy *ProxyTransactor) ChangeAdmin(opts *bind.TransactOpts, _admin common.Address) (*types.Transaction, error) { + return _Proxy.contract.Transact(opts, "changeAdmin", _admin) +} + +// ChangeAdmin is a paid mutator transaction binding the contract method 0x8f283970. +// +// Solidity: function changeAdmin(address _admin) returns() +func (_Proxy *ProxySession) ChangeAdmin(_admin common.Address) (*types.Transaction, error) { + return _Proxy.Contract.ChangeAdmin(&_Proxy.TransactOpts, _admin) +} + +// ChangeAdmin is a paid mutator transaction binding the contract method 0x8f283970. +// +// Solidity: function changeAdmin(address _admin) returns() +func (_Proxy *ProxyTransactorSession) ChangeAdmin(_admin common.Address) (*types.Transaction, error) { + return _Proxy.Contract.ChangeAdmin(&_Proxy.TransactOpts, _admin) +} + +// Implementation is a paid mutator transaction binding the contract method 0x5c60da1b. +// +// Solidity: function implementation() returns(address) +func (_Proxy *ProxyTransactor) Implementation(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proxy.contract.Transact(opts, "implementation") +} + +// Implementation is a paid mutator transaction binding the contract method 0x5c60da1b. +// +// Solidity: function implementation() returns(address) +func (_Proxy *ProxySession) Implementation() (*types.Transaction, error) { + return _Proxy.Contract.Implementation(&_Proxy.TransactOpts) +} + +// Implementation is a paid mutator transaction binding the contract method 0x5c60da1b. +// +// Solidity: function implementation() returns(address) +func (_Proxy *ProxyTransactorSession) Implementation() (*types.Transaction, error) { + return _Proxy.Contract.Implementation(&_Proxy.TransactOpts) +} + +// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. +// +// Solidity: function upgradeTo(address _implementation) returns() +func (_Proxy *ProxyTransactor) UpgradeTo(opts *bind.TransactOpts, _implementation common.Address) (*types.Transaction, error) { + return _Proxy.contract.Transact(opts, "upgradeTo", _implementation) +} + +// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. +// +// Solidity: function upgradeTo(address _implementation) returns() +func (_Proxy *ProxySession) UpgradeTo(_implementation common.Address) (*types.Transaction, error) { + return _Proxy.Contract.UpgradeTo(&_Proxy.TransactOpts, _implementation) +} + +// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. +// +// Solidity: function upgradeTo(address _implementation) returns() +func (_Proxy *ProxyTransactorSession) UpgradeTo(_implementation common.Address) (*types.Transaction, error) { + return _Proxy.Contract.UpgradeTo(&_Proxy.TransactOpts, _implementation) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address _implementation, bytes _data) payable returns(bytes) +func (_Proxy *ProxyTransactor) UpgradeToAndCall(opts *bind.TransactOpts, _implementation common.Address, _data []byte) (*types.Transaction, error) { + return _Proxy.contract.Transact(opts, "upgradeToAndCall", _implementation, _data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address _implementation, bytes _data) payable returns(bytes) +func (_Proxy *ProxySession) UpgradeToAndCall(_implementation common.Address, _data []byte) (*types.Transaction, error) { + return _Proxy.Contract.UpgradeToAndCall(&_Proxy.TransactOpts, _implementation, _data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address _implementation, bytes _data) payable returns(bytes) +func (_Proxy *ProxyTransactorSession) UpgradeToAndCall(_implementation common.Address, _data []byte) (*types.Transaction, error) { + return _Proxy.Contract.UpgradeToAndCall(&_Proxy.TransactOpts, _implementation, _data) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Proxy *ProxyTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _Proxy.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Proxy *ProxySession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Proxy.Contract.Fallback(&_Proxy.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Proxy *ProxyTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Proxy.Contract.Fallback(&_Proxy.TransactOpts, calldata) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Proxy *ProxyTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Proxy.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Proxy *ProxySession) Receive() (*types.Transaction, error) { + return _Proxy.Contract.Receive(&_Proxy.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Proxy *ProxyTransactorSession) Receive() (*types.Transaction, error) { + return _Proxy.Contract.Receive(&_Proxy.TransactOpts) +} + +// ProxyAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the Proxy contract. +type ProxyAdminChangedIterator struct { + Event *ProxyAdminChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ProxyAdminChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ProxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ProxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ProxyAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProxyAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProxyAdminChanged represents a AdminChanged event raised by the Proxy contract. +type ProxyAdminChanged struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Proxy *ProxyFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*ProxyAdminChangedIterator, error) { + + logs, sub, err := _Proxy.contract.FilterLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return &ProxyAdminChangedIterator{contract: _Proxy.contract, event: "AdminChanged", logs: logs, sub: sub}, nil +} + +// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Proxy *ProxyFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *ProxyAdminChanged) (event.Subscription, error) { + + logs, sub, err := _Proxy.contract.WatchLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ProxyAdminChanged) + if err := _Proxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Proxy *ProxyFilterer) ParseAdminChanged(log types.Log) (*ProxyAdminChanged, error) { + event := new(ProxyAdminChanged) + if err := _Proxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ProxyUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the Proxy contract. +type ProxyUpgradedIterator struct { + Event *ProxyUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ProxyUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ProxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ProxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ProxyUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProxyUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProxyUpgraded represents a Upgraded event raised by the Proxy contract. +type ProxyUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Proxy *ProxyFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*ProxyUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Proxy.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &ProxyUpgradedIterator{contract: _Proxy.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Proxy *ProxyFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *ProxyUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Proxy.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ProxyUpgraded) + if err := _Proxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Proxy *ProxyFilterer) ParseUpgraded(log types.Log) (*ProxyUpgraded, error) { + event := new(ProxyUpgraded) + if err := _Proxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-bindings/bindings/proxy_more.go b/op-bindings/bindings/proxy_more.go new file mode 100755 index 0000000000000..3d13b90d28d35 --- /dev/null +++ b/op-bindings/bindings/proxy_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const ProxyStorageLayoutJSON = "{\"storage\":null,\"types\":null}" + +var ProxyStorageLayout = new(solc.StorageLayout) + +var ProxyDeployedBin = "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(ProxyStorageLayoutJSON), ProxyStorageLayout); err != nil { + panic(err) + } + + layouts["Proxy"] = ProxyStorageLayout + deployedBytecodes["Proxy"] = ProxyDeployedBin +} diff --git a/op-bindings/bindings/proxyadmin.go b/op-bindings/bindings/proxyadmin.go new file mode 100644 index 0000000000000..964894508e392 --- /dev/null +++ b/op-bindings/bindings/proxyadmin.go @@ -0,0 +1,761 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// ProxyAdminMetaData contains all meta data concerning the ProxyAdmin contract. +var ProxyAdminMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"contractAddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"}],\"name\":\"getProxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_proxy\",\"type\":\"address\"}],\"name\":\"getProxyImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"implementationName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proxyType\",\"outputs\":[{\"internalType\":\"enumProxyAdmin.ProxyType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractAddressManager\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddressManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setImplementationName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"enumProxyAdmin.ProxyType\",\"name\":\"_type\",\"type\":\"uint8\"}],\"name\":\"setProxyType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_upgrading\",\"type\":\"bool\"}],\"name\":\"setUpgrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", + Bin: "0x60806040526003805460ff60a01b1916905534801561001d57600080fd5b50604051611cdc380380611cdc83398101604081905261003c9161008b565b600080546001600160a01b0319166001600160a01b03831690811782556040518392907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350506100bb565b60006020828403121561009d57600080fd5b81516001600160a01b03811681146100b457600080fd5b9392505050565b611c12806100ca6000396000f3fe6080604052600436106100f35760003560e01c8063860f7cda1161008a57806399a88ec41161005957806399a88ec4146102db5780639b2ea4bd146102fb578063b79472621461031b578063f3b7dead1461035657600080fd5b8063860f7cda1461025b5780638d52d4a01461027b5780638da5cb5b1461029b5780639623609d146102c857600080fd5b8063238181ae116100c6578063238181ae146101a45780633ab76e9f146101d15780636bd9f516146101fe5780637eff275e1461023b57600080fd5b80630652b57a146100f857806307c8f7b01461011a57806313af40351461013a578063204e1c7a1461015a575b600080fd5b34801561010457600080fd5b506101186101133660046114be565b610376565b005b34801561012657600080fd5b506101186101353660046114db565b610443565b34801561014657600080fd5b506101186101553660046114be565b61050e565b34801561016657600080fd5b5061017a6101753660046114be565b6105ff565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf3660046114be565b610820565b60405161019b9190611573565b3480156101dd57600080fd5b5060035461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020a57600080fd5b5061022e6102193660046114be565b60016020526000908152604090205460ff1681565b60405161019b91906115b5565b34801561024757600080fd5b506101186102563660046115f6565b6108ba565b34801561026757600080fd5b50610118610276366004611751565b610ae6565b34801561028757600080fd5b506101186102963660046117a1565b610b96565b3480156102a757600080fd5b5060005461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101186102d63660046117d3565b610c83565b3480156102e757600080fd5b506101186102f63660046115f6565b610f13565b34801561030757600080fd5b50610118610316366004611849565b611214565b34801561032757600080fd5b5060035474010000000000000000000000000000000000000000900460ff16604051901515815260200161019b565b34801561036257600080fd5b5061017a6103713660046114be565b611323565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461058f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168181600281111561063b5761063b611586565b036106b6578273ffffffffffffffffffffffffffffffffffffffff16635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106af9190611890565b9392505050565b60018160028111156106ca576106ca611586565b0361071a578273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d6000803e3d6000fd5b600281600281111561072e5761072e611586565b036107b85760035473ffffffffffffffffffffffffffffffffffffffff8481166000908152600260205260409081902090517fbf40fac1000000000000000000000000000000000000000000000000000000008152919092169163bf40fac19161079b91906004016118fa565b602060405180830381865afa15801561068b573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064016103f3565b50919050565b60026020526000908152604090208054610839906118ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610865906118ad565b80156108b25780601f10610887576101008083540402835291602001916108b2565b820191906000526020600020905b81548152906001019060200180831161089557829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff16331461093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561097757610977611586565b03610a03576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b1580156109e657600080fd5b505af11580156109fa573d6000803e3d6000fd5b50505050505050565b6001816002811115610a1757610a17611586565b03610a70576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af4035906024016109cc565b6002816002811115610a8457610a84611586565b036107b8576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b906024016109cc565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260409020610ae182826119e9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911690836002811115610c7a57610c7a611586565b02179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff1690816002811115610d4057610d40611586565b03610e06576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610d9b9087908790600401611b03565b60006040518083038185885af1158015610db9573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610e009190810190611b3a565b50610f0d565b610e108484610f13565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610e389190611bb1565b60006040518083038185875af1925050503d8060008114610e75576040519150601f19603f3d011682016040523d82523d6000602084013e610e7a565b606091505b5050905080610f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f50726f787941646d696e3a2063616c6c20746f2070726f78792061667465722060448201527f75706772616465206661696c656400000000000000000000000000000000000060648201526084016103f3565b505b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610fd057610fd0611586565b03611029576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe6906024016109cc565b600181600281111561103d5761103d611586565b036110bc576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda906044016109cc565b60028160028111156110d0576110d0611586565b036107b85773ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604081208054611105906118ad565b80601f0160208091040260200160405190810160405280929190818152602001828054611131906118ad565b801561117e5780601f106111535761010080835404028352916020019161117e565b820191906000526020600020905b81548152906001019060200180831161116157829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd93506111dc92508591508790600401611bcd565b600060405180830381600087803b1580156111f657600080fd5b505af115801561120a573d6000803e3d6000fd5b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd906112ed9085908590600401611bcd565b600060405180830381600087803b15801561130757600080fd5b505af115801561131b573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168181600281111561135f5761135f611586565b036113af578273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d6000803e3d6000fd5b60018160028111156113c3576113c3611586565b03611413578273ffffffffffffffffffffffffffffffffffffffff1663893d20e86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d6000803e3d6000fd5b600281600281111561142757611427611586565b036107b857600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146114bb57600080fd5b50565b6000602082840312156114d057600080fd5b81356106af81611499565b6000602082840312156114ed57600080fd5b813580151581146106af57600080fd5b60005b83811015611518578181015183820152602001611500565b83811115610f0d5750506000910152565b600081518084526115418160208601602086016114fd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006106af6020830184611529565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60208101600383106115f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561160957600080fd5b823561161481611499565b9150602083013561162481611499565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156116a5576116a561162f565b604052919050565b600067ffffffffffffffff8211156116c7576116c761162f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6000611706611701846116ad565b61165e565b905082815283838301111561171a57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261174257600080fd5b6106af838335602085016116f3565b6000806040838503121561176457600080fd5b823561176f81611499565b9150602083013567ffffffffffffffff81111561178b57600080fd5b61179785828601611731565b9150509250929050565b600080604083850312156117b457600080fd5b82356117bf81611499565b915060208301356003811061162457600080fd5b6000806000606084860312156117e857600080fd5b83356117f381611499565b9250602084013561180381611499565b9150604084013567ffffffffffffffff81111561181f57600080fd5b8401601f8101861361183057600080fd5b61183f868235602084016116f3565b9150509250925092565b6000806040838503121561185c57600080fd5b823567ffffffffffffffff81111561187357600080fd5b61187f85828601611731565b925050602083013561162481611499565b6000602082840312156118a257600080fd5b81516106af81611499565b600181811c908216806118c157607f821691505b60208210810361081a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060208083526000845461190e816118ad565b8084870152604060018084166000811461192f576001811461196757611995565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550611995565b896000528660002060005b8581101561198d5781548b8201860152908301908801611972565b8a0184019650505b509398975050505050505050565b601f821115610ae157600081815260208120601f850160051c810160208610156119ca5750805b601f850160051c820191505b8181101561131b578281556001016119d6565b815167ffffffffffffffff811115611a0357611a0361162f565b611a1781611a1184546118ad565b846119a3565b602080601f831160018114611a6a5760008415611a345750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561131b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611ab757888601518255948401946001909101908401611a98565b5085821015611af357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611b326040830184611529565b949350505050565b600060208284031215611b4c57600080fd5b815167ffffffffffffffff811115611b6357600080fd5b8201601f81018413611b7457600080fd5b8051611b82611701826116ad565b818152856020838501011115611b9757600080fd5b611ba88260208301602086016114fd565b95945050505050565b60008251611bc38184602087016114fd565b9190910192915050565b604081526000611be06040830185611529565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152939250505056fea164736f6c634300080f000a", +} + +// ProxyAdminABI is the input ABI used to generate the binding from. +// Deprecated: Use ProxyAdminMetaData.ABI instead. +var ProxyAdminABI = ProxyAdminMetaData.ABI + +// ProxyAdminBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ProxyAdminMetaData.Bin instead. +var ProxyAdminBin = ProxyAdminMetaData.Bin + +// DeployProxyAdmin deploys a new Ethereum contract, binding an instance of ProxyAdmin to it. +func DeployProxyAdmin(auth *bind.TransactOpts, backend bind.ContractBackend, _owner common.Address) (common.Address, *types.Transaction, *ProxyAdmin, error) { + parsed, err := ProxyAdminMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ProxyAdminBin), backend, _owner) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ProxyAdmin{ProxyAdminCaller: ProxyAdminCaller{contract: contract}, ProxyAdminTransactor: ProxyAdminTransactor{contract: contract}, ProxyAdminFilterer: ProxyAdminFilterer{contract: contract}}, nil +} + +// ProxyAdmin is an auto generated Go binding around an Ethereum contract. +type ProxyAdmin struct { + ProxyAdminCaller // Read-only binding to the contract + ProxyAdminTransactor // Write-only binding to the contract + ProxyAdminFilterer // Log filterer for contract events +} + +// ProxyAdminCaller is an auto generated read-only Go binding around an Ethereum contract. +type ProxyAdminCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyAdminTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ProxyAdminTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyAdminFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ProxyAdminFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyAdminSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ProxyAdminSession struct { + Contract *ProxyAdmin // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProxyAdminCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ProxyAdminCallerSession struct { + Contract *ProxyAdminCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ProxyAdminTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ProxyAdminTransactorSession struct { + Contract *ProxyAdminTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProxyAdminRaw is an auto generated low-level Go binding around an Ethereum contract. +type ProxyAdminRaw struct { + Contract *ProxyAdmin // Generic contract binding to access the raw methods on +} + +// ProxyAdminCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ProxyAdminCallerRaw struct { + Contract *ProxyAdminCaller // Generic read-only contract binding to access the raw methods on +} + +// ProxyAdminTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ProxyAdminTransactorRaw struct { + Contract *ProxyAdminTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewProxyAdmin creates a new instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdmin(address common.Address, backend bind.ContractBackend) (*ProxyAdmin, error) { + contract, err := bindProxyAdmin(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ProxyAdmin{ProxyAdminCaller: ProxyAdminCaller{contract: contract}, ProxyAdminTransactor: ProxyAdminTransactor{contract: contract}, ProxyAdminFilterer: ProxyAdminFilterer{contract: contract}}, nil +} + +// NewProxyAdminCaller creates a new read-only instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdminCaller(address common.Address, caller bind.ContractCaller) (*ProxyAdminCaller, error) { + contract, err := bindProxyAdmin(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ProxyAdminCaller{contract: contract}, nil +} + +// NewProxyAdminTransactor creates a new write-only instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdminTransactor(address common.Address, transactor bind.ContractTransactor) (*ProxyAdminTransactor, error) { + contract, err := bindProxyAdmin(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ProxyAdminTransactor{contract: contract}, nil +} + +// NewProxyAdminFilterer creates a new log filterer instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdminFilterer(address common.Address, filterer bind.ContractFilterer) (*ProxyAdminFilterer, error) { + contract, err := bindProxyAdmin(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ProxyAdminFilterer{contract: contract}, nil +} + +// bindProxyAdmin binds a generic wrapper to an already deployed contract. +func bindProxyAdmin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(ProxyAdminABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ProxyAdmin *ProxyAdminRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ProxyAdmin.Contract.ProxyAdminCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ProxyAdmin *ProxyAdminRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ProxyAdmin.Contract.ProxyAdminTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ProxyAdmin *ProxyAdminRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ProxyAdmin.Contract.ProxyAdminTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ProxyAdmin *ProxyAdminCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ProxyAdmin.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ProxyAdmin *ProxyAdminTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ProxyAdmin.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ProxyAdmin *ProxyAdminTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ProxyAdmin.Contract.contract.Transact(opts, method, params...) +} + +// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. +// +// Solidity: function addressManager() view returns(address) +func (_ProxyAdmin *ProxyAdminCaller) AddressManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "addressManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. +// +// Solidity: function addressManager() view returns(address) +func (_ProxyAdmin *ProxyAdminSession) AddressManager() (common.Address, error) { + return _ProxyAdmin.Contract.AddressManager(&_ProxyAdmin.CallOpts) +} + +// AddressManager is a free data retrieval call binding the contract method 0x3ab76e9f. +// +// Solidity: function addressManager() view returns(address) +func (_ProxyAdmin *ProxyAdminCallerSession) AddressManager() (common.Address, error) { + return _ProxyAdmin.Contract.AddressManager(&_ProxyAdmin.CallOpts) +} + +// GetProxyAdmin is a free data retrieval call binding the contract method 0xf3b7dead. +// +// Solidity: function getProxyAdmin(address _proxy) view returns(address) +func (_ProxyAdmin *ProxyAdminCaller) GetProxyAdmin(opts *bind.CallOpts, _proxy common.Address) (common.Address, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "getProxyAdmin", _proxy) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetProxyAdmin is a free data retrieval call binding the contract method 0xf3b7dead. +// +// Solidity: function getProxyAdmin(address _proxy) view returns(address) +func (_ProxyAdmin *ProxyAdminSession) GetProxyAdmin(_proxy common.Address) (common.Address, error) { + return _ProxyAdmin.Contract.GetProxyAdmin(&_ProxyAdmin.CallOpts, _proxy) +} + +// GetProxyAdmin is a free data retrieval call binding the contract method 0xf3b7dead. +// +// Solidity: function getProxyAdmin(address _proxy) view returns(address) +func (_ProxyAdmin *ProxyAdminCallerSession) GetProxyAdmin(_proxy common.Address) (common.Address, error) { + return _ProxyAdmin.Contract.GetProxyAdmin(&_ProxyAdmin.CallOpts, _proxy) +} + +// GetProxyImplementation is a free data retrieval call binding the contract method 0x204e1c7a. +// +// Solidity: function getProxyImplementation(address _proxy) view returns(address) +func (_ProxyAdmin *ProxyAdminCaller) GetProxyImplementation(opts *bind.CallOpts, _proxy common.Address) (common.Address, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "getProxyImplementation", _proxy) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetProxyImplementation is a free data retrieval call binding the contract method 0x204e1c7a. +// +// Solidity: function getProxyImplementation(address _proxy) view returns(address) +func (_ProxyAdmin *ProxyAdminSession) GetProxyImplementation(_proxy common.Address) (common.Address, error) { + return _ProxyAdmin.Contract.GetProxyImplementation(&_ProxyAdmin.CallOpts, _proxy) +} + +// GetProxyImplementation is a free data retrieval call binding the contract method 0x204e1c7a. +// +// Solidity: function getProxyImplementation(address _proxy) view returns(address) +func (_ProxyAdmin *ProxyAdminCallerSession) GetProxyImplementation(_proxy common.Address) (common.Address, error) { + return _ProxyAdmin.Contract.GetProxyImplementation(&_ProxyAdmin.CallOpts, _proxy) +} + +// ImplementationName is a free data retrieval call binding the contract method 0x238181ae. +// +// Solidity: function implementationName(address ) view returns(string) +func (_ProxyAdmin *ProxyAdminCaller) ImplementationName(opts *bind.CallOpts, arg0 common.Address) (string, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "implementationName", arg0) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// ImplementationName is a free data retrieval call binding the contract method 0x238181ae. +// +// Solidity: function implementationName(address ) view returns(string) +func (_ProxyAdmin *ProxyAdminSession) ImplementationName(arg0 common.Address) (string, error) { + return _ProxyAdmin.Contract.ImplementationName(&_ProxyAdmin.CallOpts, arg0) +} + +// ImplementationName is a free data retrieval call binding the contract method 0x238181ae. +// +// Solidity: function implementationName(address ) view returns(string) +func (_ProxyAdmin *ProxyAdminCallerSession) ImplementationName(arg0 common.Address) (string, error) { + return _ProxyAdmin.Contract.ImplementationName(&_ProxyAdmin.CallOpts, arg0) +} + +// IsUpgrading is a free data retrieval call binding the contract method 0xb7947262. +// +// Solidity: function isUpgrading() view returns(bool) +func (_ProxyAdmin *ProxyAdminCaller) IsUpgrading(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "isUpgrading") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsUpgrading is a free data retrieval call binding the contract method 0xb7947262. +// +// Solidity: function isUpgrading() view returns(bool) +func (_ProxyAdmin *ProxyAdminSession) IsUpgrading() (bool, error) { + return _ProxyAdmin.Contract.IsUpgrading(&_ProxyAdmin.CallOpts) +} + +// IsUpgrading is a free data retrieval call binding the contract method 0xb7947262. +// +// Solidity: function isUpgrading() view returns(bool) +func (_ProxyAdmin *ProxyAdminCallerSession) IsUpgrading() (bool, error) { + return _ProxyAdmin.Contract.IsUpgrading(&_ProxyAdmin.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ProxyAdmin *ProxyAdminCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ProxyAdmin *ProxyAdminSession) Owner() (common.Address, error) { + return _ProxyAdmin.Contract.Owner(&_ProxyAdmin.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ProxyAdmin *ProxyAdminCallerSession) Owner() (common.Address, error) { + return _ProxyAdmin.Contract.Owner(&_ProxyAdmin.CallOpts) +} + +// ProxyType is a free data retrieval call binding the contract method 0x6bd9f516. +// +// Solidity: function proxyType(address ) view returns(uint8) +func (_ProxyAdmin *ProxyAdminCaller) ProxyType(opts *bind.CallOpts, arg0 common.Address) (uint8, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "proxyType", arg0) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// ProxyType is a free data retrieval call binding the contract method 0x6bd9f516. +// +// Solidity: function proxyType(address ) view returns(uint8) +func (_ProxyAdmin *ProxyAdminSession) ProxyType(arg0 common.Address) (uint8, error) { + return _ProxyAdmin.Contract.ProxyType(&_ProxyAdmin.CallOpts, arg0) +} + +// ProxyType is a free data retrieval call binding the contract method 0x6bd9f516. +// +// Solidity: function proxyType(address ) view returns(uint8) +func (_ProxyAdmin *ProxyAdminCallerSession) ProxyType(arg0 common.Address) (uint8, error) { + return _ProxyAdmin.Contract.ProxyType(&_ProxyAdmin.CallOpts, arg0) +} + +// ChangeProxyAdmin is a paid mutator transaction binding the contract method 0x7eff275e. +// +// Solidity: function changeProxyAdmin(address _proxy, address _newAdmin) returns() +func (_ProxyAdmin *ProxyAdminTransactor) ChangeProxyAdmin(opts *bind.TransactOpts, _proxy common.Address, _newAdmin common.Address) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "changeProxyAdmin", _proxy, _newAdmin) +} + +// ChangeProxyAdmin is a paid mutator transaction binding the contract method 0x7eff275e. +// +// Solidity: function changeProxyAdmin(address _proxy, address _newAdmin) returns() +func (_ProxyAdmin *ProxyAdminSession) ChangeProxyAdmin(_proxy common.Address, _newAdmin common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.ChangeProxyAdmin(&_ProxyAdmin.TransactOpts, _proxy, _newAdmin) +} + +// ChangeProxyAdmin is a paid mutator transaction binding the contract method 0x7eff275e. +// +// Solidity: function changeProxyAdmin(address _proxy, address _newAdmin) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) ChangeProxyAdmin(_proxy common.Address, _newAdmin common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.ChangeProxyAdmin(&_ProxyAdmin.TransactOpts, _proxy, _newAdmin) +} + +// SetAddress is a paid mutator transaction binding the contract method 0x9b2ea4bd. +// +// Solidity: function setAddress(string _name, address _address) returns() +func (_ProxyAdmin *ProxyAdminTransactor) SetAddress(opts *bind.TransactOpts, _name string, _address common.Address) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "setAddress", _name, _address) +} + +// SetAddress is a paid mutator transaction binding the contract method 0x9b2ea4bd. +// +// Solidity: function setAddress(string _name, address _address) returns() +func (_ProxyAdmin *ProxyAdminSession) SetAddress(_name string, _address common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetAddress(&_ProxyAdmin.TransactOpts, _name, _address) +} + +// SetAddress is a paid mutator transaction binding the contract method 0x9b2ea4bd. +// +// Solidity: function setAddress(string _name, address _address) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) SetAddress(_name string, _address common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetAddress(&_ProxyAdmin.TransactOpts, _name, _address) +} + +// SetAddressManager is a paid mutator transaction binding the contract method 0x0652b57a. +// +// Solidity: function setAddressManager(address _address) returns() +func (_ProxyAdmin *ProxyAdminTransactor) SetAddressManager(opts *bind.TransactOpts, _address common.Address) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "setAddressManager", _address) +} + +// SetAddressManager is a paid mutator transaction binding the contract method 0x0652b57a. +// +// Solidity: function setAddressManager(address _address) returns() +func (_ProxyAdmin *ProxyAdminSession) SetAddressManager(_address common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetAddressManager(&_ProxyAdmin.TransactOpts, _address) +} + +// SetAddressManager is a paid mutator transaction binding the contract method 0x0652b57a. +// +// Solidity: function setAddressManager(address _address) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) SetAddressManager(_address common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetAddressManager(&_ProxyAdmin.TransactOpts, _address) +} + +// SetImplementationName is a paid mutator transaction binding the contract method 0x860f7cda. +// +// Solidity: function setImplementationName(address _address, string _name) returns() +func (_ProxyAdmin *ProxyAdminTransactor) SetImplementationName(opts *bind.TransactOpts, _address common.Address, _name string) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "setImplementationName", _address, _name) +} + +// SetImplementationName is a paid mutator transaction binding the contract method 0x860f7cda. +// +// Solidity: function setImplementationName(address _address, string _name) returns() +func (_ProxyAdmin *ProxyAdminSession) SetImplementationName(_address common.Address, _name string) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetImplementationName(&_ProxyAdmin.TransactOpts, _address, _name) +} + +// SetImplementationName is a paid mutator transaction binding the contract method 0x860f7cda. +// +// Solidity: function setImplementationName(address _address, string _name) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) SetImplementationName(_address common.Address, _name string) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetImplementationName(&_ProxyAdmin.TransactOpts, _address, _name) +} + +// SetOwner is a paid mutator transaction binding the contract method 0x13af4035. +// +// Solidity: function setOwner(address newOwner) returns() +func (_ProxyAdmin *ProxyAdminTransactor) SetOwner(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "setOwner", newOwner) +} + +// SetOwner is a paid mutator transaction binding the contract method 0x13af4035. +// +// Solidity: function setOwner(address newOwner) returns() +func (_ProxyAdmin *ProxyAdminSession) SetOwner(newOwner common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetOwner(&_ProxyAdmin.TransactOpts, newOwner) +} + +// SetOwner is a paid mutator transaction binding the contract method 0x13af4035. +// +// Solidity: function setOwner(address newOwner) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) SetOwner(newOwner common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetOwner(&_ProxyAdmin.TransactOpts, newOwner) +} + +// SetProxyType is a paid mutator transaction binding the contract method 0x8d52d4a0. +// +// Solidity: function setProxyType(address _address, uint8 _type) returns() +func (_ProxyAdmin *ProxyAdminTransactor) SetProxyType(opts *bind.TransactOpts, _address common.Address, _type uint8) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "setProxyType", _address, _type) +} + +// SetProxyType is a paid mutator transaction binding the contract method 0x8d52d4a0. +// +// Solidity: function setProxyType(address _address, uint8 _type) returns() +func (_ProxyAdmin *ProxyAdminSession) SetProxyType(_address common.Address, _type uint8) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetProxyType(&_ProxyAdmin.TransactOpts, _address, _type) +} + +// SetProxyType is a paid mutator transaction binding the contract method 0x8d52d4a0. +// +// Solidity: function setProxyType(address _address, uint8 _type) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) SetProxyType(_address common.Address, _type uint8) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetProxyType(&_ProxyAdmin.TransactOpts, _address, _type) +} + +// SetUpgrading is a paid mutator transaction binding the contract method 0x07c8f7b0. +// +// Solidity: function setUpgrading(bool _upgrading) returns() +func (_ProxyAdmin *ProxyAdminTransactor) SetUpgrading(opts *bind.TransactOpts, _upgrading bool) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "setUpgrading", _upgrading) +} + +// SetUpgrading is a paid mutator transaction binding the contract method 0x07c8f7b0. +// +// Solidity: function setUpgrading(bool _upgrading) returns() +func (_ProxyAdmin *ProxyAdminSession) SetUpgrading(_upgrading bool) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetUpgrading(&_ProxyAdmin.TransactOpts, _upgrading) +} + +// SetUpgrading is a paid mutator transaction binding the contract method 0x07c8f7b0. +// +// Solidity: function setUpgrading(bool _upgrading) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) SetUpgrading(_upgrading bool) (*types.Transaction, error) { + return _ProxyAdmin.Contract.SetUpgrading(&_ProxyAdmin.TransactOpts, _upgrading) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4. +// +// Solidity: function upgrade(address _proxy, address _implementation) returns() +func (_ProxyAdmin *ProxyAdminTransactor) Upgrade(opts *bind.TransactOpts, _proxy common.Address, _implementation common.Address) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "upgrade", _proxy, _implementation) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4. +// +// Solidity: function upgrade(address _proxy, address _implementation) returns() +func (_ProxyAdmin *ProxyAdminSession) Upgrade(_proxy common.Address, _implementation common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.Upgrade(&_ProxyAdmin.TransactOpts, _proxy, _implementation) +} + +// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4. +// +// Solidity: function upgrade(address _proxy, address _implementation) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) Upgrade(_proxy common.Address, _implementation common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.Upgrade(&_ProxyAdmin.TransactOpts, _proxy, _implementation) +} + +// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d. +// +// Solidity: function upgradeAndCall(address _proxy, address _implementation, bytes _data) payable returns() +func (_ProxyAdmin *ProxyAdminTransactor) UpgradeAndCall(opts *bind.TransactOpts, _proxy common.Address, _implementation common.Address, _data []byte) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "upgradeAndCall", _proxy, _implementation, _data) +} + +// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d. +// +// Solidity: function upgradeAndCall(address _proxy, address _implementation, bytes _data) payable returns() +func (_ProxyAdmin *ProxyAdminSession) UpgradeAndCall(_proxy common.Address, _implementation common.Address, _data []byte) (*types.Transaction, error) { + return _ProxyAdmin.Contract.UpgradeAndCall(&_ProxyAdmin.TransactOpts, _proxy, _implementation, _data) +} + +// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d. +// +// Solidity: function upgradeAndCall(address _proxy, address _implementation, bytes _data) payable returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) UpgradeAndCall(_proxy common.Address, _implementation common.Address, _data []byte) (*types.Transaction, error) { + return _ProxyAdmin.Contract.UpgradeAndCall(&_ProxyAdmin.TransactOpts, _proxy, _implementation, _data) +} + +// ProxyAdminOwnerUpdatedIterator is returned from FilterOwnerUpdated and is used to iterate over the raw logs and unpacked data for OwnerUpdated events raised by the ProxyAdmin contract. +type ProxyAdminOwnerUpdatedIterator struct { + Event *ProxyAdminOwnerUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ProxyAdminOwnerUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ProxyAdminOwnerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ProxyAdminOwnerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ProxyAdminOwnerUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProxyAdminOwnerUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProxyAdminOwnerUpdated represents a OwnerUpdated event raised by the ProxyAdmin contract. +type ProxyAdminOwnerUpdated struct { + User common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnerUpdated is a free log retrieval operation binding the contract event 0x8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76. +// +// Solidity: event OwnerUpdated(address indexed user, address indexed newOwner) +func (_ProxyAdmin *ProxyAdminFilterer) FilterOwnerUpdated(opts *bind.FilterOpts, user []common.Address, newOwner []common.Address) (*ProxyAdminOwnerUpdatedIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ProxyAdmin.contract.FilterLogs(opts, "OwnerUpdated", userRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ProxyAdminOwnerUpdatedIterator{contract: _ProxyAdmin.contract, event: "OwnerUpdated", logs: logs, sub: sub}, nil +} + +// WatchOwnerUpdated is a free log subscription operation binding the contract event 0x8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76. +// +// Solidity: event OwnerUpdated(address indexed user, address indexed newOwner) +func (_ProxyAdmin *ProxyAdminFilterer) WatchOwnerUpdated(opts *bind.WatchOpts, sink chan<- *ProxyAdminOwnerUpdated, user []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ProxyAdmin.contract.WatchLogs(opts, "OwnerUpdated", userRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ProxyAdminOwnerUpdated) + if err := _ProxyAdmin.contract.UnpackLog(event, "OwnerUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnerUpdated is a log parse operation binding the contract event 0x8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76. +// +// Solidity: event OwnerUpdated(address indexed user, address indexed newOwner) +func (_ProxyAdmin *ProxyAdminFilterer) ParseOwnerUpdated(log types.Log) (*ProxyAdminOwnerUpdated, error) { + event := new(ProxyAdminOwnerUpdated) + if err := _ProxyAdmin.contract.UnpackLog(event, "OwnerUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-bindings/bindings/registry.go b/op-bindings/bindings/registry.go new file mode 100644 index 0000000000000..8f42acb879e51 --- /dev/null +++ b/op-bindings/bindings/registry.go @@ -0,0 +1,30 @@ +package bindings + +import ( + "errors" + "fmt" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" + "github.com/ethereum/go-ethereum/common" +) + +var layouts = make(map[string]*solc.StorageLayout) + +var deployedBytecodes = make(map[string]string) + +func GetStorageLayout(name string) (*solc.StorageLayout, error) { + layout := layouts[name] + if layout == nil { + return nil, errors.New("storage layout not found") + } + return layout, nil +} + +func GetDeployedBytecode(name string) ([]byte, error) { + bc := deployedBytecodes[name] + if bc == "" { + return nil, fmt.Errorf("deployed bytecode %s not found", name) + } + + return common.FromHex(bc), nil +} diff --git a/op-bindings/bindings/sequencerfeevault_more.go b/op-bindings/bindings/sequencerfeevault_more.go new file mode 100755 index 0000000000000..a0735a8ffaacd --- /dev/null +++ b/op-bindings/bindings/sequencerfeevault_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const SequencerFeeVaultStorageLayoutJSON = "{\"storage\":[{\"astId\":2541,\"contract\":\"contracts/L2/SequencerFeeVault.sol:SequencerFeeVault\",\"label\":\"l1FeeWallet\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"}}}" + +var SequencerFeeVaultStorageLayout = new(solc.StorageLayout) + +var SequencerFeeVaultDeployedBin = "0x6080604052600436106100435760003560e01c80633ccfd60b1461004f57806354fd4d5014610066578063d3e5792b14610091578063d4ff9218146100bb57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006461010d565b005b34801561007257600080fd5b5061007b610296565b60405161008891906104f0565b60405180910390f35b34801561009d57600080fd5b506100ad67d02ab486cedc000081565b604051908152602001610088565b3480156100c757600080fd5b506000546100e89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610088565b67d02ab486cedc00004710156101cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f53657175656e6365724665655661756c743a207769746864726177616c20616d60448201527f6f756e74206d7573742062652067726561746572207468616e206d696e696d7560648201527f6d207769746864726177616c20616d6f756e7400000000000000000000000000608482015260a40160405180910390fd5b600080546040805160208101825283815290517fa3a795480000000000000000000000000000000000000000000000000000000081527342000000000000000000000000000000000000109363a3a795489347936102629373deaddeaddeaddeaddeaddeaddeaddeaddead00009373ffffffffffffffffffffffffffffffffffffffff909316924792909160040161050a565b6000604051808303818588803b15801561027b57600080fd5b505af115801561028f573d6000803e3d6000fd5b5050505050565b60606102c17f0000000000000000000000000000000000000000000000000000000000000000610339565b6102ea7f0000000000000000000000000000000000000000000000000000000000000000610339565b6103137f0000000000000000000000000000000000000000000000000000000000000000610339565b60405160200161032593929190610560565b604051602081830303815290604052905090565b60608160000361037c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156103a6578061039081610605565b915061039f9050600a8361066c565b9150610380565b60008167ffffffffffffffff8111156103c1576103c1610680565b6040519080825280601f01601f1916602001820160405280156103eb576020820181803683370190505b5090505b841561046e576104006001836106af565b915061040d600a866106c6565b6104189060306106da565b60f81b81838151811061042d5761042d6106f2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610467600a8661066c565b94506103ef565b949350505050565b60005b83811015610491578181015183820152602001610479565b838111156104a0576000848401525b50505050565b600081518084526104be816020860160208601610476565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061050360208301846104a6565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015263ffffffff8416606083015260a0608083015261055560a08301846104a6565b979650505050505050565b60008451610572818460208901610476565b80830190507f2e0000000000000000000000000000000000000000000000000000000000000080825285516105ae816001850160208a01610476565b600192019182015283516105c9816002840160208801610476565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610636576106366105d6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261067b5761067b61063d565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000828210156106c1576106c16105d6565b500390565b6000826106d5576106d561063d565b500690565b600082198211156106ed576106ed6105d6565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080f000a" + +func init() { + if err := json.Unmarshal([]byte(SequencerFeeVaultStorageLayoutJSON), SequencerFeeVaultStorageLayout); err != nil { + panic(err) + } + + layouts["SequencerFeeVault"] = SequencerFeeVaultStorageLayout + deployedBytecodes["SequencerFeeVault"] = SequencerFeeVaultDeployedBin +} diff --git a/op-bindings/bindings/weth9_more.go b/op-bindings/bindings/weth9_more.go new file mode 100755 index 0000000000000..93b8b7c4e06c0 --- /dev/null +++ b/op-bindings/bindings/weth9_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const WETH9StorageLayoutJSON = "{\"storage\":[{\"astId\":4,\"contract\":\"contracts/vendor/WETH9.sol:WETH9\",\"label\":\"name\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_string_storage\"},{\"astId\":7,\"contract\":\"contracts/vendor/WETH9.sol:WETH9\",\"label\":\"symbol\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_string_storage\"},{\"astId\":10,\"contract\":\"contracts/vendor/WETH9.sol:WETH9\",\"label\":\"decimals\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint8\"},{\"astId\":42,\"contract\":\"contracts/vendor/WETH9.sol:WETH9\",\"label\":\"balanceOf\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":48,\"contract\":\"contracts/vendor/WETH9.sol:WETH9\",\"label\":\"allowance\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" + +var WETH9StorageLayout = new(solc.StorageLayout) + +var WETH9DeployedBin = "0x6080604052600436106100bc5760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146102cb578063d0e30db0146100bc578063dd62ed3e14610311576100bc565b8063313ce5671461024b57806370a082311461027657806395d89b41146102b6576100bc565b806318160ddd116100a557806318160ddd146101aa57806323b872dd146101d15780632e1a7d4d14610221576100bc565b806306fdde03146100c6578063095ea7b314610150575b6100c4610359565b005b3480156100d257600080fd5b506100db6103a8565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101155781810151838201526020016100fd565b50505050905090810190601f1680156101425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015c57600080fd5b506101966004803603604081101561017357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610454565b604080519115158252519081900360200190f35b3480156101b657600080fd5b506101bf6104c7565b60408051918252519081900360200190f35b3480156101dd57600080fd5b50610196600480360360608110156101f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356104cb565b34801561022d57600080fd5b506100c46004803603602081101561024457600080fd5b503561066b565b34801561025757600080fd5b50610260610700565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b506101bf6004803603602081101561029957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610709565b3480156102c257600080fd5b506100db61071b565b3480156102d757600080fd5b50610196600480360360408110156102ee57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610793565b34801561031d57600080fd5b506101bf6004803603604081101561033457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166107a7565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b820191906000526020600020905b81548152906001019060200180831161042f57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b4790565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120548211156104fd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610573575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105ed5773ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020548211156105b557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b3360009081526003602052604090205481111561068757600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f193505050501580156106c6573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561044c5780601f106104215761010080835404028352916020019161044c565b60006107a03384846104cb565b9392505050565b60046020908152600092835260408084209091529082529020548156fea265627a7a72315820b2282f823392ab6b42c17b31235784e88e108cd8d10e77cd732aa3e1e7a88a7d64736f6c63430005110032" + +func init() { + if err := json.Unmarshal([]byte(WETH9StorageLayoutJSON), WETH9StorageLayout); err != nil { + panic(err) + } + + layouts["WETH9"] = WETH9StorageLayout + deployedBytecodes["WETH9"] = WETH9DeployedBin +} diff --git a/op-bindings/gen/main.go b/op-bindings/gen/main.go new file mode 100644 index 0000000000000..70424f153d18b --- /dev/null +++ b/op-bindings/gen/main.go @@ -0,0 +1,122 @@ +package main + +import ( + "encoding/json" + "flag" + "log" + "os" + "path/filepath" + "strings" + "text/template" + + "github.com/ethereum-optimism/optimism/op-bindings/hardhat" +) + +type flags struct { + ArtifactsDir string + Contracts string + OutDir string + Package string +} + +type data struct { + Name string + StorageLayout string + DeployedBin string + Package string +} + +func main() { + var f flags + flag.StringVar(&f.ArtifactsDir, "artifacts", "", "Comma-separated list of directories containing artifacts and build info") + flag.StringVar(&f.OutDir, "out", "", "Output directory to put code in") + flag.StringVar(&f.Contracts, "contracts", "", "Comma-separated list of contracts to generate code for") + flag.StringVar(&f.Package, "package", "artifacts", "Go package name") + flag.Parse() + + artifacts := strings.Split(f.ArtifactsDir, ",") + contracts := strings.Split(f.Contracts, ",") + + if len(artifacts) == 0 { + log.Fatalf("must define a list of artifacts") + } + + if len(contracts) == 0 { + log.Fatalf("must define a list of contracts") + } + + hh, err := hardhat.New("dummy", artifacts, nil) + if err != nil { + log.Fatalln("error reading artifacts:", err) + } + + t := template.Must(template.New("artifact").Parse(tmpl)) + + for _, name := range contracts { + art, err := hh.GetArtifact(name) + if err != nil { + log.Fatalf("error reading artifact %s: %v\n", name, err) + } + + storage, err := hh.GetStorageLayout(name) + if err != nil { + log.Fatalf("error reading storage layout %s: %v\n", name, err) + } + + ser, err := json.Marshal(storage) + if err != nil { + log.Fatalf("error marshaling storage: %v\n", err) + } + serStr := strings.Replace(string(ser), "\"", "\\\"", -1) + + d := data{ + Name: name, + StorageLayout: serStr, + DeployedBin: art.DeployedBytecode.String(), + Package: f.Package, + } + + fname := filepath.Join(f.OutDir, strings.ToLower(name)+"_more.go") + outfile, err := os.OpenFile( + fname, + os.O_RDWR|os.O_CREATE|os.O_TRUNC, + 0o600, + ) + if err != nil { + log.Fatalf("error opening %s: %v\n", fname, err) + } + + if err := t.Execute(outfile, d); err != nil { + log.Fatalf("error writing template %s: %v", outfile.Name(), err) + } + outfile.Close() + log.Printf("wrote file %s\n", outfile.Name()) + } +} + +var tmpl = `// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package {{.Package}} + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const {{.Name}}StorageLayoutJSON = "{{.StorageLayout}}" + +var {{.Name}}StorageLayout = new(solc.StorageLayout) + +var {{.Name}}DeployedBin = "{{.DeployedBin}}" + +func init() { + if err := json.Unmarshal([]byte({{.Name}}StorageLayoutJSON), {{.Name}}StorageLayout); err != nil { + panic(err) + } + + layouts["{{.Name}}"] = {{.Name}}StorageLayout + deployedBytecodes["{{.Name}}"] = {{.Name}}DeployedBin +} +` diff --git a/op-bindings/gen_bindings.sh b/op-bindings/gen_bindings.sh index 8319c0288a216..a44307fa6ed2c 100755 --- a/op-bindings/gen_bindings.sh +++ b/op-bindings/gen_bindings.sh @@ -37,10 +37,9 @@ TEMP=$(mktemp -d) CWD=$(pwd) # Build contracts cd ${CONTRACTS_PATH} -forge build -forge inspect ${NAME} abi > ${TEMP}/${TYPE}.abi -forge inspect ${NAME} bytecode > ${TEMP}/${TYPE}.bin -forge inspect ${NAME} deployedBytecode > ${CWD}/bin/${TYPE_LOWER}_deployed.hex +forge inspect -o ./tmp-artifacts ${NAME} abi > ${TEMP}/${TYPE}.abi +forge inspect -o ./tmp-artifacts ${NAME} bytecode > ${TEMP}/${TYPE}.bin +forge inspect -o ./tmp-artifacts ${NAME} deployedBytecode > ${CWD}/bin/${TYPE_LOWER}_deployed.hex # Run ABIGEN cd ${CWD} diff --git a/op-bindings/gen_deployed_bytecode.sh b/op-bindings/gen_deployed_bytecode.sh deleted file mode 100755 index 9cb0e8af10564..0000000000000 --- a/op-bindings/gen_deployed_bytecode.sh +++ /dev/null @@ -1,35 +0,0 @@ -#/bin/bash -set -eu - - -if [ "$#" -ne 2 ]; then - echo "This script takes 2 arguments - CONTRACT_NAME PACKAGE" - exit 1 -fi - -need_cmd() { - if ! command -v "$1" > /dev/null 2>&1; then - echo "need '$1' (command not found)" - exit 1 - fi -} - -need_cmd gofmt - - -TYPE=$1 -PACKAGE=$2 - - -# Convert to lower case to respect golang package naming conventions -TYPE_LOWER=$(echo ${TYPE} | tr '[:upper:]' '[:lower:]') -FILENAME="${TYPE_LOWER}_deployed.go" -FILE="${PACKAGE}/${FILENAME}" -DEPLOYED_BYTECODE=$(cat "bin/${TYPE_LOWER}_deployed.hex") - - -echo "// Code generated - DO NOT EDIT." > ${FILE} -echo "// This file is a generated binding and any manual changes will be lost." >> ${FILE} -echo "package ${PACKAGE}" >> ${FILE} -echo "var ${TYPE}DeployedBin = \"${DEPLOYED_BYTECODE}\"" >> ${FILE} -gofmt -s -w ${FILE} diff --git a/op-bindings/go.mod b/op-bindings/go.mod index be1bf42b2033b..aa64960c7917d 100644 --- a/op-bindings/go.mod +++ b/op-bindings/go.mod @@ -3,7 +3,7 @@ module github.com/ethereum-optimism/optimism/op-bindings go 1.18 require ( - github.com/ethereum/go-ethereum v1.10.21 + github.com/ethereum/go-ethereum v1.10.23 github.com/stretchr/testify v1.7.2 ) @@ -16,7 +16,6 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/golang-jwt/jwt/v4 v4.3.0 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -41,4 +40,6 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 +replace github.com/ethereum/go-ethereum v1.10.23 => github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 + +// github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 diff --git a/op-bindings/go.sum b/op-bindings/go.sum index fb66df18de4e5..0a798122f05a2 100644 --- a/op-bindings/go.sum +++ b/op-bindings/go.sum @@ -28,16 +28,16 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 h1:+WfrwiRELp3hoeb1bnPws3FtUUoYCDDYsCkwvKek5FY= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 h1:W/ZU6BZH7ilTrpdoJOF9N4OReqXbpeRtUB6klIpEdMA= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -45,8 +45,6 @@ github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= diff --git a/op-chain-ops/hardhat/hardhat.go b/op-bindings/hardhat/hardhat.go similarity index 96% rename from op-chain-ops/hardhat/hardhat.go rename to op-bindings/hardhat/hardhat.go index 811235a0dc106..2b2f469b112f3 100644 --- a/op-chain-ops/hardhat/hardhat.go +++ b/op-bindings/hardhat/hardhat.go @@ -9,7 +9,7 @@ import ( "strings" "sync" - "github.com/ethereum-optimism/optimism/op-chain-ops/solc" + "github.com/ethereum-optimism/optimism/op-bindings/solc" ) // `Hardhat` encapsulates all of the functionality required to interact @@ -26,7 +26,7 @@ type Hardhat struct { artifacts []*Artifact deployments []*Deployment - buildInfos []*BuildInfo + buildInfos []*BuildInfo //nolint:unused } // New creates a new `Hardhat` struct and reads all of the files from @@ -202,7 +202,7 @@ func (h *Hardhat) GetBuildInfo(name string) (*BuildInfo, error) { for _, artifactPath := range h.ArtifactPaths { fileSystem := os.DirFS(artifactPath) - fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error { + err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error { if err != nil { return err } @@ -249,6 +249,9 @@ func (h *Hardhat) GetBuildInfo(name string) (*BuildInfo, error) { return nil }) + if err != nil { + return nil, err + } } // TODO(tynes): handle multiple contracts with same name when required diff --git a/op-chain-ops/hardhat/hardhat_test.go b/op-bindings/hardhat/hardhat_test.go similarity index 98% rename from op-chain-ops/hardhat/hardhat_test.go rename to op-bindings/hardhat/hardhat_test.go index 99a4b63ee06c4..8334ad06985ef 100644 --- a/op-chain-ops/hardhat/hardhat_test.go +++ b/op-bindings/hardhat/hardhat_test.go @@ -3,7 +3,7 @@ package hardhat_test import ( "testing" - "github.com/ethereum-optimism/optimism/op-chain-ops/hardhat" + "github.com/ethereum-optimism/optimism/op-bindings/hardhat" "github.com/stretchr/testify/require" ) diff --git a/op-chain-ops/hardhat/testdata/artifacts/build-info/41b5106372a301360350245ee188494f.json b/op-bindings/hardhat/testdata/artifacts/build-info/41b5106372a301360350245ee188494f.json similarity index 100% rename from op-chain-ops/hardhat/testdata/artifacts/build-info/41b5106372a301360350245ee188494f.json rename to op-bindings/hardhat/testdata/artifacts/build-info/41b5106372a301360350245ee188494f.json diff --git a/op-chain-ops/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.dbg.json b/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.dbg.json similarity index 100% rename from op-chain-ops/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.dbg.json rename to op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.dbg.json diff --git a/op-chain-ops/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.json b/op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.json similarity index 100% rename from op-chain-ops/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.json rename to op-bindings/hardhat/testdata/artifacts/contracts/HelloWorld.sol/HelloWorld.json diff --git a/op-chain-ops/hardhat/testdata/deployments/goerli/OptimismPortal.json b/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortal.json similarity index 100% rename from op-chain-ops/hardhat/testdata/deployments/goerli/OptimismPortal.json rename to op-bindings/hardhat/testdata/deployments/goerli/OptimismPortal.json diff --git a/op-chain-ops/hardhat/testdata/deployments/goerli/OptimismPortalProxy.json b/op-bindings/hardhat/testdata/deployments/goerli/OptimismPortalProxy.json similarity index 100% rename from op-chain-ops/hardhat/testdata/deployments/goerli/OptimismPortalProxy.json rename to op-bindings/hardhat/testdata/deployments/goerli/OptimismPortalProxy.json diff --git a/op-chain-ops/hardhat/types.go b/op-bindings/hardhat/types.go similarity index 97% rename from op-chain-ops/hardhat/types.go rename to op-bindings/hardhat/types.go index fb8cfb1ebab93..6e656a78c1339 100644 --- a/op-chain-ops/hardhat/types.go +++ b/op-bindings/hardhat/types.go @@ -3,7 +3,7 @@ package hardhat import ( "encoding/json" - "github.com/ethereum-optimism/optimism/op-chain-ops/solc" + "github.com/ethereum-optimism/optimism/op-bindings/solc" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" @@ -57,7 +57,7 @@ type Log struct { } // Artifact represents a hardhat compilation artifact -// The Bytecode and DeployedBytecode are not guranteed +// The Bytecode and DeployedBytecode are not guaranteed // to be hexutil.Bytes when there are link references. // In the future, custom json marshalling can be used // to place the link reference values in the correct location. diff --git a/op-chain-ops/hardhat/utils.go b/op-bindings/hardhat/utils.go similarity index 100% rename from op-chain-ops/hardhat/utils.go rename to op-bindings/hardhat/utils.go diff --git a/op-bindings/predeploys/dev_addresses.go b/op-bindings/predeploys/dev_addresses.go new file mode 100644 index 0000000000000..3a3c5fa54e656 --- /dev/null +++ b/op-bindings/predeploys/dev_addresses.go @@ -0,0 +1,35 @@ +package predeploys + +import "github.com/ethereum/go-ethereum/common" + +const ( + DevL2OutputOracle = "0x6900000000000000000000000000000000000000" + DevOptimismPortal = "0x6900000000000000000000000000000000000001" + DevL1CrossDomainMessenger = "0x6900000000000000000000000000000000000002" + DevL1StandardBridge = "0x6900000000000000000000000000000000000003" + DevOptimismMintableERC20Factory = "0x6900000000000000000000000000000000000004" + DevAddressManager = "0x6900000000000000000000000000000000000005" + DevProxyAdmin = "0x6900000000000000000000000000000000000006" +) + +var ( + DevL2OutputOracleAddr = common.HexToAddress(DevL2OutputOracle) + DevOptimismPortalAddr = common.HexToAddress(DevOptimismPortal) + DevL1CrossDomainMessengerAddr = common.HexToAddress(DevL1CrossDomainMessenger) + DevL1StandardBridgeAddr = common.HexToAddress(DevL1StandardBridge) + DevOptimismMintableERC20FactoryAddr = common.HexToAddress(DevOptimismMintableERC20Factory) + DevAddressManagerAddr = common.HexToAddress(DevAddressManager) + DevProxyAdminAddr = common.HexToAddress(DevProxyAdmin) + + DevPredeploys = make(map[string]*common.Address) +) + +func init() { + DevPredeploys["L2OutputOracle"] = &DevL2OutputOracleAddr + DevPredeploys["OptimismPortal"] = &DevOptimismPortalAddr + DevPredeploys["L1CrossDomainMessenger"] = &DevL1CrossDomainMessengerAddr + DevPredeploys["L1StandardBridge"] = &DevL1StandardBridgeAddr + DevPredeploys["OptimismMintableERC20Factory"] = &DevOptimismMintableERC20FactoryAddr + DevPredeploys["AddressManager"] = &DevAddressManagerAddr + DevPredeploys["Admin"] = &DevProxyAdminAddr +} diff --git a/op-chain-ops/solc/types.go b/op-bindings/solc/types.go similarity index 97% rename from op-chain-ops/solc/types.go rename to op-bindings/solc/types.go index 1060c5a513b32..e0db31d81512e 100644 --- a/op-chain-ops/solc/types.go +++ b/op-bindings/solc/types.go @@ -55,7 +55,7 @@ type StorageLayoutEntry struct { Label string `json:"label"` Offset uint `json:"offset"` Slot uint `json:"slot,string"` - Type string `json"type"` + Type string `json:"type"` } type StorageLayoutType struct { @@ -73,7 +73,7 @@ type CompilerOutputEvm struct { MethodIdentifiers map[string]string `json:"methodIdentifiers"` } -// Object must be a string because its not guranteed to be +// Object must be a string because its not guaranteed to be // a hex string type CompilerOutputBytecode struct { Object string `json:"object"` diff --git a/op-chain-ops/cli.go b/op-chain-ops/cli.go index c8e4deeed536f..a6082cb615a45 100644 --- a/op-chain-ops/cli.go +++ b/op-chain-ops/cli.go @@ -49,14 +49,14 @@ func DumpAddresses(dataDir string, outFile string) error { // Migrate performs the actual state migration. It does quite a lot: // -// 1. It uses address lists, allowance lists, Mint events, and address preimages in -// the input state database to create a comprehensive list of storage slots in the -// OVM ETH contract. -// 2. It iterates over the slots in OVM ETH, and compares then against the list in (1). -// If the list doesn't match, or the total supply of OVM ETH doesn't match the sum of -// all balance storage slots, it panics. -// 3. It performs the actual migration by copying the input state DB into a new state DB. -// 4. It imports the provided genesis into the new state DB like Geth would during geth init. +// 1. It uses address lists, allowance lists, Mint events, and address preimages in +// the input state database to create a comprehensive list of storage slots in the +// OVM ETH contract. +// 2. It iterates over the slots in OVM ETH, and compares then against the list in (1). +// If the list doesn't match, or the total supply of OVM ETH doesn't match the sum of +// all balance storage slots, it panics. +// 3. It performs the actual migration by copying the input state DB into a new state DB. +// 4. It imports the provided genesis into the new state DB like Geth would during geth init. // // It takes the following arguments: // @@ -64,9 +64,9 @@ func DumpAddresses(dataDir string, outFile string) error { // - outDir: A directory to output the migrated database to. // - genesis: The new chain's genesis configuration. // - addrLists: A list of address list file paths. These address lists are used to populate -// balances from previous regenesis events. +// balances from previous regenesis events. // - allowanceLists: A list of allowance list file paths. These allowance lists are used -// to calculate allowance storage slots from previous regenesis events. +// to calculate allowance storage slots from previous regenesis events. // - chainID: The chain ID of the chain being migrated. func Migrate(dataDir, outDir string, genesis *core.Genesis, addrLists, allowanceLists []string, chainID, levelDBCacheSize, levelDBHandles int) error { db := MustOpenDBWithCacheOpts(dataDir, levelDBCacheSize, levelDBHandles) @@ -243,6 +243,9 @@ func Migrate(dataDir, outDir string, genesis *core.Genesis, addrLists, allowance log.Info("trie dumping started", "root", root) tr, err := backingStateDB.OpenTrie(root) + if err != nil { + return err + } it := trie.NewIterator(tr.NodeIterator(nil)) totalMigrated := new(big.Int) logAccountProgress := ProgressLogger(1000, "imported accounts") @@ -353,13 +356,11 @@ func Migrate(dataDir, outDir string, genesis *core.Genesis, addrLists, allowance } log.Info("committed trie DB") - // Now that the state is dumped, insert the genesis block. We pass in a nil - // database here because we don't want to update the state again with the - // pre-allocs. + // Now that the state is dumped, insert the genesis block. // // Unlike regular Geth (which panics if you try to import a genesis state with a nonzero // block number), the block number can be anything. - block := genesis.ToBlock(nil) + block := genesis.ToBlock() // Geth block headers are immutable, so swap the root and make a new block with the // updated root. @@ -373,7 +374,7 @@ func Migrate(dataDir, outDir string, genesis *core.Genesis, addrLists, allowance // Write the genesis state to the database. This is taken verbatim from Geth's // core.Genesis struct. - rawdb.WriteGenesisState(outDB, block.Hash(), blob) + rawdb.WriteGenesisStateSpec(outDB, block.Hash(), blob) rawdb.WriteTd(outDB, block.Hash(), block.NumberU64(), block.Difficulty()) rawdb.WriteBlock(outDB, block) rawdb.WriteReceipts(outDB, block.Hash(), block.NumberU64(), nil) diff --git a/op-chain-ops/deployer/deployer.go b/op-chain-ops/deployer/deployer.go new file mode 100644 index 0000000000000..f7ba09afa0d21 --- /dev/null +++ b/op-chain-ops/deployer/deployer.go @@ -0,0 +1,88 @@ +package deployer + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/params" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" +) + +// TestKey is the same test key that geth uses +var TestKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + +// ChainID is the chain id used for simulated backends +var ChainID = big.NewInt(1337) + +var TestAddress = crypto.PubkeyToAddress(TestKey.PublicKey) + +var thousandETH = new(big.Int).Mul(big.NewInt(params.Ether), big.NewInt(1000)) + +type Constructor struct { + Name string + Args []interface{} +} + +type Deployment struct { + Name string + Bytecode hexutil.Bytes + Address common.Address +} + +type Deployer func(*backends.SimulatedBackend, *bind.TransactOpts, Constructor) (common.Address, error) + +func NewBackend() *backends.SimulatedBackend { + return backends.NewSimulatedBackendWithCacheConfig( + &core.CacheConfig{ + Preimages: true, + }, + core.GenesisAlloc{ + crypto.PubkeyToAddress(TestKey.PublicKey): {Balance: thousandETH}, + }, + 15000000, + ) +} + +func Deploy(backend *backends.SimulatedBackend, constructors []Constructor, cb Deployer) ([]Deployment, error) { + results := make([]Deployment, len(constructors)) + + opts, err := bind.NewKeyedTransactorWithChainID(TestKey, ChainID) + if err != nil { + return nil, err + } + + opts.GasLimit = 15_000_000 + + for i, deployment := range constructors { + addr, err := cb(backend, opts, deployment) + if err != nil { + return nil, err + } + + backend.Commit() + if addr == (common.Address{}) { + return nil, fmt.Errorf("no address for %s", deployment.Name) + } + code, err := backend.CodeAt(context.Background(), addr, nil) + if len(code) == 0 { + return nil, fmt.Errorf("no code found for %s", deployment.Name) + } + if err != nil { + return nil, fmt.Errorf("cannot fetch code for %s", deployment.Name) + } + results[i] = Deployment{ + Name: deployment.Name, + Bytecode: code, + Address: addr, + } + } + + return results, nil +} diff --git a/op-chain-ops/genesis/config.go b/op-chain-ops/genesis/config.go index cb899c6aea47d..d9bd0ce55fd7d 100644 --- a/op-chain-ops/genesis/config.go +++ b/op-chain-ops/genesis/config.go @@ -2,66 +2,78 @@ package genesis import ( "encoding/json" - "math/big" "os" "path/filepath" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" "github.com/ethereum-optimism/optimism/op-bindings/predeploys" - "github.com/ethereum-optimism/optimism/op-chain-ops/hardhat" "github.com/ethereum-optimism/optimism/op-chain-ops/state" + "github.com/ethereum/go-ethereum/common" ) // DeployConfig represents the deployment configuration for Optimism type DeployConfig struct { - L1StartingBlockTag rpc.BlockNumberOrHash `json:"l1StartingBlockTag"` - L1ChainID *big.Int `json:"l1ChainID"` - L2ChainID *big.Int `json:"l2ChainID"` - L2BlockTime uint `json:"l2BlockTime"` - MaxSequencerDrift uint `json:"maxSequencerDrift"` - SequencerWindowSize uint `json:"sequencerWindowSize"` - ChannelTimeout uint `json:"channelTimeout"` - P2PSequencerAddress common.Address `json:"p2pSequencerAddress"` - OptimismL2FeeRecipient common.Address `json:"optimismL2FeeRecipient"` - BatchInboxAddress common.Address `json:"batchInboxAddress"` - BatchSenderAddress common.Address `json:"batchSenderAddress"` - L2OutputOracleSubmissionInterval uint `json:"l2OutputOracleSubmissionInterval"` - L2OutputOracleStartingTimestamp int `json:"l2OutputOracleStartingTimestamp"` - L2OutputOracleProposer common.Address `json:"l2OutputOracleProposer"` - L2OutputOracleOwner common.Address `json:"l2OutputOracleOwner"` - L1BlockTime uint64 `json:"l1BlockTime"` - CliqueSignerAddress common.Address `json:"cliqueSignerAddress"` - OptimismBaseFeeRecipient common.Address `json:"optimismBaseFeeRecipient"` - OptimismL1FeeRecipient common.Address `json:"optimismL1FeeRecipient"` - GasPriceOracleOwner common.Address `json:"gasPriceOracleOwner"` - GasPriceOracleOverhead uint `json:"gasPriceOracleOverhead"` - GasPriceOracleScalar uint `json:"gasPriceOracleScalar"` - GasPriceOracleDecimals uint `json:"gasPriceOracleDecimals"` - L2CrossDomainMessengerOwner common.Address `json:"l2CrossDomainMessengerOwner"` - L2GenesisBlockNonce uint64 `json:"l2GenesisBlockNonce"` - L2GenesisBlockExtraData hexutil.Bytes `json:"l2GenesisBlockExtraData"` - L2GenesisBlockGasLimit uint64 `json:"l2GenesisBlockGasLimit"` - L2GenesisBlockDifficulty *big.Int `json:"l2GenesisBlockDifficulty"` - L2GenesisBlockMixHash common.Hash `json:"l2GenesisBlockMixHash"` - L2GenesisBlockCoinbase common.Address `json:"l2GenesisBlockCoinbase"` - L2GenesisBlockNumber uint64 `json:"l2GenesisBlockNumber"` - L2GenesisBlockGasUsed uint64 `json:"l2GenesisBlockGasUsed"` - L2GenesisBlockParentHash common.Hash `json:"l2GenesisBlockParentHash"` - L2GenesisBlockBaseFeePerGas *big.Int `json:"l2GenesisBlockBaseFeePerGas"` - L1GenesisBlockTimestamp uint64 `json:"l1GenesisBlockTimestamp"` - L1GenesisBlockNonce uint64 `json:"l1GenesisBlockNonce"` - L1GenesisBlockGasLimit uint64 `json:"l1GenesisBlockGasLimit"` - L1GenesisBlockDifficulty *big.Int `json:"l1GenesisBlockDifficulty"` - L1GenesisBlockMixHash common.Hash `json:"l1GenesisBlockMixHash"` - L1GenesisBlockCoinbase common.Address `json:"l1GenesisBlockCoinbase"` - L1GenesisBlockNumber uint64 `json:"l1GenesisBlockNumber"` - L1GenesisBlockGasUsed uint64 `json:"l1GenesisBlockGasUsed"` - L1GenesisBlockParentHash common.Hash `json:"l1GenesisBlockParentHash"` - L1GenesisBlockBaseFeePerGas *big.Int `json:"l1GenesisBlockBaseFeePerGas"` + L1StartingBlockTag *rpc.BlockNumberOrHash `json:"l1StartingBlockTag"` + L1ChainID uint64 `json:"l1ChainID"` + L2ChainID uint64 `json:"l2ChainID"` + L2BlockTime uint64 `json:"l2BlockTime"` + + FinalizationPeriodSeconds uint64 `json:"finalizationPeriodSeconds"` + MaxSequencerDrift uint64 `json:"maxSequencerDrift"` + SequencerWindowSize uint64 `json:"sequencerWindowSize"` + ChannelTimeout uint64 `json:"channelTimeout"` + P2PSequencerAddress common.Address `json:"p2pSequencerAddress"` + OptimismL2FeeRecipient common.Address `json:"optimismL2FeeRecipient"` + BatchInboxAddress common.Address `json:"batchInboxAddress"` + BatchSenderAddress common.Address `json:"batchSenderAddress"` + + L2OutputOracleSubmissionInterval uint64 `json:"l2OutputOracleSubmissionInterval"` + L2OutputOracleStartingTimestamp int `json:"l2OutputOracleStartingTimestamp"` + L2OutputOracleProposer common.Address `json:"l2OutputOracleProposer"` + L2OutputOracleOwner common.Address `json:"l2OutputOracleOwner"` + L2OutputOracleGenesisL2Output common.Hash `json:"l2OutputOracleGenesisL2Output"` + + L1BlockTime uint64 `json:"l1BlockTime"` + L1GenesisBlockTimestamp hexutil.Uint64 `json:"l1GenesisBlockTimestamp"` + L1GenesisBlockNonce hexutil.Uint64 `json:"l1GenesisBlockNonce"` + CliqueSignerAddress common.Address `json:"cliqueSignerAddress"` + L1GenesisBlockGasLimit hexutil.Uint64 `json:"l1GenesisBlockGasLimit"` + L1GenesisBlockDifficulty *hexutil.Big `json:"l1GenesisBlockDifficulty"` + L1GenesisBlockMixHash common.Hash `json:"l1GenesisBlockMixHash"` + L1GenesisBlockCoinbase common.Address `json:"l1GenesisBlockCoinbase"` + L1GenesisBlockNumber hexutil.Uint64 `json:"l1GenesisBlockNumber"` + L1GenesisBlockGasUsed hexutil.Uint64 `json:"l1GenesisBlockGasUsed"` + L1GenesisBlockParentHash common.Hash `json:"l1GenesisBlockParentHash"` + L1GenesisBlockBaseFeePerGas *hexutil.Big `json:"l1GenesisBlockBaseFeePerGas"` + + L2GenesisBlockNonce hexutil.Uint64 `json:"l2GenesisBlockNonce"` + L2GenesisBlockExtraData hexutil.Bytes `json:"l2GenesisBlockExtraData"` + L2GenesisBlockGasLimit hexutil.Uint64 `json:"l2GenesisBlockGasLimit"` + L2GenesisBlockDifficulty *hexutil.Big `json:"l2GenesisBlockDifficulty"` + L2GenesisBlockMixHash common.Hash `json:"l2GenesisBlockMixHash"` + L2GenesisBlockCoinbase common.Address `json:"l2GenesisBlockCoinbase"` + L2GenesisBlockNumber hexutil.Uint64 `json:"l2GenesisBlockNumber"` + L2GenesisBlockGasUsed hexutil.Uint64 `json:"l2GenesisBlockGasUsed"` + L2GenesisBlockParentHash common.Hash `json:"l2GenesisBlockParentHash"` + L2GenesisBlockBaseFeePerGas *hexutil.Big `json:"l2GenesisBlockBaseFeePerGas"` + + L2CrossDomainMessengerOwner common.Address `json:"l2CrossDomainMessengerOwner"` + OptimismBaseFeeRecipient common.Address `json:"optimismBaseFeeRecipient"` + OptimismL1FeeRecipient common.Address `json:"optimismL1FeeRecipient"` + GasPriceOracleOwner common.Address `json:"gasPriceOracleOwner"` + GasPriceOracleOverhead uint `json:"gasPriceOracleOverhead"` + GasPriceOracleScalar uint `json:"gasPriceOracleScalar"` + GasPriceOracleDecimals uint `json:"gasPriceOracleDecimals"` + + DeploymentWaitConfirmations int `json:"deploymentWaitConfirmations"` + + EIP1559Elasticity uint64 `json:"eip1559Elasticity"` + EIP1559Denominator uint64 `json:"eip1559Denominator"` + + FundDevAccounts bool `json:"fundDevAccounts"` } // NewDeployConfig reads a config file given a path on the filesystem. @@ -91,25 +103,11 @@ func NewDeployConfigWithNetwork(network, path string) (*DeployConfig, error) { // contracts. type StorageConfig map[string]state.StorageValues -// NewStorageConfig will create a StorageConfig given an instance of a +// NewL2StorageConfig will create a StorageConfig given an instance of a // Hardhat and a DeployConfig. -func NewStorageConfig(hh *hardhat.Hardhat, config *DeployConfig, chain ethereum.ChainReader) (StorageConfig, error) { +func NewL2StorageConfig(config *DeployConfig, block *types.Block, proxyL1StandardBridge common.Address, proxyL1CrossDomainMessenger common.Address) (StorageConfig, error) { storage := make(StorageConfig) - proxyL1StandardBridge, err := hh.GetDeployment("L1StandardBridgeProxy") - if err != nil { - return storage, err - } - proxyL1CrossDomainMessenger, err := hh.GetDeployment("L1CrossDomainMessengerProxy") - if err != nil { - return storage, err - } - - block, err := getBlockFromTag(chain, config.L1StartingBlockTag) - if err != nil { - return storage, err - } - storage["L2ToL1MessagePasser"] = state.StorageValues{ "nonce": 0, } @@ -122,7 +120,7 @@ func NewStorageConfig(hh *hardhat.Hardhat, config *DeployConfig, chain ethereum. "_paused": false, "xDomainMsgSender": "0x000000000000000000000000000000000000dEaD", "msgNonce": 0, - "otherMessenger": proxyL1CrossDomainMessenger.Address, + "otherMessenger": proxyL1CrossDomainMessenger, "blockedSystemAddresses": map[any]any{ predeploys.L2CrossDomainMessenger: true, predeploys.L2ToL1MessagePasser: true, @@ -138,7 +136,7 @@ func NewStorageConfig(hh *hardhat.Hardhat, config *DeployConfig, chain ethereum. "_initialized": true, "_initializing": false, "messenger": predeploys.L2CrossDomainMessenger, - "otherBridge": proxyL1StandardBridge.Address, + "otherBridge": proxyL1StandardBridge, } storage["SequencerFeeVault"] = state.StorageValues{ "l1FeeWallet": config.OptimismL1FeeRecipient, diff --git a/op-chain-ops/genesis/config_test.go b/op-chain-ops/genesis/config_test.go new file mode 100644 index 0000000000000..ff03c36bdd867 --- /dev/null +++ b/op-chain-ops/genesis/config_test.go @@ -0,0 +1,42 @@ +package genesis + +import ( + "bytes" + "encoding/json" + "fmt" + "os" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rpc" + + "github.com/stretchr/testify/require" +) + +func TestConfigMarshalUnmarshal(t *testing.T) { + // NOTE: the l1 starting block tag is set to null + // in the test since the type is not JSON serializable. + // Rather than bloat the code by introducing a marshalable + // block tag type that's only used in test, I created a separate + // test to validate that the starting block tag unmarshals + // correctly. + + b, err := os.ReadFile("testdata/test-deploy-config-full.json") + require.NoError(t, err) + dec := json.NewDecoder(bytes.NewReader(b)) + decoded := new(DeployConfig) + require.NoError(t, dec.Decode(decoded)) + encoded, err := json.MarshalIndent(decoded, "", " ") + + require.NoError(t, err) + require.JSONEq(t, string(b), string(encoded)) +} + +func TestUnmarshalL1StartingBlockTag(t *testing.T) { + decoded := new(DeployConfig) + require.NoError(t, json.Unmarshal([]byte(`{"l1StartingBlockTag": "earliest"}`), decoded)) + require.EqualValues(t, rpc.EarliestBlockNumber, *decoded.L1StartingBlockTag.BlockNumber) + h := "0x86c7263d87140ca7cd9bf1bc9e95a435a7a0efc0ae2afaf64920c5b59a6393d4" + require.NoError(t, json.Unmarshal([]byte(fmt.Sprintf(`{"l1StartingBlockTag": "%s"}`, h)), decoded)) + require.EqualValues(t, common.HexToHash(h), *decoded.L1StartingBlockTag.BlockHash) +} diff --git a/op-chain-ops/genesis/genesis.go b/op-chain-ops/genesis/genesis.go index 861363cf09f2b..0c336f78fc7d3 100644 --- a/op-chain-ops/genesis/genesis.go +++ b/op-chain-ops/genesis/genesis.go @@ -5,7 +5,9 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" @@ -13,13 +15,22 @@ import ( ) // NewL2Genesis will create a new L2 genesis -func NewL2Genesis(config *DeployConfig, chain ethereum.ChainReader) (*core.Genesis, error) { - if config.L2ChainID == nil { +func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, error) { + if config.L2ChainID == 0 { return nil, errors.New("must define L2 ChainID") } + eip1559Denom := config.EIP1559Denominator + if eip1559Denom == 0 { + eip1559Denom = 50 + } + eip1559Elasticity := config.EIP1559Elasticity + if eip1559Elasticity == 0 { + eip1559Elasticity = 10 + } + optimismChainConfig := params.ChainConfig{ - ChainID: config.L2ChainID, + ChainID: new(big.Int).SetUint64(config.L2ChainID), HomesteadBlock: big.NewInt(0), DAOForkBlock: nil, DAOForkSupport: false, @@ -42,8 +53,10 @@ func NewL2Genesis(config *DeployConfig, chain ethereum.ChainReader) (*core.Genes TerminalTotalDifficulty: big.NewInt(0), TerminalTotalDifficultyPassed: true, Optimism: ¶ms.OptimismConfig{ - BaseFeeRecipient: config.OptimismBaseFeeRecipient, - L1FeeRecipient: config.OptimismL2FeeRecipient, + BaseFeeRecipient: config.OptimismBaseFeeRecipient, + L1FeeRecipient: config.OptimismL2FeeRecipient, + EIP1559Denominator: eip1559Denom, + EIP1559Elasticity: eip1559Elasticity, }, } @@ -53,42 +66,37 @@ func NewL2Genesis(config *DeployConfig, chain ethereum.ChainReader) (*core.Genes } gasLimit := config.L2GenesisBlockGasLimit if gasLimit == 0 { - gasLimit = uint64(15_000_000) + gasLimit = 15_000_000 } baseFee := config.L2GenesisBlockBaseFeePerGas if baseFee == nil { - baseFee = big.NewInt(params.InitialBaseFee) + baseFee = newHexBig(params.InitialBaseFee) } difficulty := config.L2GenesisBlockDifficulty if difficulty == nil { - difficulty = big.NewInt(1) - } - - block, err := getBlockFromTag(chain, config.L1StartingBlockTag) - if err != nil { - return nil, err + difficulty = newHexBig(0) } return &core.Genesis{ Config: &optimismChainConfig, - Nonce: config.L2GenesisBlockNonce, + Nonce: uint64(config.L2GenesisBlockNonce), Timestamp: block.Time(), ExtraData: extraData, - GasLimit: gasLimit, - Difficulty: difficulty, + GasLimit: uint64(gasLimit), + Difficulty: difficulty.ToInt(), Mixhash: config.L2GenesisBlockMixHash, Coinbase: config.L2GenesisBlockCoinbase, - Number: config.L2GenesisBlockNumber, - GasUsed: config.L2GenesisBlockGasUsed, + Number: uint64(config.L2GenesisBlockNumber), + GasUsed: uint64(config.L2GenesisBlockGasUsed), ParentHash: config.L2GenesisBlockParentHash, - BaseFee: baseFee, + BaseFee: baseFee.ToInt(), Alloc: map[common.Address]core.GenesisAccount{}, }, nil } // NewL1Genesis will create a new L1 genesis config func NewL1Genesis(config *DeployConfig) (*core.Genesis, error) { - if config.L1ChainID == nil { + if config.L1ChainID == 0 { return nil, errors.New("must define L1 ChainID") } @@ -97,40 +105,40 @@ func NewL1Genesis(config *DeployConfig) (*core.Genesis, error) { Period: config.L1BlockTime, Epoch: 30000, } - chainConfig.ChainID = config.L1ChainID + chainConfig.ChainID = uint642Big(config.L1ChainID) gasLimit := config.L1GenesisBlockGasLimit if gasLimit == 0 { - gasLimit = uint64(15_000_000) + gasLimit = 15_000_000 } baseFee := config.L1GenesisBlockBaseFeePerGas if baseFee == nil { - baseFee = big.NewInt(params.InitialBaseFee) + baseFee = newHexBig(params.InitialBaseFee) } difficulty := config.L1GenesisBlockDifficulty if difficulty == nil { - difficulty = big.NewInt(1) + difficulty = newHexBig(1) } timestamp := config.L1GenesisBlockTimestamp if timestamp == 0 { - timestamp = uint64(time.Now().Unix()) + timestamp = hexutil.Uint64(time.Now().Unix()) } extraData := append(append(make([]byte, 32), config.CliqueSignerAddress[:]...), make([]byte, crypto.SignatureLength)...) return &core.Genesis{ Config: &chainConfig, - Nonce: config.L1GenesisBlockNonce, - Timestamp: timestamp, + Nonce: uint64(config.L1GenesisBlockNonce), + Timestamp: uint64(timestamp), ExtraData: extraData, - GasLimit: gasLimit, - Difficulty: difficulty, + GasLimit: uint64(gasLimit), + Difficulty: difficulty.ToInt(), Mixhash: config.L1GenesisBlockMixHash, Coinbase: config.L1GenesisBlockCoinbase, - Number: config.L1GenesisBlockNumber, - GasUsed: config.L1GenesisBlockGasUsed, + Number: uint64(config.L1GenesisBlockNumber), + GasUsed: uint64(config.L1GenesisBlockGasUsed), ParentHash: config.L1GenesisBlockParentHash, - BaseFee: baseFee, + BaseFee: baseFee.ToInt(), Alloc: map[common.Address]core.GenesisAccount{}, }, nil } diff --git a/op-chain-ops/genesis/helpers.go b/op-chain-ops/genesis/helpers.go index 6efeb1ec3aa49..036f05b7e2a54 100644 --- a/op-chain-ops/genesis/helpers.go +++ b/op-chain-ops/genesis/helpers.go @@ -16,10 +16,14 @@ import ( var ( // codeNamespace represents the namespace of implementations of predeploys codeNamespace = common.HexToAddress("0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000") - // predeployNamespace represents the namespace of predeploys - predeployNamespace = common.HexToAddress("0x4200000000000000000000000000000000000000") - // bigPredeployNamespace represents the predeploy namespace as a big.Int - bigPredeployNamespace = new(big.Int).SetBytes(predeployNamespace.Bytes()) + // l2PredeployNamespace represents the namespace of L2 predeploys + l2PredeployNamespace = common.HexToAddress("0x4200000000000000000000000000000000000000") + // l1PredeployNamespace represents the namespace of L1 predeploys + l1PredeployNamespace = common.HexToAddress("0x6900000000000000000000000000000000000000") + // bigL2PredeployNamespace represents the predeploy namespace as a big.Int + bigL2PredeployNamespace = new(big.Int).SetBytes(l2PredeployNamespace.Bytes()) + // bigL1PredeployNamespace represents the predeploy namespace as a big.Int + bigL1PredeployNamespace = new(big.Int).SetBytes(l1PredeployNamespace.Bytes()) // bigCodeNamespace represents the predeploy namespace as a big.Int bigCodeNameSpace = new(big.Int).SetBytes(codeNamespace.Bytes()) // implementationSlot represents the EIP 1967 implementation storage slot @@ -59,19 +63,26 @@ var DevAccounts = []common.Address{ var devBalance = hexutil.MustDecodeBig("0x200000000000000000000000000000000000000000000000000000000000000") // AddressToCodeNamespace takes a predeploy address and computes -// the implmentation address that the implementation should be deployed at +// the implementation address that the implementation should be deployed at func AddressToCodeNamespace(addr common.Address) (common.Address, error) { - bytesAddr := addr.Bytes() - if !bytes.Equal(bytesAddr[0:2], []byte{0x42, 0x00}) { + if !IsL1DevPredeploy(addr) && !IsL2DevPredeploy(addr) { return common.Address{}, fmt.Errorf("cannot handle non predeploy: %s", addr) } - bigAddress := new(big.Int).SetBytes(bytesAddr[18:]) + bigAddress := new(big.Int).SetBytes(addr[18:]) num := new(big.Int).Or(bigCodeNameSpace, bigAddress) return common.BigToAddress(num), nil } -// getBlockFromTag will resolve a Block given an rpc block tag -func getBlockFromTag(chain ethereum.ChainReader, tag rpc.BlockNumberOrHash) (*types.Block, error) { +func IsL1DevPredeploy(addr common.Address) bool { + return bytes.Equal(addr[0:2], []byte{0x69, 0x00}) +} + +func IsL2DevPredeploy(addr common.Address) bool { + return bytes.Equal(addr[0:2], []byte{0x42, 0x00}) +} + +// GetBlockFromTag will resolve a Block given an rpc block tag +func GetBlockFromTag(chain ethereum.ChainReader, tag *rpc.BlockNumberOrHash) (*types.Block, error) { if hash, ok := tag.Hash(); ok { block, err := chain.BlockByHash(context.Background(), hash) if err != nil { @@ -89,3 +100,14 @@ func getBlockFromTag(chain ethereum.ChainReader, tag rpc.BlockNumberOrHash) (*ty return nil, fmt.Errorf("invalid block tag: %v", tag) } } + +// uint642Big creates a new *big.Int from a uint64. +func uint642Big(in uint64) *big.Int { + return new(big.Int).SetUint64(in) +} + +func newHexBig(in uint64) *hexutil.Big { + b := new(big.Int).SetUint64(in) + hb := hexutil.Big(*b) + return &hb +} diff --git a/op-chain-ops/genesis/layer_one.go b/op-chain-ops/genesis/layer_one.go index 8ef39d1a7888c..50f536b9669c3 100644 --- a/op-chain-ops/genesis/layer_one.go +++ b/op-chain-ops/genesis/layer_one.go @@ -1,24 +1,337 @@ package genesis import ( + "errors" + "fmt" + "math/big" + "strings" + + "github.com/ethereum/go-ethereum/rlp" + + "github.com/ethereum-optimism/optimism/op-bindings/bindings" + "github.com/ethereum-optimism/optimism/op-bindings/predeploys" + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" "github.com/ethereum-optimism/optimism/op-chain-ops/state" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/trie" ) -// TODO(tynes): need bindings for all of the L1 contracts to be able -// to create a genesis file with the L1 contracts predeployed. -// This would speed up testing as deployments take time when -// running tests. +var proxies = []string{ + "L2OutputOracleProxy", + "L1CrossDomainMessengerProxy", + "L1StandardBridgeProxy", + "OptimismPortalProxy", + "OptimismMintableERC20FactoryProxy", +} + +var portalMeteringSlot = common.Hash{31: 0x01} + +var zeroHash common.Hash + func BuildL1DeveloperGenesis(config *DeployConfig) (*core.Genesis, error) { + if config.L2OutputOracleStartingTimestamp != -1 { + return nil, errors.New("l2oo starting timestamp must be -1") + } + + if config.L1GenesisBlockTimestamp == 0 { + return nil, errors.New("must specify l1 genesis block timestamp") + } + genesis, err := NewL1Genesis(config) if err != nil { return nil, err } - db := state.NewMemoryStateDB(genesis) + backend := deployer.NewBackend() + + deployments, err := deployL1Contracts(config, backend) + if err != nil { + return nil, err + } + + depsByName := make(map[string]deployer.Deployment) + depsByAddr := make(map[common.Address]deployer.Deployment) + for _, dep := range deployments { + depsByName[dep.Name] = dep + depsByAddr[dep.Address] = dep + } - FundDevAccounts(db) - SetPrecompileBalances(db) + opts, err := bind.NewKeyedTransactorWithChainID(deployer.TestKey, deployer.ChainID) + if err != nil { + return nil, err + } + + l2ooABI, err := bindings.L2OutputOracleMetaData.GetAbi() + if err != nil { + return nil, err + } + data, err := l2ooABI.Pack( + "initialize", + config.L2OutputOracleGenesisL2Output, + big.NewInt(0), + config.L2OutputOracleProposer, + config.L2OutputOracleOwner, + ) + if err != nil { + return nil, err + } + if err := upgradeProxy( + backend, + opts, + depsByName["L2OutputOracleProxy"].Address, + depsByName["L2OutputOracle"].Address, + data, + ); err != nil { + return nil, err + } - return db.Genesis(), nil + portalABI, err := bindings.OptimismPortalMetaData.GetAbi() + if err != nil { + return nil, err + } + data, err = portalABI.Pack("initialize") + if err != nil { + return nil, err + } + if err := upgradeProxy( + backend, + opts, + depsByName["OptimismPortalProxy"].Address, + depsByName["OptimismPortal"].Address, + data, + ); err != nil { + return nil, err + } + l1XDMABI, err := bindings.L1CrossDomainMessengerMetaData.GetAbi() + if err != nil { + return nil, err + } + data, err = l1XDMABI.Pack("initialize") + if err != nil { + return nil, err + } + if err := upgradeProxy( + backend, + opts, + depsByName["L1CrossDomainMessengerProxy"].Address, + depsByName["L1CrossDomainMessenger"].Address, + data, + ); err != nil { + return nil, err + } + + l1SBrABI, err := bindings.L1StandardBridgeMetaData.GetAbi() + if err != nil { + return nil, err + } + data, err = l1SBrABI.Pack("initialize", predeploys.DevL1CrossDomainMessengerAddr) + if err != nil { + return nil, err + } + if err := upgradeProxy( + backend, + opts, + depsByName["L1StandardBridgeProxy"].Address, + depsByName["L1StandardBridge"].Address, + data, + ); err != nil { + return nil, err + } + + if err := upgradeProxy( + backend, + opts, + depsByName["OptimismMintableERC20FactoryProxy"].Address, + depsByName["OptimismMintableERC20Factory"].Address, + nil, + ); err != nil { + return nil, err + } + + backend.Commit() + + memDB := state.NewMemoryStateDB(genesis) + if err := SetL1Proxies(memDB, predeploys.DevProxyAdminAddr); err != nil { + return nil, err + } + FundDevAccounts(memDB) + SetPrecompileBalances(memDB) + + for name, proxyAddr := range predeploys.DevPredeploys { + memDB.SetState(*proxyAddr, ImplementationSlot, depsByName[name].Address.Hash()) + } + + stateDB, err := backend.Blockchain().State() + if err != nil { + return nil, err + } + + for _, dep := range deployments { + st := stateDB.StorageTrie(dep.Address) + iter := trie.NewIterator(st.NodeIterator(nil)) + + depAddr := dep.Address + if strings.HasSuffix(dep.Name, "Proxy") { + depAddr = *predeploys.DevPredeploys[strings.TrimSuffix(dep.Name, "Proxy")] + } + + memDB.CreateAccount(depAddr) + memDB.SetCode(depAddr, dep.Bytecode) + for iter.Next() { + _, data, _, err := rlp.Split(iter.Value) + if err != nil { + return nil, err + } + + key := common.BytesToHash(st.GetKey(iter.Key)) + value := common.BytesToHash(data) + + if depAddr == predeploys.DevOptimismPortalAddr && key == portalMeteringSlot { + // We need to manually set the block number in the resource + // metering storage slot to zero. Otherwise, deposits will + // revert. + copy(value[:24], zeroHash[:]) + } + + memDB.SetState(depAddr, key, value) + } + } + return memDB.Genesis(), nil +} + +func deployL1Contracts(config *DeployConfig, backend *backends.SimulatedBackend) ([]deployer.Deployment, error) { + constructors := make([]deployer.Constructor, 0) + for _, proxy := range proxies { + constructors = append(constructors, deployer.Constructor{ + Name: proxy, + }) + } + constructors = append(constructors, []deployer.Constructor{ + { + Name: "L2OutputOracle", + Args: []interface{}{ + uint642Big(config.L2OutputOracleSubmissionInterval), + [32]byte(config.L2OutputOracleGenesisL2Output), + big.NewInt(0), + big.NewInt(0), + uint642Big(uint64(config.L1GenesisBlockTimestamp)), + uint642Big(config.L2BlockTime), + config.L2OutputOracleProposer, + config.L2OutputOracleOwner, + }, + }, + { + Name: "OptimismPortal", + Args: []interface{}{ + uint642Big(config.FinalizationPeriodSeconds), + }, + }, + { + Name: "L1CrossDomainMessenger", + }, + { + Name: "L1StandardBridge", + }, + { + Name: "OptimismMintableERC20Factory", + }, + { + Name: "AddressManager", + }, + { + Name: "ProxyAdmin", + Args: []interface{}{ + common.Address{19: 0x01}, + }, + }, + }...) + return deployer.Deploy(backend, constructors, l1Deployer) +} + +func l1Deployer(backend *backends.SimulatedBackend, opts *bind.TransactOpts, deployment deployer.Constructor) (common.Address, error) { + var addr common.Address + var err error + + switch deployment.Name { + case "L2OutputOracle": + addr, _, _, err = bindings.DeployL2OutputOracle( + opts, + backend, + deployment.Args[0].(*big.Int), + deployment.Args[1].([32]byte), + deployment.Args[2].(*big.Int), + deployment.Args[3].(*big.Int), + deployment.Args[4].(*big.Int), + deployment.Args[5].(*big.Int), + deployment.Args[6].(common.Address), + deployment.Args[7].(common.Address), + ) + case "OptimismPortal": + addr, _, _, err = bindings.DeployOptimismPortal( + opts, + backend, + predeploys.DevL2OutputOracleAddr, + deployment.Args[0].(*big.Int), + ) + case "L1CrossDomainMessenger": + addr, _, _, err = bindings.DeployL1CrossDomainMessenger( + opts, + backend, + predeploys.DevOptimismPortalAddr, + ) + case "L1StandardBridge": + addr, _, _, err = bindings.DeployL1StandardBridge( + opts, + backend, + predeploys.DevL1CrossDomainMessengerAddr, + ) + case "OptimismMintableERC20Factory": + addr, _, _, err = bindings.DeployOptimismMintableERC20Factory( + opts, + backend, + predeploys.DevL1StandardBridgeAddr, + ) + case "AddressManager": + addr, _, _, err = bindings.DeployAddressManager( + opts, + backend, + ) + case "ProxyAdmin": + addr, _, _, err = bindings.DeployProxyAdmin( + opts, + backend, + common.Address{}, + ) + default: + if strings.HasSuffix(deployment.Name, "Proxy") { + addr, _, _, err = bindings.DeployProxy(opts, backend, deployer.TestAddress) + } else { + err = fmt.Errorf("unknown contract %s", deployment.Name) + } + } + + return addr, err +} + +func upgradeProxy(backend *backends.SimulatedBackend, opts *bind.TransactOpts, proxyAddr common.Address, implAddr common.Address, callData []byte) error { + proxy, err := bindings.NewProxy(proxyAddr, backend) + if err != nil { + return err + } + if callData == nil { + _, err = proxy.UpgradeTo(opts, implAddr) + } else { + _, err = proxy.UpgradeToAndCall( + opts, + implAddr, + callData, + ) + } + if err == nil { + backend.Commit() + } + return err } diff --git a/op-chain-ops/genesis/layer_one_test.go b/op-chain-ops/genesis/layer_one_test.go new file mode 100644 index 0000000000000..9378819d20bbe --- /dev/null +++ b/op-chain-ops/genesis/layer_one_test.go @@ -0,0 +1,105 @@ +package genesis + +import ( + "bytes" + "encoding/json" + "math/big" + "os" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + + "github.com/ethereum-optimism/optimism/op-bindings/bindings" + "github.com/ethereum-optimism/optimism/op-bindings/predeploys" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/stretchr/testify/require" +) + +func TestBuildL1DeveloperGenesis(t *testing.T) { + b, err := os.ReadFile("testdata/test-deploy-config-full.json") + require.NoError(t, err) + dec := json.NewDecoder(bytes.NewReader(b)) + config := new(DeployConfig) + require.NoError(t, dec.Decode(config)) + config.L1GenesisBlockTimestamp = hexutil.Uint64(time.Now().Unix()) + + genesis, err := BuildL1DeveloperGenesis(config) + require.NoError(t, err) + + sim := backends.NewSimulatedBackend( + genesis.Alloc, + 15000000, + ) + callOpts := &bind.CallOpts{} + + oracle, err := bindings.NewL2OutputOracle(predeploys.DevL2OutputOracleAddr, sim) + require.NoError(t, err) + portal, err := bindings.NewOptimismPortal(predeploys.DevOptimismPortalAddr, sim) + require.NoError(t, err) + + proposer, err := oracle.Proposer(callOpts) + require.NoError(t, err) + require.Equal(t, config.L2OutputOracleProposer, proposer) + + owner, err := oracle.Owner(callOpts) + require.NoError(t, err) + require.Equal(t, config.L2OutputOracleOwner, owner) + + // Same set of tests as exist in the deployment scripts + interval, err := oracle.SUBMISSIONINTERVAL(callOpts) + require.NoError(t, err) + require.EqualValues(t, config.L2OutputOracleSubmissionInterval, interval.Uint64()) + + histBlocks, err := oracle.HISTORICALTOTALBLOCKS(callOpts) + require.NoError(t, err) + require.EqualValues(t, 0, histBlocks.Uint64()) + + startBlock, err := oracle.STARTINGBLOCKNUMBER(callOpts) + require.NoError(t, err) + require.EqualValues(t, 0, startBlock.Uint64()) + + l2BlockTime, err := oracle.L2BLOCKTIME(callOpts) + require.NoError(t, err) + require.EqualValues(t, 2, l2BlockTime.Uint64()) + + oracleAddr, err := portal.L2ORACLE(callOpts) + require.NoError(t, err) + require.EqualValues(t, predeploys.DevL2OutputOracleAddr, oracleAddr) + + msgr, err := bindings.NewL1CrossDomainMessenger(predeploys.DevL1CrossDomainMessengerAddr, sim) + require.NoError(t, err) + portalAddr, err := msgr.Portal(callOpts) + require.NoError(t, err) + require.Equal(t, predeploys.DevOptimismPortalAddr, portalAddr) + + bridge, err := bindings.NewL1StandardBridge(predeploys.DevL1StandardBridgeAddr, sim) + require.NoError(t, err) + msgrAddr, err := bridge.Messenger(callOpts) + require.NoError(t, err) + require.Equal(t, predeploys.DevL1CrossDomainMessengerAddr, msgrAddr) + otherBridge, err := bridge.OtherBridge(callOpts) + require.NoError(t, err) + require.Equal(t, predeploys.L2StandardBridgeAddr, otherBridge) + + factory, err := bindings.NewOptimismMintableERC20(predeploys.DevOptimismMintableERC20FactoryAddr, sim) + require.NoError(t, err) + bridgeAddr, err := factory.Bridge(callOpts) + require.NoError(t, err) + require.Equal(t, predeploys.DevL1StandardBridgeAddr, bridgeAddr) + + // test that we can do deposits, etc. + priv, err := crypto.HexToECDSA("ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80") + require.NoError(t, err) + + tOpts, err := bind.NewKeyedTransactorWithChainID(priv, deployer.ChainID) + require.NoError(t, err) + tOpts.Value = big.NewInt(0.001 * params.Ether) + tOpts.GasLimit = 1_000_000 + _, err = bridge.DepositETH(tOpts, 200000, nil) + require.NoError(t, err) +} diff --git a/op-chain-ops/genesis/layer_two.go b/op-chain-ops/genesis/layer_two.go index 5c1fe8f8a7cc8..112c28ceea391 100644 --- a/op-chain-ops/genesis/layer_two.go +++ b/op-chain-ops/genesis/layer_two.go @@ -1,49 +1,62 @@ package genesis import ( - "github.com/ethereum-optimism/optimism/op-chain-ops/hardhat" "github.com/ethereum-optimism/optimism/op-chain-ops/state" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/core" ) -// BuildOptimismDeveloperGenesis will build the developer Optimism Genesis +type L2Addresses struct { + ProxyAdmin common.Address + L1StandardBridgeProxy common.Address + L1CrossDomainMessengerProxy common.Address +} + +// BuildL2DeveloperGenesis will build the developer Optimism Genesis // Block. Suitable for devnets. -func BuildOptimismDeveloperGenesis(hh *hardhat.Hardhat, config *DeployConfig, chain ethereum.ChainReader) (*core.Genesis, error) { - genspec, err := NewL2Genesis(config, chain) +func BuildL2DeveloperGenesis(config *DeployConfig, l1StartBlock *types.Block, l2Addrs *L2Addresses) (*core.Genesis, error) { + genspec, err := NewL2Genesis(config, l1StartBlock) if err != nil { return nil, err } db := state.NewMemoryStateDB(genspec) - FundDevAccounts(db) + if config.FundDevAccounts { + FundDevAccounts(db) + } SetPrecompileBalances(db) - return BuildOptimismGenesis(db, hh, config, chain) + return BuildL2Genesis(db, config, l1StartBlock, l2Addrs) } -// BuildOptimismGenesis will build the L2 Optimism Genesis Block -func BuildOptimismGenesis(db *state.MemoryStateDB, hh *hardhat.Hardhat, config *DeployConfig, chain ethereum.ChainReader) (*core.Genesis, error) { +// BuildL2Genesis will build the L2 Optimism Genesis Block +func BuildL2Genesis(db *state.MemoryStateDB, config *DeployConfig, l1Block *types.Block, l2Addrs *L2Addresses) (*core.Genesis, error) { // TODO(tynes): need a function for clearing old, unused storage slots. // Each deployed contract on L2 needs to have its existing storage // inspected and then cleared if they are no longer used. - if err := SetProxies(hh, db); err != nil { + if err := SetL2Proxies(db, l2Addrs.ProxyAdmin); err != nil { return nil, err } - storage, err := NewStorageConfig(hh, config, chain) + storage, err := NewL2StorageConfig( + config, + l1Block, + l2Addrs.L1StandardBridgeProxy, + l2Addrs.L1CrossDomainMessengerProxy, + ) if err != nil { return nil, err } - if err := SetImplementations(hh, db, storage); err != nil { + if err := SetImplementations(db, storage); err != nil { return nil, err } - if err := MigrateDepositHashes(hh, db); err != nil { + if err := MigrateDepositHashes(db); err != nil { return nil, err } diff --git a/op-chain-ops/genesis/layer_two_test.go b/op-chain-ops/genesis/layer_two_test.go index 4e92fda7433d9..38f3d1055ff41 100644 --- a/op-chain-ops/genesis/layer_two_test.go +++ b/op-chain-ops/genesis/layer_two_test.go @@ -1,19 +1,24 @@ package genesis_test import ( + "context" "encoding/json" "flag" - "io/ioutil" "math/big" + "os" "testing" + "github.com/ethereum-optimism/optimism/op-bindings/bindings" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum-optimism/optimism/op-bindings/hardhat" "github.com/ethereum-optimism/optimism/op-bindings/predeploys" "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" - "github.com/ethereum-optimism/optimism/op-chain-ops/hardhat" "github.com/stretchr/testify/require" ) @@ -25,18 +30,18 @@ func init() { var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") -func TestBuildOptimismGenesis(t *testing.T) { +func TestBuildL2DeveloperGenesis(t *testing.T) { hh, err := hardhat.New( "goerli", - []string{ - "../../packages/contracts-bedrock/artifacts", - "../../packages/contracts-governance/artifacts", - }, + nil, []string{"../../packages/contracts-bedrock/deployments"}, ) require.Nil(t, err) - config, err := genesis.NewDeployConfig("../../packages/contracts-bedrock/deploy-config/devnetL1.json") + config, err := genesis.NewDeployConfig("./testdata/test-deploy-config-devnet-l1.json") + require.Nil(t, err) + + proxyAdmin, err := hh.GetDeployment("ProxyAdmin") require.Nil(t, err) backend := backends.NewSimulatedBackend( @@ -45,15 +50,16 @@ func TestBuildOptimismGenesis(t *testing.T) { }, 15000000, ) - - gen, err := genesis.BuildOptimismDeveloperGenesis(hh, config, backend) + block, err := backend.BlockByNumber(context.Background(), common.Big0) + require.NoError(t, err) + gen, err := genesis.BuildL2DeveloperGenesis(config, block, &genesis.L2Addresses{ + ProxyAdmin: proxyAdmin.Address, + }) require.Nil(t, err) require.NotNil(t, gen) - proxyAdmin, err := hh.GetDeployment("ProxyAdmin") - require.Nil(t, err) - proxy, err := hh.GetArtifact("Proxy") - require.Nil(t, err) + depB, err := bindings.GetDeployedBytecode("Proxy") + require.NoError(t, err) for name, address := range predeploys.Predeploys { addr := *address @@ -69,11 +75,32 @@ func TestBuildOptimismGenesis(t *testing.T) { adminSlot, ok := account.Storage[genesis.AdminSlot] require.Equal(t, ok, true) require.Equal(t, adminSlot, proxyAdmin.Address.Hash()) - require.Equal(t, account.Code, []byte(proxy.DeployedBytecode)) + require.Equal(t, account.Code, depB) } + require.Equal(t, 2337, len(gen.Alloc)) if writeFile { file, _ := json.MarshalIndent(gen, "", " ") - _ = ioutil.WriteFile("genesis.json", file, 0644) + _ = os.WriteFile("genesis.json", file, 0644) } } + +func TestBuildL2DeveloperGenesisDevAccountsFunding(t *testing.T) { + config, err := genesis.NewDeployConfig("./testdata/test-deploy-config-devnet-l1.json") + require.Nil(t, err) + config.FundDevAccounts = false + + backend := backends.NewSimulatedBackend( + core.GenesisAlloc{ + crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)}, + }, + 15000000, + ) + block, err := backend.BlockByNumber(context.Background(), common.Big0) + require.NoError(t, err) + gen, err := genesis.BuildL2DeveloperGenesis(config, block, &genesis.L2Addresses{ + ProxyAdmin: common.Address{}, + }) + require.NoError(t, err) + require.Equal(t, 2316, len(gen.Alloc)) +} diff --git a/op-chain-ops/genesis/setters.go b/op-chain-ops/genesis/setters.go index ee16fda508c13..940a9372bab2d 100644 --- a/op-chain-ops/genesis/setters.go +++ b/op-chain-ops/genesis/setters.go @@ -4,8 +4,9 @@ import ( "fmt" "math/big" + "github.com/ethereum-optimism/optimism/op-bindings/bindings" + "github.com/ethereum-optimism/optimism/op-bindings/predeploys" - "github.com/ethereum-optimism/optimism/op-chain-ops/hardhat" "github.com/ethereum-optimism/optimism/op-chain-ops/immutables" "github.com/ethereum-optimism/optimism/op-chain-ops/state" "github.com/ethereum/go-ethereum/common" @@ -20,22 +21,30 @@ func FundDevAccounts(db vm.StateDB) { } } -// SetProxies will set each of the proxies in the state. It requires +// SetL2Proxies will set each of the proxies in the state. It requires // a Proxy and ProxyAdmin deployment present so that the Proxy bytecode // can be set in state and the ProxyAdmin can be set as the admin of the // Proxy. -func SetProxies(hh *hardhat.Hardhat, db vm.StateDB) error { - proxy, err := hh.GetArtifact("Proxy") - if err != nil { - return err - } - proxyAdmin, err := hh.GetDeployment("ProxyAdmin") +func SetL2Proxies(db vm.StateDB, proxyAdminAddr common.Address) error { + return setProxies(db, proxyAdminAddr, bigL2PredeployNamespace, 2048) +} + +// SetL1Proxies will set each of the proxies in the state. It requires +// a Proxy and ProxyAdmin deployment present so that the Proxy bytecode +// can be set in state and the ProxyAdmin can be set as the admin of the +// Proxy. +func SetL1Proxies(db vm.StateDB, proxyAdminAddr common.Address) error { + return setProxies(db, proxyAdminAddr, bigL1PredeployNamespace, 2048) +} + +func setProxies(db vm.StateDB, proxyAdminAddr common.Address, namespace *big.Int, count uint64) error { + depBytecode, err := bindings.GetDeployedBytecode("Proxy") if err != nil { return err } - for i := uint64(0); i <= 2048; i++ { - bigAddr := new(big.Int).Or(bigPredeployNamespace, new(big.Int).SetUint64(i)) + for i := uint64(0); i <= count; i++ { + bigAddr := new(big.Int).Or(namespace, new(big.Int).SetUint64(i)) addr := common.BigToAddress(bigAddr) // There is no proxy at the governance token address @@ -44,8 +53,8 @@ func SetProxies(hh *hardhat.Hardhat, db vm.StateDB) error { } db.CreateAccount(addr) - db.SetCode(addr, proxy.DeployedBytecode) - db.SetState(addr, AdminSlot, proxyAdmin.Address.Hash()) + db.SetCode(addr, depBytecode) + db.SetState(addr, AdminSlot, proxyAdminAddr.Hash()) } return nil } @@ -53,19 +62,13 @@ func SetProxies(hh *hardhat.Hardhat, db vm.StateDB) error { // SetImplementations will set the implmentations of the contracts in the state // and configure the proxies to point to the implementations. It also sets // the appropriate storage values for each contract at the proxy address. -func SetImplementations(hh *hardhat.Hardhat, db vm.StateDB, storage StorageConfig) error { +func SetImplementations(db vm.StateDB, storage StorageConfig) error { deployResults, err := immutables.BuildOptimism() if err != nil { return err } for name, address := range predeploys.Predeploys { - // Get the hardhat artifact to access the deployed bytecode - artifact, err := hh.GetArtifact(name) - if err != nil { - return err - } - // Convert the address to the code address var addr common.Address switch *address { @@ -78,7 +81,7 @@ func SetImplementations(hh *hardhat.Hardhat, db vm.StateDB, storage StorageConfi if err != nil { return err } - // Set the implmentation slot in the predeploy proxy + // Set the implementation slot in the predeploy proxy db.SetState(*address, ImplementationSlot, addr.Hash()) } @@ -90,12 +93,16 @@ func SetImplementations(hh *hardhat.Hardhat, db vm.StateDB, storage StorageConfi if bytecode, ok := deployResults[name]; ok { db.SetCode(addr, bytecode) } else { - db.SetCode(addr, artifact.DeployedBytecode) + depBytecode, err := bindings.GetDeployedBytecode(name) + if err != nil { + return err + } + db.SetCode(addr, depBytecode) } // Set the storage values if storageConfig, ok := storage[name]; ok { - layout, err := hh.GetStorageLayout(name) + layout, err := bindings.GetStorageLayout(name) if err != nil { return err } @@ -120,8 +127,8 @@ func SetImplementations(hh *hardhat.Hardhat, db vm.StateDB, storage StorageConfi // Get the storage layout of the L2ToL1MessagePasser // Iterate over the storage layout to know which storage slots to ignore // Iterate over each storage slot, compute the migration -func MigrateDepositHashes(hh *hardhat.Hardhat, db vm.StateDB) error { - layout, err := hh.GetStorageLayout("L2ToL1MessagePasser") +func MigrateDepositHashes(db vm.StateDB) error { + layout, err := bindings.GetStorageLayout("L2ToL1MessagePasser") if err != nil { return err } @@ -138,14 +145,13 @@ func MigrateDepositHashes(hh *hardhat.Hardhat, db vm.StateDB) error { ignore[encoded] = true } - db.ForEachStorage(predeploys.L2ToL1MessagePasserAddr, func(key, value common.Hash) bool { + return db.ForEachStorage(predeploys.L2ToL1MessagePasserAddr, func(key, value common.Hash) bool { if _, ok := ignore[key]; ok { return true } // TODO(tynes): Do the value migration here return true }) - return nil } // SetPrecompileBalances will set a single wei at each precompile address. diff --git a/op-chain-ops/genesis/test_util.go b/op-chain-ops/genesis/test_util.go new file mode 100644 index 0000000000000..7d94811f2dde0 --- /dev/null +++ b/op-chain-ops/genesis/test_util.go @@ -0,0 +1,51 @@ +package genesis + +import ( + "archive/tar" + "compress/gzip" + "io" + "os" + "path/filepath" +) + +func Untar(tarball, target string) error { + f, err := os.Open(tarball) + if err != nil { + return err + } + defer f.Close() + r, err := gzip.NewReader(f) + if err != nil { + return err + } + tarReader := tar.NewReader(r) + + for { + header, err := tarReader.Next() + if err == io.EOF { + break + } else if err != nil { + return err + } + + path := filepath.Join(target, header.Name) + info := header.FileInfo() + if info.IsDir() { + if err = os.MkdirAll(path, info.Mode()); err != nil { + return err + } + continue + } + + file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode()) + if err != nil { + return err + } + defer file.Close() + _, err = io.Copy(file, tarReader) + if err != nil { + return err + } + } + return nil +} diff --git a/op-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json b/op-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json new file mode 100644 index 0000000000000..691a5b40980b6 --- /dev/null +++ b/op-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json @@ -0,0 +1,28 @@ +{ + "l1StartingBlockTag": "earliest", + "l1ChainID": 900, + "l2ChainID": 901, + "l2BlockTime": 2, + + "maxSequencerDrift": 100, + "sequencerWindowSize": 4, + "channelTimeout": 40, + "p2pSequencerAddress": "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", + "optimismL2FeeRecipient": "0xd9c09e21b57c98e58a80552c170989b426766aa7", + "batchInboxAddress": "0xff00000000000000000000000000000000000000", + "batchSenderAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + + "l2OutputOracleSubmissionInterval": 20, + "l2OutputOracleStartingTimestamp": -1, + "l2OutputOracleProposer": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "l2OutputOracleOwner": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + + "l1BlockTime": 15, + "cliqueSignerAddress": "0xca062b0fd91172d89bcd4bb084ac4e21972cc467", + + "optimismBaseFeeRecipient": "0xBcd4042DE499D14e55001CcbB24a551F3b954096", + "optimismL1FeeRecipient": "0x71bE63f3384f5fb98995898A86B02Fb2426c5788", + + "deploymentWaitConfirmations": 1, + "fundDevAccounts": true +} diff --git a/op-chain-ops/genesis/testdata/test-deploy-config-full.json b/op-chain-ops/genesis/testdata/test-deploy-config-full.json new file mode 100644 index 0000000000000..2b498b9f875ce --- /dev/null +++ b/op-chain-ops/genesis/testdata/test-deploy-config-full.json @@ -0,0 +1,52 @@ +{ + "l1StartingBlockTag": null, + "l1ChainID": 901, + "l2ChainID": 902, + "l2BlockTime": 2, + "maxSequencerDrift": 20, + "sequencerWindowSize": 100, + "channelTimeout": 30, + "p2pSequencerAddress": "0x0000000000000000000000000000000000000000", + "optimismL2FeeRecipient": "0x42000000000000000000000000000000000000f0", + "batchInboxAddress": "0x42000000000000000000000000000000000000ff", + "batchSenderAddress": "0x0000000000000000000000000000000000000000", + "l2OutputOracleSubmissionInterval": 6, + "l2OutputOracleStartingTimestamp": -1, + "l2OutputOracleProposer": "0x7770000000000000000000000000000000000001", + "l2OutputOracleOwner": "0x7770000000000000000000000000000000000002", + "l1BlockTime": 15, + "l1GenesisBlockNonce": "0x0", + "cliqueSignerAddress": "0x0000000000000000000000000000000000000000", + "l1GenesisBlockGasLimit": "0xe4e1c0", + "l1GenesisBlockDifficulty": "0x1", + "finalizationPeriodSeconds": 2, + "l1GenesisBlockMixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "l1GenesisBlockCoinbase": "0x0000000000000000000000000000000000000000", + "l1GenesisBlockNumber": "0x0", + "l1GenesisBlockGasUsed": "0x0", + "l1GenesisBlockParentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "l1GenesisBlockTimestamp": "0x0", + "l1GenesisBlockBaseFeePerGas": "0x3b9aca00", + "l2GenesisBlockNonce": "0x0", + "l2GenesisBlockExtraData": "0x", + "l2GenesisBlockGasLimit": "0xe4e1c0", + "l2GenesisBlockDifficulty": "0x1", + "l2GenesisBlockMixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "l2GenesisBlockCoinbase": "0x42000000000000000000000000000000000000f0", + "l2OutputOracleGenesisL2Output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "l2GenesisBlockNumber": "0x0", + "l2GenesisBlockGasUsed": "0x0", + "l2GenesisBlockParentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "l2GenesisBlockBaseFeePerGas": "0x3b9aca00", + "optimismBaseFeeRecipient": "0x42000000000000000000000000000000000000f1", + "optimismL1FeeRecipient": "0x0000000000000000000000000000000000000000", + "l2CrossDomainMessengerOwner": "0x42000000000000000000000000000000000000f2", + "gasPriceOracleOwner": "0x42000000000000000000000000000000000000f3", + "gasPriceOracleOverhead": 2100, + "gasPriceOracleScalar": 1000000, + "gasPriceOracleDecimals": 6, + "deploymentWaitConfirmations": 1, + "eip1559Denominator": 8, + "eip1559Elasticity": 2, + "fundDevAccounts": true +} \ No newline at end of file diff --git a/op-chain-ops/go.mod b/op-chain-ops/go.mod index 26fb902128961..fe9a3338895d5 100644 --- a/op-chain-ops/go.mod +++ b/op-chain-ops/go.mod @@ -4,12 +4,12 @@ go 1.18 require ( github.com/ethereum-optimism/optimism/l2geth v0.0.0-20220820030939-de38b6f6f77e - github.com/ethereum-optimism/optimism/op-bindings v0.4.0 - github.com/ethereum/go-ethereum v1.10.21 + github.com/ethereum-optimism/optimism/op-bindings v0.8.6 + github.com/ethereum/go-ethereum v1.10.23 github.com/mattn/go-isatty v0.0.14 - github.com/stretchr/testify v1.7.2 + github.com/stretchr/testify v1.8.0 github.com/urfave/cli/v2 v2.10.2 - golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 + golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e ) require ( @@ -29,16 +29,20 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.0 // indirect + github.com/kr/pretty v0.3.0 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/rjeczalik/notify v0.9.2 // indirect + github.com/rogpeppe/go-internal v1.8.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 // indirect @@ -48,7 +52,10 @@ require ( github.com/tklauser/numcpus v0.4.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect + golang.org/x/sys v0.0.0-20220701225701-179beb0bd1a1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220904174542-4311f9d2cead diff --git a/op-chain-ops/go.sum b/op-chain-ops/go.sum index cec373c47be08..a973496ec5b00 100644 --- a/op-chain-ops/go.sum +++ b/op-chain-ops/go.sum @@ -174,12 +174,12 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum-optimism/optimism/l2geth v0.0.0-20220820030939-de38b6f6f77e h1:LUfy9ofKcen9Cm1T9JyGNnrPLR2AmyelFbohS6bs4X8= github.com/ethereum-optimism/optimism/l2geth v0.0.0-20220820030939-de38b6f6f77e/go.mod h1:Oj5A6Qs/Ao1SP17i3uKroyhz49q/ehagSXRAlvwaI5Y= -github.com/ethereum-optimism/optimism/op-bindings v0.4.0 h1:4Yop9PGMBUhRtg12aR/ydTTut72s/1J+ztl0lv8UvSI= -github.com/ethereum-optimism/optimism/op-bindings v0.4.0/go.mod h1:LHuyDHLNLalBJouGRnryAivhRBz+r4T0+stIKaE1+/g= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6 h1:jJYhmygt7hqGzYa+8sme9SdnKt1c3Y6EbWgIrRONoxw= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6/go.mod h1:gUX5317IAvRMjB4GftayM87JVln3DTqukfirwJpEWnE= github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg= github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= -github.com/ethereum/go-ethereum v1.10.21 h1:5lqsEx92ZaZzRyOqBEXux4/UR06m296RGzN3ol3teJY= -github.com/ethereum/go-ethereum v1.10.21/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum/go-ethereum v1.10.23 h1:Xk8XAT4/UuqcjMLIMF+7imjkg32kfVFKoeyQDaO2yWM= +github.com/ethereum/go-ethereum v1.10.23/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= @@ -300,8 +300,9 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-bexpr v0.1.11 h1:6DqdA/KBjurGby9yTY0bmkathya0lfwF2SeuubCI7dY= +github.com/hashicorp/go-bexpr v0.1.11/go.mod h1:f03lAo0duBlDIUMGCuad8oLcgejw4m7U+N8T+6Kz1AE= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -383,8 +384,9 @@ github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH6 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -433,10 +435,12 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -498,6 +502,7 @@ github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssy github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -538,6 +543,9 @@ github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= @@ -576,14 +584,17 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= @@ -647,8 +658,9 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 h1:syTAU9FwmvzEoIYMqcPHOcVm4H3U5u90WsvuYgwpETU= golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -727,8 +739,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -784,8 +797,9 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220701225701-179beb0bd1a1 h1:+Lm8wRwJpsVpTHuM4tHTwgxjPzv/bjxsHt2cW5EY7XU= +golang.org/x/sys v0.0.0-20220701225701-179beb0bd1a1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/op-chain-ops/immutables/immutables.go b/op-chain-ops/immutables/immutables.go index 69cbb810f22d8..e99d0a946ba1e 100644 --- a/op-chain-ops/immutables/immutables.go +++ b/op-chain-ops/immutables/immutables.go @@ -1,36 +1,17 @@ package immutables import ( - "context" "fmt" - "math/big" "github.com/ethereum-optimism/optimism/op-bindings/bindings" "github.com/ethereum-optimism/optimism/op-bindings/predeploys" - + "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/crypto" ) -// testKey is the same test key that geth uses -var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - -// chainID is the chain id used for simulated backends -var chainID = big.NewInt(1337) - -// TODO(tynes): we are planning on making some constructor arguments -// into immutables before the final deployment of the system. This -// means that this struct will need to be updated with an additional -// parameter: Args []interface{}{} and each step will need to typecast -// each argument before doing the simulated deployment -type Deployment struct { - Name string -} - // DeploymentResults represents the output of deploying each of the // contracts so that the immutables can be set properly in the bytecode. type DeploymentResults map[string]hexutil.Bytes @@ -40,7 +21,7 @@ type DeploymentResults map[string]hexutil.Bytes // a JSON file/cli flags and then populate the Deployment // Args. func BuildOptimism() (DeploymentResults, error) { - deployments := []Deployment{ + deployments := []deployer.Constructor{ { Name: "GasPriceOracle", }, @@ -63,81 +44,56 @@ func BuildOptimism() (DeploymentResults, error) { Name: "OptimismMintableERC20Factory", }, } - return Build(deployments) + return BuildL2(deployments) } -// Build will deploy contracts to a simulated backend so that their immutables +// BuildL2 will deploy contracts to a simulated backend so that their immutables // can be properly set. The bytecode returned in the results is suitable to be // inserted into the state via state surgery. -func Build(deployments []Deployment) (DeploymentResults, error) { - backend := backends.NewSimulatedBackend( - core.GenesisAlloc{ - crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)}, - }, - 15000000, - ) - - results := make(DeploymentResults) - - opts, err := bind.NewKeyedTransactorWithChainID(testKey, chainID) +func BuildL2(constructors []deployer.Constructor) (DeploymentResults, error) { + deployments, err := deployer.Deploy(deployer.NewBackend(), constructors, l2Deployer) if err != nil { return nil, err } + results := make(DeploymentResults) + for _, dep := range deployments { + results[dep.Name] = dep.Bytecode + } + return results, nil +} - for _, deployment := range deployments { - var addr common.Address - switch deployment.Name { - case "GasPriceOracle": - // The owner of the gas price oracle is not immutable, not required - // to be set here. It cannot be `address(0)` - owner := common.Address{1} - addr, _, _, err = bindings.DeployGasPriceOracle(opts, backend, owner) - if err != nil { - return nil, err - } - case "L1Block": - // No arguments required for the L1Block contract - addr, _, _, err = bindings.DeployL1Block(opts, backend) - if err != nil { - return nil, err - } - case "L2CrossDomainMessenger": - // The L1CrossDomainMessenger value is not immutable, no need to set - // it here correctly - l1CrossDomainMessenger := common.Address{} - addr, _, _, err = bindings.DeployL2CrossDomainMessenger(opts, backend, l1CrossDomainMessenger) - if err != nil { - return nil, err - } - case "L2StandardBridge": - // The OtherBridge value is not immutable, no need to set - otherBridge := common.Address{} - addr, _, _, err = bindings.DeployL2StandardBridge(opts, backend, otherBridge) - case "L2ToL1MessagePasser": - // No arguments required for L2ToL1MessagePasser - addr, _, _, err = bindings.DeployL2ToL1MessagePasser(opts, backend) - case "SequencerFeeVault": - // No arguments to SequencerFeeVault - addr, _, _, err = bindings.DeploySequencerFeeVault(opts, backend) - case "OptimismMintableERC20Factory": - addr, _, _, err = bindings.DeployOptimismMintableERC20Factory(opts, backend, predeploys.L2StandardBridgeAddr) - default: - return nil, fmt.Errorf("unknown contract: %s", deployment.Name) - } - - backend.Commit() - if addr == (common.Address{}) { - return nil, fmt.Errorf("no address for %s", deployment.Name) - } - code, err := backend.CodeAt(context.Background(), addr, nil) - if len(code) == 0 { - return nil, fmt.Errorf("no code found for %s", deployment.Name) - } - if err != nil { - return nil, fmt.Errorf("cannot fetch code for %s", deployment.Name) - } - results[deployment.Name] = code +func l2Deployer(backend *backends.SimulatedBackend, opts *bind.TransactOpts, deployment deployer.Constructor) (common.Address, error) { + var addr common.Address + var err error + switch deployment.Name { + case "GasPriceOracle": + // The owner of the gas price oracle is not immutable, not required + // to be set here. It cannot be `address(0)` + owner := common.Address{1} + addr, _, _, err = bindings.DeployGasPriceOracle(opts, backend, owner) + case "L1Block": + // No arguments required for the L1Block contract + addr, _, _, err = bindings.DeployL1Block(opts, backend) + case "L2CrossDomainMessenger": + // The L1CrossDomainMessenger value is not immutable, no need to set + // it here correctly + l1CrossDomainMessenger := common.Address{} + addr, _, _, err = bindings.DeployL2CrossDomainMessenger(opts, backend, l1CrossDomainMessenger) + case "L2StandardBridge": + // The OtherBridge value is not immutable, no need to set + otherBridge := common.Address{} + addr, _, _, err = bindings.DeployL2StandardBridge(opts, backend, otherBridge) + case "L2ToL1MessagePasser": + // No arguments required for L2ToL1MessagePasser + addr, _, _, err = bindings.DeployL2ToL1MessagePasser(opts, backend) + case "SequencerFeeVault": + // No arguments to SequencerFeeVault + addr, _, _, err = bindings.DeploySequencerFeeVault(opts, backend) + case "OptimismMintableERC20Factory": + addr, _, _, err = bindings.DeployOptimismMintableERC20Factory(opts, backend, predeploys.L2StandardBridgeAddr) + default: + return addr, fmt.Errorf("unknown contract: %s", deployment.Name) } - return results, nil + return addr, err } diff --git a/op-chain-ops/state/encoding.go b/op-chain-ops/state/encoding.go index 632d74eef95f7..7748adfea9d53 100644 --- a/op-chain-ops/state/encoding.go +++ b/op-chain-ops/state/encoding.go @@ -8,7 +8,7 @@ import ( "regexp" "strings" - "github.com/ethereum-optimism/optimism/op-chain-ops/solc" + "github.com/ethereum-optimism/optimism/op-bindings/solc" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" diff --git a/op-chain-ops/state/state.go b/op-chain-ops/state/state.go index 4c9f5b7dd4b5d..359384aec809f 100644 --- a/op-chain-ops/state/state.go +++ b/op-chain-ops/state/state.go @@ -5,7 +5,7 @@ import ( "fmt" "math/big" - "github.com/ethereum-optimism/optimism/op-chain-ops/solc" + "github.com/ethereum-optimism/optimism/op-bindings/solc" "github.com/ethereum/go-ethereum/common" ) @@ -21,7 +21,7 @@ type EncodedStorage struct { Value common.Hash } -// EncodedStorage will encode a storage layout +// EncodeStorage will encode a storage layout func EncodeStorage(entry solc.StorageLayoutEntry, value any, storageType solc.StorageLayoutType) ([]*EncodedStorage, error) { if storageType.NumberOfBytes > 32 { return nil, fmt.Errorf("%s is larger than 32 bytes", storageType.Encoding) @@ -76,18 +76,21 @@ func ComputeStorageSlots(layout *solc.StorageLayout, values StorageValues) ([]*E // of the produced storage slots have a matching key, if so use a // binary or to add the storage values together func MergeStorage(storage []*EncodedStorage) []*EncodedStorage { - encoded := make(map[common.Hash]common.Hash) + encodedKV := make(map[common.Hash]common.Hash) + var encodedKeys []common.Hash // for deterministic result order for _, storage := range storage { - if prev, ok := encoded[storage.Key]; ok { + if prev, ok := encodedKV[storage.Key]; ok { combined := new(big.Int).Or(prev.Big(), storage.Value.Big()) - encoded[storage.Key] = common.BigToHash(combined) + encodedKV[storage.Key] = common.BigToHash(combined) } else { - encoded[storage.Key] = storage.Value + encodedKV[storage.Key] = storage.Value + encodedKeys = append(encodedKeys, storage.Key) } } results := make([]*EncodedStorage, 0) - for key, val := range encoded { + for _, key := range encodedKeys { + val := encodedKV[key] results = append(results, &EncodedStorage{key, val}) } return results diff --git a/op-chain-ops/state/state_test.go b/op-chain-ops/state/state_test.go index 1d99d690a1062..f596d30276f08 100644 --- a/op-chain-ops/state/state_test.go +++ b/op-chain-ops/state/state_test.go @@ -13,7 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum-optimism/optimism/op-chain-ops/solc" + "github.com/ethereum-optimism/optimism/op-bindings/solc" "github.com/ethereum-optimism/optimism/op-chain-ops/state" "github.com/ethereum-optimism/optimism/op-chain-ops/state/testdata" @@ -276,7 +276,7 @@ func TestMergeStorage(t *testing.T) { for _, test := range cases { got := state.MergeStorage(test.input) - require.Equal(t, got, test.expect) + require.Equal(t, test.expect, got) } } diff --git a/op-chain-ops/state/testdata/contract.go b/op-chain-ops/state/testdata/contract.go index f4c73c08f1e3b..8c526591b7944 100644 --- a/op-chain-ops/state/testdata/contract.go +++ b/op-chain-ops/state/testdata/contract.go @@ -624,4 +624,3 @@ func (_Testdata *TestdataSession) SetStorage(key [32]byte, value [32]byte) (*typ func (_Testdata *TestdataTransactorSession) SetStorage(key [32]byte, value [32]byte) (*types.Transaction, error) { return _Testdata.Contract.SetStorage(&_Testdata.TransactOpts, key, value) } - diff --git a/op-e2e/Makefile b/op-e2e/Makefile index a52fd04c937ac..ea203480b3443 100644 --- a/op-e2e/Makefile +++ b/op-e2e/Makefile @@ -2,7 +2,7 @@ test: go test -v ./... lint: - golangci-lint run -E asciicheck,goimports,misspell ./... + golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint -e "errors.As" -e "errors.Is" .PHONY: \ test \ diff --git a/op-e2e/geth.go b/op-e2e/geth.go index b849e8f3a6811..49591241f4733 100644 --- a/op-e2e/geth.go +++ b/op-e2e/geth.go @@ -8,9 +8,10 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/cmd/utils" rollupEth "github.com/ethereum-optimism/optimism/op-node/eth" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -20,6 +21,7 @@ import ( "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/node" hdwallet "github.com/miguelmota/go-ethereum-hdwallet" @@ -102,7 +104,60 @@ func initL1Geth(cfg *SystemConfig, wallet *hdwallet.Wallet, genesis *core.Genesi HTTPModules: []string{"debug", "admin", "eth", "txpool", "net", "rpc", "web3", "personal", "engine"}, } - return createGethNode(false, nodeConfig, ethConfig, []*ecdsa.PrivateKey{pk}) + l1Node, l1Eth, err := createGethNode(false, nodeConfig, ethConfig, []*ecdsa.PrivateKey{pk}) + if err != nil { + return nil, nil, err + } + + // Clique does not have safe/finalized block info. But we do want to test the usage of that, + // since post-merge L1 has it (incl. Goerli testnet which is already upgraded). So we mock it on top of clique. + l1Node.RegisterLifecycle(&fakeSafeFinalizedL1{ + eth: l1Eth, + // for testing purposes we make it really fast, otherwise we don't see it finalize in short tests + finalizedDistance: 8, + safeDistance: 4, + }) + + return l1Node, l1Eth, nil +} + +type fakeSafeFinalizedL1 struct { + eth *eth.Ethereum + finalizedDistance uint64 + safeDistance uint64 + sub ethereum.Subscription +} + +var _ node.Lifecycle = (*fakeSafeFinalizedL1)(nil) + +func (f *fakeSafeFinalizedL1) Start() error { + headChanges := make(chan core.ChainHeadEvent, 10) + headsSub := f.eth.BlockChain().SubscribeChainHeadEvent(headChanges) + f.sub = event.NewSubscription(func(quit <-chan struct{}) error { + defer headsSub.Unsubscribe() + for { + select { + case head := <-headChanges: + num := head.Block.NumberU64() + if num > f.finalizedDistance { + toFinalize := f.eth.BlockChain().GetBlockByNumber(num - f.finalizedDistance) + f.eth.BlockChain().SetFinalized(toFinalize) + } + if num > f.safeDistance { + toSafe := f.eth.BlockChain().GetBlockByNumber(num - f.safeDistance) + f.eth.BlockChain().SetSafe(toSafe) + } + case <-quit: + return nil + } + } + }) + return nil +} + +func (f *fakeSafeFinalizedL1) Stop() error { + f.sub.Unsubscribe() + return nil } // init a geth node. @@ -163,6 +218,10 @@ func createGethNode(l2 bool, nodeCfg *node.Config, ethCfg *ethconfig.Config, pri } + // PR 25459 changed this to only default in CLI, but not in default programmatic RPC selection. + // PR 25642 fixed it for the mobile version only... + utils.RegisterFilterAPI(n, backend.APIBackend, ethCfg) + n.RegisterAPIs(tracers.APIs(backend.APIBackend)) // Enable catalyst if l2 diff --git a/op-e2e/go.mod b/op-e2e/go.mod index 7f78ca296f454..62e70251525cf 100644 --- a/op-e2e/go.mod +++ b/op-e2e/go.mod @@ -3,12 +3,12 @@ module github.com/ethereum-optimism/optimism/op-e2e go 1.18 require ( - github.com/ethereum-optimism/optimism/op-batcher v0.5.0 - github.com/ethereum-optimism/optimism/op-bindings v0.5.0 - github.com/ethereum-optimism/optimism/op-node v0.5.0 - github.com/ethereum-optimism/optimism/op-proposer v0.5.0 - github.com/ethereum-optimism/optimism/op-service v0.5.0 - github.com/ethereum/go-ethereum v1.10.21 + github.com/ethereum-optimism/optimism/op-batcher v0.8.6 + github.com/ethereum-optimism/optimism/op-bindings v0.8.6 + github.com/ethereum-optimism/optimism/op-node v0.8.6 + github.com/ethereum-optimism/optimism/op-proposer v0.8.6 + github.com/ethereum-optimism/optimism/op-service v0.8.6 + github.com/ethereum/go-ethereum v1.10.23 github.com/libp2p/go-libp2p v0.21.0 github.com/libp2p/go-libp2p-core v0.19.1 github.com/miguelmota/go-ethereum-hdwallet v0.1.1 @@ -31,6 +31,7 @@ require ( github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/docker/go-units v0.4.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/elastic/gosigar v0.14.2 // indirect @@ -47,6 +48,7 @@ require ( github.com/google/gopacket v1.1.19 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/graph-gophers/graphql-go v1.3.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.11 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -54,6 +56,9 @@ require ( github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.0 // indirect github.com/huin/goupnp v1.0.3 // indirect + github.com/influxdata/influxdb v1.8.3 // indirect + github.com/influxdata/influxdb-client-go/v2 v2.4.0 // indirect + github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/ipfs/go-cid v0.2.0 // indirect github.com/ipfs/go-datastore v0.5.1 // indirect github.com/ipfs/go-ds-leveldb v0.5.0 // indirect @@ -105,6 +110,7 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/opencontainers/runtime-spec v1.0.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.13.0 // indirect @@ -144,8 +150,9 @@ require ( golang.org/x/tools v0.1.12 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.1.7 // indirect ) -replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 +replace github.com/ethereum/go-ethereum v1.10.23 => github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 diff --git a/op-e2e/go.sum b/op-e2e/go.sum index b26d738e0a7ee..b1d719b430487 100644 --- a/op-e2e/go.sum +++ b/op-e2e/go.sum @@ -185,6 +185,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -201,6 +202,9 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= github.com/dgraph-io/ristretto v0.0.2 h1:a5WaUrDa0qm0YrAAS1tUykT5El3kt62KNZZeMxQn3po= @@ -211,6 +215,7 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.6.2 h1:HlFGsy+9/xrgMmhmN+NGhCc5SHGJ7I+kHosRR1xc/aI= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= @@ -234,18 +239,18 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 h1:+WfrwiRELp3hoeb1bnPws3FtUUoYCDDYsCkwvKek5FY= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= -github.com/ethereum-optimism/optimism/op-batcher v0.5.0 h1:sIw56V3ulh8Eg09COZqQ0TE+xBNB7n+1YnkXK/x2ias= -github.com/ethereum-optimism/optimism/op-batcher v0.5.0/go.mod h1:tWJefz5ZSwsob03aMyuL73Snn0S202V3kFrSXvsyNss= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0 h1:bJT8KmDu5YAVOqPQHxHkntGlRrtRdTIsH+X28LOIcqU= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0/go.mod h1:Ft+sL57mlBysH6nuXZA11GLMMajfBa8SjpEBtitl1Vw= -github.com/ethereum-optimism/optimism/op-node v0.5.0 h1:MwNvYDBFS4quSWkEzfJBGJkzI1yveqQ/GuVK6aTJJ0A= -github.com/ethereum-optimism/optimism/op-node v0.5.0/go.mod h1:jzsaU998O9OISO7ybwpKKm01pQZFpydRPSXP9+U8MYA= -github.com/ethereum-optimism/optimism/op-proposer v0.5.0 h1:GHU2ldpH22/Nv8ZwLmoR5tQChm1yYzoMuExKlb4EazM= -github.com/ethereum-optimism/optimism/op-proposer v0.5.0/go.mod h1:WgjPZHTHuiFoA0rATQJ2vCr7sbM/NgdvJMeCfkh2YIY= -github.com/ethereum-optimism/optimism/op-service v0.5.0 h1:D0OyBbRGttT3geECT935W4DPhbVAibPWZAayWpEd+e4= -github.com/ethereum-optimism/optimism/op-service v0.5.0/go.mod h1:otr/BXzgcZmJKUl18v+WLJjtWoIwqoJ/L0/cNvIIkUs= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 h1:W/ZU6BZH7ilTrpdoJOF9N4OReqXbpeRtUB6klIpEdMA= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= +github.com/ethereum-optimism/optimism/op-batcher v0.8.6 h1:phRqDO8qUIzJzRYt4+ZivSQx4gENeVcTiHY7wj4TnN4= +github.com/ethereum-optimism/optimism/op-batcher v0.8.6/go.mod h1:Ghz9Ilox6Ca5TjJAroZVheCleE5a/Ek4qjlW1yULb+A= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6 h1:jJYhmygt7hqGzYa+8sme9SdnKt1c3Y6EbWgIrRONoxw= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6/go.mod h1:gUX5317IAvRMjB4GftayM87JVln3DTqukfirwJpEWnE= +github.com/ethereum-optimism/optimism/op-node v0.8.6 h1:xNwN+Q/Rt17vSKawhBeG9qTcqcyh8JU8PGjK1iuGkF4= +github.com/ethereum-optimism/optimism/op-node v0.8.6/go.mod h1:gkyzgVHV3+tIhLZ8GhT+bL9GrrmouQCW4mKYukS0SHg= +github.com/ethereum-optimism/optimism/op-proposer v0.8.6 h1:iy8XAtkvrURBy3TT2Lf540cbWztxit7K4+BghZ4IsMI= +github.com/ethereum-optimism/optimism/op-proposer v0.8.6/go.mod h1:tuCLnXcO4MrtVyis1Yfo7wtL8EQta1u6zFdzHHj+RAc= +github.com/ethereum-optimism/optimism/op-service v0.8.6 h1:ruZp/BxL8TGn1y9EJmygypPTeVAFlAA0A/h8LsCoV+M= +github.com/ethereum-optimism/optimism/op-service v0.8.6/go.mod h1:gm8YNzERrL/CHBPWx3+01mR/NOVpLLw4GEUSnnTdyFU= github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -266,10 +271,13 @@ github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmV github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -288,6 +296,8 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -349,6 +359,7 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -395,11 +406,14 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -454,10 +468,16 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= +github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= @@ -521,6 +541,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= @@ -558,6 +579,8 @@ github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= @@ -695,6 +718,8 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= @@ -709,9 +734,13 @@ github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKA github.com/marten-seemann/qtls-go1-19 v0.1.0-beta.1 h1:7m/WlWcSROrcK5NxuXaxYD32BZqe/LEEnBrWcH/cOqQ= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= @@ -720,6 +749,9 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -893,6 +925,7 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= @@ -1080,6 +1113,9 @@ github.com/urfave/cli v1.22.9/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/cli/v2 v2.11.1 h1:UKK6SP7fV3eKOefbS87iT9YHefv7iB/53ih6e+GNAsE= github.com/urfave/cli/v2 v2.11.1/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= @@ -1162,6 +1198,8 @@ golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= @@ -1315,6 +1353,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1348,6 +1387,7 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1392,6 +1432,7 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -1400,6 +1441,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ= golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/op-e2e/setup.go b/op-e2e/setup.go index e3d436bcdc95b..e2ae888e2d48f 100644 --- a/op-e2e/setup.go +++ b/op-e2e/setup.go @@ -281,8 +281,10 @@ func (cfg SystemConfig) start() (*System, error) { MergeNetsplitBlock: common.Big0, TerminalTotalDifficulty: common.Big0, Optimism: ¶ms.OptimismConfig{ - BaseFeeRecipient: cfg.BaseFeeRecipient, - L1FeeRecipient: cfg.L1FeeRecipient, + BaseFeeRecipient: cfg.BaseFeeRecipient, + L1FeeRecipient: cfg.L1FeeRecipient, + EIP1559Elasticity: 2, + EIP1559Denominator: 8, }, }, Alloc: l2Alloc, diff --git a/op-e2e/system_test.go b/op-e2e/system_test.go index 20343584d4a64..fe28dbc711673 100644 --- a/op-e2e/system_test.go +++ b/op-e2e/system_test.go @@ -45,7 +45,7 @@ var _ = func() bool { var verboseGethNodes bool func init() { - flag.BoolVar(&verboseGethNodes, "gethlogs", false, "Enable logs on geth nodes") + flag.BoolVar(&verboseGethNodes, "gethlogs", true, "Enable logs on geth nodes") flag.Parse() } @@ -110,6 +110,7 @@ func defaultSystemConfig(t *testing.T) SystemConfig { SequencerConfDepth: 0, SequencerEnabled: false, }, + L1EpochPollInterval: time.Second * 4, }, "sequencer": { Driver: driver.Config{ @@ -123,6 +124,7 @@ func defaultSystemConfig(t *testing.T) SystemConfig { ListenPort: 9093, EnableAdmin: true, }, + L1EpochPollInterval: time.Second * 4, }, }, Loggers: map[string]log.Logger{ @@ -135,7 +137,7 @@ func defaultSystemConfig(t *testing.T) SystemConfig { BlockTime: 1, MaxSequencerDrift: 10, SeqWindowSize: 30, - ChannelTimeout: 20, + ChannelTimeout: 10, L1ChainID: big.NewInt(900), L2ChainID: big.NewInt(901), // TODO pick defaults diff --git a/op-node/Makefile b/op-node/Makefile index 9be5a54d8b046..88acc9cda5f31 100644 --- a/op-node/Makefile +++ b/op-node/Makefile @@ -18,11 +18,12 @@ test: go test -v ./... lint: - golangci-lint run -E asciicheck,goimports,misspell ./... + golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint -e "errors.As" -e "errors.Is" fuzz: go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadUnmarshal ./eth go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzExecutionPayloadMarshalUnmarshal ./eth + go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzOBP01 ./eth go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoRoundTrip ./rollup/derive go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzL1InfoAgainstContract ./rollup/derive go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzUnmarshallLogEvent ./rollup/derive diff --git a/op-node/cmd/genesis/cmd.go b/op-node/cmd/genesis/cmd.go index cf5fb8e76b1bb..4228e9d21dc41 100644 --- a/op-node/cmd/genesis/cmd.go +++ b/op-node/cmd/genesis/cmd.go @@ -1,148 +1,217 @@ package genesis import ( + "context" "encoding/json" - "fmt" + "errors" + "math/big" "os" - "strings" + "path/filepath" + + "github.com/ethereum-optimism/optimism/op-bindings/hardhat" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/ethereum-optimism/optimism/op-bindings/predeploys" + "github.com/ethereum-optimism/optimism/op-node/eth" + "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/urfave/cli" "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" - "github.com/ethereum-optimism/optimism/op-chain-ops/hardhat" - "github.com/ethereum/go-ethereum/log" - - "github.com/ethereum/go-ethereum/ethclient" ) var Subcommands = cli.Commands{ { - Name: "devnet-l2", - Usage: "Initialized a new L2 devnet genesis file", + Name: "devnet", + Usage: "Initialize new L1 and L2 genesis files and rollup config suitable for a local devnet", Flags: []cli.Flag{ cli.StringFlag{ - Name: "artifacts", - Usage: "Comma delimeted list of hardhat artifact directories", - }, - cli.StringFlag{ - Name: "network", - Usage: "Name of hardhat deploy network", - }, - cli.StringFlag{ - Name: "deployments", - Usage: "Comma delimated list of hardhat deploy artifact directories", + Name: "deploy-config", + Usage: "Path to hardhat deploy config file", }, cli.StringFlag{ - Name: "deploy-config", - Usage: "Path to hardhat deploy config directory", + Name: "outfile.l1", + Usage: "Path to L1 genesis output file", }, cli.StringFlag{ - Name: "rpc-url", - Usage: "L1 RPC URL", + Name: "outfile.l2", + Usage: "Path to L2 genesis output file", }, cli.StringFlag{ - Name: "outfile", - Usage: "Path to file to write output to", + Name: "outfile.rollup", + Usage: "Path to rollup output file", }, }, Action: func(ctx *cli.Context) error { - // Turn off logging for this command unless it is a critical - // error so that the output can be piped to jq - log.Root().SetHandler( - log.LvlFilterHandler( - log.LvlCrit, - log.StreamHandler(os.Stdout, log.TerminalFormat(true)), - ), - ) - - artifact := ctx.String("artifacts") - artifacts := strings.Split(artifact, ",") - deployment := ctx.String("deployments") - deployments := strings.Split(deployment, ",") - network := ctx.String("network") - hh, err := hardhat.New(network, artifacts, deployments) - if err != nil { - return err - } - deployConfig := ctx.String("deploy-config") - config, err := genesis.NewDeployConfigWithNetwork(network, deployConfig) + config, err := genesis.NewDeployConfig(deployConfig) if err != nil { return err } - rpcUrl := ctx.String("rpc-url") - client, err := ethclient.Dial(rpcUrl) + l1Genesis, err := genesis.BuildL1DeveloperGenesis(config) if err != nil { return err } - gen, err := genesis.BuildOptimismDeveloperGenesis(hh, config, client) + l1StartBlock := l1Genesis.ToBlock() + l2Addrs := &genesis.L2Addresses{ + ProxyAdmin: predeploys.DevProxyAdminAddr, + L1StandardBridgeProxy: predeploys.DevL1StandardBridgeAddr, + L1CrossDomainMessengerProxy: predeploys.DevL1CrossDomainMessengerAddr, + } + l2Genesis, err := genesis.BuildL2DeveloperGenesis(config, l1StartBlock, l2Addrs) if err != nil { return err } - file, err := json.MarshalIndent(gen, "", " ") - if err != nil { + rollupConfig := makeRollupConfig(config, l1StartBlock, l2Genesis, predeploys.DevOptimismPortalAddr) + + if err := writeGenesisFile(ctx.String("outfile.l1"), l1Genesis); err != nil { return err } - - outfile := ctx.String("outfile") - if outfile == "" { - fmt.Println(string(file)) - } else { - if err := os.WriteFile(outfile, file, 0644); err != nil { - return err - } + if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil { + return err } - return nil + return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig) }, }, { - Name: "devnet-l1", - Usage: "Initialized a new L1 devnet genesis file", + Name: "l2", + Usage: "Generates an L2 genesis file and rollup config suitable for a deployed network", Flags: []cli.Flag{ cli.StringFlag{ - Name: "network", - Usage: "Name of hardhat deploy network", + Name: "l1-rpc", + Usage: "L1 RPC URL", }, cli.StringFlag{ Name: "deploy-config", - Usage: "Path to hardhat deploy config directory", + Usage: "Path to hardhat deploy config file", }, cli.StringFlag{ - Name: "outfile", - Usage: "Path to file to write output to", + Name: "deployment-dir", + Usage: "Path to deployment directory", + }, + cli.StringFlag{ + Name: "outfile.l2", + Usage: "Path to L2 genesis output file", + }, + cli.StringFlag{ + Name: "outfile.rollup", + Usage: "Path to rollup output file", }, }, Action: func(ctx *cli.Context) error { - network := ctx.String("network") deployConfig := ctx.String("deploy-config") + config, err := genesis.NewDeployConfig(deployConfig) + if err != nil { + return err + } - config, err := genesis.NewDeployConfigWithNetwork(network, deployConfig) + if config.L1StartingBlockTag == nil { + return errors.New("must specify a starting block tag in genesis") + } + + client, err := ethclient.Dial(ctx.String("l1-rpc")) if err != nil { return err } - gen, err := genesis.BuildL1DeveloperGenesis(config) + var l1StartBlock *types.Block + if config.L1StartingBlockTag.BlockHash != nil { + l1StartBlock, err = client.BlockByHash(context.Background(), *config.L1StartingBlockTag.BlockHash) + } else if config.L1StartingBlockTag.BlockNumber != nil { + l1StartBlock, err = client.BlockByNumber(context.Background(), big.NewInt(config.L1StartingBlockTag.BlockNumber.Int64())) + } if err != nil { return err } - file, err := json.MarshalIndent(gen, "", " ") + depPath, network := filepath.Split(ctx.String("deployment-dir")) + hh, err := hardhat.New(network, nil, []string{depPath}) if err != nil { return err } - outfile := ctx.String("outfile") - if outfile == "" { - fmt.Println(string(file)) - } else { - if err := os.WriteFile(outfile, file, 0644); err != nil { - return err - } + proxyAdmin, err := hh.GetDeployment("ProxyAdmin") + if err != nil { + return err } - return nil + l1SBP, err := hh.GetDeployment("L1StandardBridgeProxy") + if err != nil { + return err + } + l1XDMP, err := hh.GetDeployment("L1CrossDomainMessengerProxy") + if err != nil { + return err + } + portalProxy, err := hh.GetDeployment("OptimismPortalProxy") + if err != nil { + return err + } + l2Addrs := &genesis.L2Addresses{ + ProxyAdmin: proxyAdmin.Address, + L1StandardBridgeProxy: l1SBP.Address, + L1CrossDomainMessengerProxy: l1XDMP.Address, + } + l2Genesis, err := genesis.BuildL2DeveloperGenesis(config, l1StartBlock, l2Addrs) + if err != nil { + return err + } + + rollupConfig := makeRollupConfig(config, l1StartBlock, l2Genesis, portalProxy.Address) + + if err := writeGenesisFile(ctx.String("outfile.l2"), l2Genesis); err != nil { + return err + } + return writeGenesisFile(ctx.String("outfile.rollup"), rollupConfig) }, }, } + +func makeRollupConfig( + config *genesis.DeployConfig, + l1StartBlock *types.Block, + l2Genesis *core.Genesis, + portalAddr common.Address, +) *rollup.Config { + return &rollup.Config{ + Genesis: rollup.Genesis{ + L1: eth.BlockID{ + Hash: l1StartBlock.Hash(), + Number: 0, + }, + L2: eth.BlockID{ + Hash: l2Genesis.ToBlock().Hash(), + Number: 0, + }, + L2Time: l1StartBlock.Time(), + }, + BlockTime: config.L2BlockTime, + MaxSequencerDrift: config.MaxSequencerDrift, + SeqWindowSize: config.SequencerWindowSize, + ChannelTimeout: config.ChannelTimeout, + L1ChainID: new(big.Int).SetUint64(config.L1ChainID), + L2ChainID: new(big.Int).SetUint64(config.L2ChainID), + P2PSequencerAddress: config.P2PSequencerAddress, + FeeRecipientAddress: config.OptimismL2FeeRecipient, + BatchInboxAddress: config.BatchInboxAddress, + BatchSenderAddress: config.BatchSenderAddress, + DepositContractAddress: portalAddr, + } +} + +func writeGenesisFile(outfile string, input interface{}) error { + f, err := os.OpenFile(outfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755) + if err != nil { + return err + } + defer f.Close() + + enc := json.NewEncoder(f) + enc.SetIndent("", " ") + return enc.Encode(input) +} diff --git a/op-node/cmd/p2p/cmd.go b/op-node/cmd/p2p/cmd.go index e947935d4b7a9..8314ea4d11dd2 100644 --- a/op-node/cmd/p2p/cmd.go +++ b/op-node/cmd/p2p/cmd.go @@ -16,7 +16,7 @@ import ( func Priv2PeerID(r io.Reader) (string, error) { b, err := readHexData(r) if err != nil { - return "", nil + return "", err } p, err := crypto.UnmarshalSecp256k1PrivateKey(b) @@ -34,7 +34,7 @@ func Priv2PeerID(r io.Reader) (string, error) { func Pub2PeerID(r io.Reader) (string, error) { b, err := readHexData(r) if err != nil { - return "", nil + return "", err } p, err := crypto.UnmarshalSecp256k1PublicKey(b) diff --git a/op-node/cmd/p2p/cmd_test.go b/op-node/cmd/p2p/cmd_test.go index c2acd8beb2e87..8d900b4d95e02 100644 --- a/op-node/cmd/p2p/cmd_test.go +++ b/op-node/cmd/p2p/cmd_test.go @@ -32,4 +32,8 @@ func TestPrivPub2PeerID(t *testing.T) { require.NoError(t, err) require.Equal(t, pubPidLib.String(), pubPidImpl) }) + t.Run("with bad hex", func(t *testing.T) { + _, err := Priv2PeerID(bytes.NewReader([]byte("I am not hex."))) + require.Error(t, err) + }) } diff --git a/op-node/eth/account_proof.go b/op-node/eth/account_proof.go index d0703b075ede5..75765aa39cd9a 100644 --- a/op-node/eth/account_proof.go +++ b/op-node/eth/account_proof.go @@ -30,7 +30,7 @@ func (res *AccountResult) Verify(stateRoot common.Hash) error { accountClaimed := []interface{}{uint64(res.Nonce), (*big.Int)(res.Balance).Bytes(), res.StorageHash, res.CodeHash} accountClaimedValue, err := rlp.EncodeToBytes(accountClaimed) if err != nil { - return fmt.Errorf("failed to encode account from retrieved values: %v", err) + return fmt.Errorf("failed to encode account from retrieved values: %w", err) } // create a db with all trie nodes @@ -38,7 +38,7 @@ func (res *AccountResult) Verify(stateRoot common.Hash) error { for i, encodedNode := range res.AccountProof { nodeKey := crypto.Keccak256(encodedNode) if err := db.Put(nodeKey, encodedNode); err != nil { - return fmt.Errorf("failed to load proof value %d into mem db: %v", i, err) + return fmt.Errorf("failed to load proof value %d into mem db: %w", i, err) } } @@ -54,7 +54,7 @@ func (res *AccountResult) Verify(stateRoot common.Hash) error { // now get the full value from the account proof, and check that it matches the JSON contents accountProofValue, err := proofTrie.TryGet(key[:]) if err != nil { - return fmt.Errorf("failed to retrieve account value: %v", err) + return fmt.Errorf("failed to retrieve account value: %w", err) } if !bytes.Equal(accountClaimedValue, accountProofValue) { diff --git a/op-node/eth/heads.go b/op-node/eth/heads.go index 125cb8759b316..af92990f0f1d6 100644 --- a/op-node/eth/heads.go +++ b/op-node/eth/heads.go @@ -2,10 +2,12 @@ package eth import ( "context" + "time" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" ) // HeadSignalFn is used as callback function to accept head-signals @@ -43,3 +45,40 @@ func WatchHeadChanges(ctx context.Context, src NewHeadSource, fn HeadSignalFn) ( } }), nil } + +type L1BlockRefsSource interface { + L1BlockRefByLabel(ctx context.Context, label BlockLabel) (L1BlockRef, error) +} + +// PollBlockChanges opens a polling loop to fetch the L1 block reference with the given label, +// on provided interval and with request timeout. Results are returned with provided callback fn, +// which may block to pause/back-pressure polling. +func PollBlockChanges(ctx context.Context, log log.Logger, src L1BlockRefsSource, fn HeadSignalFn, + label BlockLabel, interval time.Duration, timeout time.Duration) ethereum.Subscription { + return event.NewSubscription(func(quit <-chan struct{}) error { + if interval <= 0 { + log.Warn("polling of block is disabled", "interval", interval, "label", label) + <-quit + return nil + } + ticker := time.NewTicker(interval) + defer ticker.Stop() + for { + select { + case <-ticker.C: + reqCtx, reqCancel := context.WithTimeout(ctx, timeout) + ref, err := src.L1BlockRefByLabel(reqCtx, label) + reqCancel() + if err != nil { + log.Warn("failed to poll L1 block", "label", label, "err", err) + } else { + fn(ctx, ref) + } + case <-ctx.Done(): + return ctx.Err() + case <-quit: + return nil + } + } + }) +} diff --git a/op-node/eth/ssz.go b/op-node/eth/ssz.go index 7d6eca93a8344..834aa8c8a72fc 100644 --- a/op-node/eth/ssz.go +++ b/op-node/eth/ssz.go @@ -2,6 +2,7 @@ package eth import ( "encoding/binary" + "errors" "fmt" "io" "sync" @@ -24,6 +25,8 @@ var payloadBufPool = sync.Pool{New: func() any { return &x }} +var ErrBadTransactionOffset = errors.New("transactions offset is smaller than extra data offset, aborting") + func (payload *ExecutionPayload) SizeSSZ() (full uint32) { full = executionPayloadFixedPart + uint32(len(payload.ExtraData)) // One offset to each transaction @@ -166,6 +169,9 @@ func (payload *ExecutionPayload) UnmarshalSSZ(scope uint32, r io.Reader) error { copy(payload.BlockHash[:], buf[offset:offset+32]) offset += 32 transactionsOffset := binary.LittleEndian.Uint32(buf[offset : offset+4]) + if transactionsOffset < extraDataOffset { + return ErrBadTransactionOffset + } offset += 4 if offset != executionPayloadFixedPart { panic("fixed part size is inconsistent") @@ -178,7 +184,7 @@ func (payload *ExecutionPayload) UnmarshalSSZ(scope uint32, r io.Reader) error { copy(payload.ExtraData, buf[extraDataOffset:transactionsOffset]) txs, err := unmarshalTransactions(buf[transactionsOffset:]) if err != nil { - return fmt.Errorf("failed to unmarshal transactions list: %v", err) + return fmt.Errorf("failed to unmarshal transactions list: %w", err) } payload.Transactions = txs return nil diff --git a/op-node/eth/ssz_test.go b/op-node/eth/ssz_test.go index 3682e4e8eb336..f6627b8ea8241 100644 --- a/op-node/eth/ssz_test.go +++ b/op-node/eth/ssz_test.go @@ -5,6 +5,8 @@ import ( "encoding/binary" "testing" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum/common" "github.com/google/go-cmp/cmp" ) @@ -78,3 +80,47 @@ func FuzzExecutionPayloadMarshalUnmarshal(f *testing.F) { } }) } + +func FuzzOBP01(f *testing.F) { + payload := &ExecutionPayload{ + ExtraData: make([]byte, 32), + } + var buf bytes.Buffer + _, err := payload.MarshalSSZ(&buf) + require.NoError(f, err) + data := buf.Bytes() + + f.Fuzz(func(t *testing.T, edOffset uint32, txOffset uint32) { + clone := make([]byte, len(data)) + copy(clone, data) + + binary.LittleEndian.PutUint32(clone[436:440], edOffset) + binary.LittleEndian.PutUint32(clone[504:508], txOffset) + + var unmarshalled ExecutionPayload + err = unmarshalled.UnmarshalSSZ(uint32(len(clone)), bytes.NewReader(clone)) + if err == nil { + t.Fatalf("expected a failure, but didn't get one") + } + }) +} + +// TestOPB01 verifies that the SSZ unmarshaling code +// properly checks for the transactionOffset being larger +// than the extraDataOffset. +func TestOPB01(t *testing.T) { + payload := &ExecutionPayload{ + ExtraData: make([]byte, 32), + } + var buf bytes.Buffer + _, err := payload.MarshalSSZ(&buf) + require.NoError(t, err) + data := buf.Bytes() + + // transactions offset is set between indices 504 and 508 + copy(data[504:508], make([]byte, 4)) + + var unmarshalled ExecutionPayload + err = unmarshalled.UnmarshalSSZ(uint32(len(data)), bytes.NewReader(data)) + require.Equal(t, ErrBadTransactionOffset, err) +} diff --git a/op-node/eth/types.go b/op-node/eth/types.go index 58073e80ade6d..17b9201f02e11 100644 --- a/op-node/eth/types.go +++ b/op-node/eth/types.go @@ -20,9 +20,33 @@ import ( type ErrorCode int const ( - UnavailablePayload ErrorCode = -32001 + UnknownPayload ErrorCode = -32001 // Payload does not exist / is not available. + InvalidForkchoiceState ErrorCode = -38002 // Forkchoice state is invalid / inconsistent. + InvalidPayloadAttributes ErrorCode = -38003 // Payload attributes are invalid / inconsistent. ) +// InputError distinguishes an user-input error from regular rpc errors, +// to help the (Engine) API user divert from accidental input mistakes. +type InputError struct { + Inner error + Code ErrorCode +} + +func (ie InputError) Error() string { + return fmt.Sprintf("input error %d: %s", ie.Code, ie.Inner.Error()) +} + +func (ie InputError) Unwrap() error { + return ie.Inner +} + +// Is checks if the error is the given target type. +// Any type of InputError counts, regardless of code. +func (ie InputError) Is(target error) bool { + _, ok := target.(InputError) + return ok // we implement Unwrap, so we do not have to check the inner type now +} + type Bytes32 [32]byte func (b *Bytes32) UnmarshalJSON(text []byte) error { @@ -177,7 +201,7 @@ func BlockAsPayload(bl *types.Block) (*ExecutionPayload, error) { for i, tx := range bl.Transactions() { otx, err := tx.MarshalBinary() if err != nil { - return nil, fmt.Errorf("tx %d failed to marshal: %v", i, err) + return nil, fmt.Errorf("tx %d failed to marshal: %w", i, err) } opaqueTxs[i] = otx } diff --git a/op-node/eth/types_test.go b/op-node/eth/types_test.go new file mode 100644 index 0000000000000..895cd34acac37 --- /dev/null +++ b/op-node/eth/types_test.go @@ -0,0 +1,20 @@ +package eth + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestInputError(t *testing.T) { + err := InputError{ + Inner: errors.New("test error"), + Code: InvalidForkchoiceState, + } + var x InputError + if !errors.As(err, &x) { + t.Fatalf("need InputError to be detected as such") + } + require.ErrorIs(t, err, InputError{}, "need to detect input error with errors.Is") +} diff --git a/op-node/flags/flags.go b/op-node/flags/flags.go index 2677a16dac0ef..ac0879779df95 100644 --- a/op-node/flags/flags.go +++ b/op-node/flags/flags.go @@ -2,6 +2,7 @@ package flags import ( "fmt" + "time" "github.com/urfave/cli" ) @@ -81,6 +82,13 @@ var ( Required: false, Value: 4, } + L1EpochPollIntervalFlag = cli.DurationFlag{ + Name: "l1.epoch-poll-interval", + Usage: "Poll interval for retrieving new L1 epoch updates such as safe and finalized block changes. Disabled if 0 or negative.", + EnvVar: prefixEnvVar("L1_EPOCH_POLL_INTERVAL"), + Required: false, + Value: time.Second * 12 * 32, + } LogLevelFlag = cli.StringFlag{ Name: "log.level", Usage: "The lowest log level that will be output", @@ -154,6 +162,7 @@ var optionalFlags = append([]cli.Flag{ VerifierL1Confs, SequencerEnabledFlag, SequencerL1Confs, + L1EpochPollIntervalFlag, LogLevelFlag, LogFormatFlag, LogColorFlag, diff --git a/op-node/go.mod b/op-node/go.mod index aa695939b146a..98d77fafca463 100644 --- a/op-node/go.mod +++ b/op-node/go.mod @@ -5,9 +5,9 @@ go 1.18 require ( github.com/btcsuite/btcd/btcec/v2 v2.2.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 - github.com/ethereum-optimism/optimism/op-bindings v0.5.0 - github.com/ethereum-optimism/optimism/op-chain-ops v0.0.0-20220822214343-2106bdb7fc11 - github.com/ethereum/go-ethereum v1.10.21 + github.com/ethereum-optimism/optimism/op-bindings v0.8.6 + github.com/ethereum-optimism/optimism/op-chain-ops v0.8.6 + github.com/ethereum/go-ethereum v1.10.23 github.com/golang/snappy v0.0.4 github.com/google/go-cmp v0.5.8 github.com/hashicorp/go-multierror v1.1.1 @@ -72,7 +72,7 @@ require ( github.com/klauspost/compress v1.15.1 // indirect github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/koron/go-ssdp v0.0.3 // indirect - github.com/kr/pretty v0.3.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-eventbus v0.2.1 // indirect @@ -127,7 +127,6 @@ require ( github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.3.4 // indirect github.com/rjeczalik/notify v0.9.2 // indirect - github.com/rogpeppe/go-internal v1.8.1 // indirect github.com/rs/cors v1.8.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect @@ -160,4 +159,4 @@ require ( lukechampine.com/blake3 v1.1.7 // indirect ) -replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 +replace github.com/ethereum/go-ethereum v1.10.23 => github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 diff --git a/op-node/go.sum b/op-node/go.sum index e77bb69091e78..ed770f0dd7dca 100644 --- a/op-node/go.sum +++ b/op-node/go.sum @@ -188,12 +188,12 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 h1:+WfrwiRELp3hoeb1bnPws3FtUUoYCDDYsCkwvKek5FY= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0 h1:bJT8KmDu5YAVOqPQHxHkntGlRrtRdTIsH+X28LOIcqU= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0/go.mod h1:Ft+sL57mlBysH6nuXZA11GLMMajfBa8SjpEBtitl1Vw= -github.com/ethereum-optimism/optimism/op-chain-ops v0.0.0-20220822214343-2106bdb7fc11 h1:be6PccBLLuTZZKC9FuwArNjMVX8R83TCnwknncWJqQw= -github.com/ethereum-optimism/optimism/op-chain-ops v0.0.0-20220822214343-2106bdb7fc11/go.mod h1:D+q1th05BC1WA2kq3yyRxYiF8ZwQUbhNA2iwbG8qODE= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 h1:W/ZU6BZH7ilTrpdoJOF9N4OReqXbpeRtUB6klIpEdMA= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6 h1:jJYhmygt7hqGzYa+8sme9SdnKt1c3Y6EbWgIrRONoxw= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6/go.mod h1:gUX5317IAvRMjB4GftayM87JVln3DTqukfirwJpEWnE= +github.com/ethereum-optimism/optimism/op-chain-ops v0.8.6 h1:tNGW3gztoIx2t+z64wAkDIvsUpvc468Y8IG9K4/hAKk= +github.com/ethereum-optimism/optimism/op-chain-ops v0.8.6/go.mod h1:RZ0R4dy/F/bMbKlDef7k1oSiD4BEx9GmwXYtnmx7mEk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -466,7 +466,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -798,7 +797,6 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -864,9 +862,7 @@ github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= diff --git a/op-node/metrics/metrics.go b/op-node/metrics/metrics.go index 0c9cd16fdc232..2051b03ff6fc5 100644 --- a/op-node/metrics/metrics.go +++ b/op-node/metrics/metrics.go @@ -52,6 +52,9 @@ type Metrics struct { SequencingErrors *EventMetrics PublishingErrors *EventMetrics + UnsafePayloadsBufferLen prometheus.Gauge + UnsafePayloadsBufferMemSize prometheus.Gauge + RefsNumber *prometheus.GaugeVec RefsTime *prometheus.GaugeVec RefsHash *prometheus.GaugeVec @@ -150,6 +153,17 @@ func NewMetrics(procName string) *Metrics { SequencingErrors: NewEventMetrics(registry, ns, "sequencing_errors", "sequencing errors"), PublishingErrors: NewEventMetrics(registry, ns, "publishing_errors", "p2p publishing errors"), + UnsafePayloadsBufferLen: promauto.With(registry).NewGauge(prometheus.GaugeOpts{ + Namespace: ns, + Name: "unsafe_payloads_buffer_len", + Help: "Number of buffered L2 unsafe payloads", + }), + UnsafePayloadsBufferMemSize: promauto.With(registry).NewGauge(prometheus.GaugeOpts{ + Namespace: ns, + Name: "unsafe_payloads_buffer_mem_size", + Help: "Total estimated memory size of buffered L2 unsafe payloads", + }), + RefsNumber: promauto.With(registry).NewGaugeVec(prometheus.GaugeOpts{ Namespace: ns, Name: "refs_number", @@ -321,6 +335,12 @@ func (m *Metrics) RecordL2Ref(name string, ref eth.L2BlockRef) { m.RefsSeqNr.WithLabelValues(name).Set(float64(ref.SequenceNumber)) } +func (m *Metrics) RecordUnsafePayloadsBuffer(length uint64, memSize uint64, next eth.BlockID) { + m.recordRef("l2", "l2_buffer_unsafe", next.Number, 0, next.Hash) + m.UnsafePayloadsBufferLen.Set(float64(length)) + m.UnsafePayloadsBufferMemSize.Set(float64(memSize)) +} + func (m *Metrics) CountSequencedTxs(count int) { m.TransactionsSequencedTotal.Add(float64(count)) } diff --git a/op-node/node/client.go b/op-node/node/client.go index f5b7e3d1f8686..ebf4f6c404ca4 100644 --- a/op-node/node/client.go +++ b/op-node/node/client.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum-optimism/optimism/op-node/backoff" "github.com/ethereum/go-ethereum/log" + gn "github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/rpc" ) @@ -43,7 +44,7 @@ func (cfg *L2EndpointConfig) Setup(ctx context.Context, log log.Logger) (*rpc.Cl if err := cfg.Check(); err != nil { return nil, err } - auth := rpc.NewJWTAuthProvider(cfg.L2EngineJWTSecret) + auth := rpc.WithHTTPAuth(gn.NewJWTAuth(cfg.L2EngineJWTSecret)) l2Node, err := dialRPCClientWithBackoff(ctx, log, cfg.L2EngineAddr, auth) if err != nil { return nil, err @@ -82,7 +83,7 @@ type L1EndpointConfig struct { var _ L1EndpointSetup = (*L1EndpointConfig)(nil) func (cfg *L1EndpointConfig) Setup(ctx context.Context, log log.Logger) (cl *rpc.Client, trust bool, err error) { - l1Node, err := dialRPCClientWithBackoff(ctx, log, cfg.L1NodeAddr, nil) + l1Node, err := dialRPCClientWithBackoff(ctx, log, cfg.L1NodeAddr) if err != nil { return nil, false, fmt.Errorf("failed to dial L1 address (%s): %w", cfg.L1NodeAddr, err) } @@ -102,17 +103,11 @@ func (p *PreparedL1Endpoint) Setup(ctx context.Context, log log.Logger) (cl *rpc } // Dials a JSON-RPC endpoint repeatedly, with a backoff, until a client connection is established. Auth is optional. -func dialRPCClientWithBackoff(ctx context.Context, log log.Logger, addr string, auth rpc.HeaderAuthProvider) (*rpc.Client, error) { +func dialRPCClientWithBackoff(ctx context.Context, log log.Logger, addr string, opts ...rpc.ClientOption) (*rpc.Client, error) { bOff := backoff.Exponential() var ret *rpc.Client err := backoff.Do(10, bOff, func() error { - var client *rpc.Client - var err error - if auth == nil { - client, err = rpc.DialContext(ctx, addr) - } else { - client, err = rpc.DialWithAuth(ctx, addr, auth) - } + client, err := rpc.DialOptions(ctx, addr, opts...) if err != nil { if client == nil { return fmt.Errorf("failed to dial address (%s): %w", addr, err) diff --git a/op-node/node/config.go b/op-node/node/config.go index 11df416c4a931..5c10ff5656166 100644 --- a/op-node/node/config.go +++ b/op-node/node/config.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "math" + "time" "github.com/ethereum-optimism/optimism/op-node/p2p" "github.com/ethereum-optimism/optimism/op-node/rollup" @@ -30,6 +31,9 @@ type Config struct { Pprof PprofConfig + // Used to poll the L1 for new finalized or safe blocks + L1EpochPollInterval time.Duration + // Optional Tracer Tracer } diff --git a/op-node/node/node.go b/op-node/node/node.go index 38dbd9e38bc0e..37b19102ed868 100644 --- a/op-node/node/node.go +++ b/op-node/node/node.go @@ -25,14 +25,18 @@ type OpNode struct { log log.Logger appVersion string metrics *metrics.Metrics - l1HeadsSub ethereum.Subscription // Subscription to get L1 heads (automatically re-subscribes on error) - l1Source *sources.L1Client // L1 Client to fetch data from - l2Driver *driver.Driver // L2 Engine to Sync - l2Source *sources.EngineClient // L2 Execution Engine RPC bindings - server *rpcServer // RPC server hosting the rollup-node API - p2pNode *p2p.NodeP2P // P2P node functionality - p2pSigner p2p.Signer // p2p gogssip application messages will be signed with this signer - tracer Tracer // tracer to get events for testing/debugging + + l1HeadsSub ethereum.Subscription // Subscription to get L1 heads (automatically re-subscribes on error) + l1SafeSub ethereum.Subscription // Subscription to get L1 safe blocks, a.k.a. justified data (polling) + l1FinalizedSub ethereum.Subscription // Subscription to get L1 safe blocks, a.k.a. justified data (polling) + + l1Source *sources.L1Client // L1 Client to fetch data from + l2Driver *driver.Driver // L2 Engine to Sync + l2Source *sources.EngineClient // L2 Execution Engine RPC bindings + server *rpcServer // RPC server hosting the rollup-node API + p2pNode *p2p.NodeP2P // P2P node functionality + p2pSigner p2p.Signer // p2p gogssip application messages will be signed with this signer + tracer Tracer // tracer to get events for testing/debugging // some resources cannot be stopped directly, like the p2p gossipsub router (not our design), // and depend on this ctx to be closed. @@ -112,7 +116,7 @@ func (n *OpNode) initL1(ctx context.Context, cfg *Config) error { client.NewInstrumentedRPC(l1Node, n.metrics), n.log, n.metrics.L1SourceCache, sources.L1ClientDefaultConfig(&cfg.Rollup, trustRPC)) if err != nil { - return fmt.Errorf("failed to create L1 source: %v", err) + return fmt.Errorf("failed to create L1 source: %w", err) } // Keep subscribed to the L1 heads, which keeps the L1 maintainer pointing to the best headers to sync @@ -129,6 +133,13 @@ func (n *OpNode) initL1(ctx context.Context, cfg *Config) error { } n.log.Error("l1 heads subscription error", "err", err) }() + + // Poll for the safe L1 block and finalized block, + // which only change once per epoch at most and may be delayed. + n.l1SafeSub = eth.PollBlockChanges(n.resourcesCtx, n.log, n.l1Source, n.OnNewL1Safe, eth.Safe, + cfg.L1EpochPollInterval, time.Second*10) + n.l1FinalizedSub = eth.PollBlockChanges(n.resourcesCtx, n.log, n.l1Source, n.OnNewL1Finalized, eth.Finalized, + cfg.L1EpochPollInterval, time.Second*10) return nil } @@ -227,13 +238,39 @@ func (n *OpNode) Start(ctx context.Context) error { func (n *OpNode) OnNewL1Head(ctx context.Context, sig eth.L1BlockRef) { n.tracer.OnNewL1Head(ctx, sig) + if n.l2Driver == nil { + return + } // Pass on the event to the L2 Engine ctx, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() if err := n.l2Driver.OnL1Head(ctx, sig); err != nil { n.log.Warn("failed to notify engine driver of L1 head change", "err", err) } +} +func (n *OpNode) OnNewL1Safe(ctx context.Context, sig eth.L1BlockRef) { + if n.l2Driver == nil { + return + } + // Pass on the event to the L2 Engine + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + if err := n.l2Driver.OnL1Safe(ctx, sig); err != nil { + n.log.Warn("failed to notify engine driver of L1 safe block change", "err", err) + } +} + +func (n *OpNode) OnNewL1Finalized(ctx context.Context, sig eth.L1BlockRef) { + if n.l2Driver == nil { + return + } + // Pass on the event to the L2 Engine + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + if err := n.l2Driver.OnL1Finalized(ctx, sig); err != nil { + n.log.Warn("failed to notify engine driver of L1 finalized block change", "err", err) + } } func (n *OpNode) PublishL2Payload(ctx context.Context, payload *eth.ExecutionPayload) error { diff --git a/op-node/node/server_test.go b/op-node/node/server_test.go index adf87e8819a72..5ef4f536bb4ea 100644 --- a/op-node/node/server_test.go +++ b/op-node/node/server_test.go @@ -109,7 +109,7 @@ func TestOutputAtBlock(t *testing.T) { assert.NoError(t, server.Start()) defer server.Stop() - client, err := dialRPCClientWithBackoff(context.Background(), log, "http://"+server.Addr().String(), nil) + client, err := dialRPCClientWithBackoff(context.Background(), log, "http://"+server.Addr().String()) assert.NoError(t, err) var out []eth.Bytes32 @@ -135,7 +135,7 @@ func TestVersion(t *testing.T) { assert.NoError(t, server.Start()) defer server.Stop() - client, err := dialRPCClientWithBackoff(context.Background(), log, "http://"+server.Addr().String(), nil) + client, err := dialRPCClientWithBackoff(context.Background(), log, "http://"+server.Addr().String()) assert.NoError(t, err) var out string @@ -170,7 +170,7 @@ func TestSyncStatus(t *testing.T) { assert.NoError(t, server.Start()) defer server.Stop() - client, err := dialRPCClientWithBackoff(context.Background(), log, "http://"+server.Addr().String(), nil) + client, err := dialRPCClientWithBackoff(context.Background(), log, "http://"+server.Addr().String()) assert.NoError(t, err) var out *driver.SyncStatus diff --git a/op-node/p2p/config.go b/op-node/p2p/config.go index af72302ca1ce7..e7905fdddbd24 100644 --- a/op-node/p2p/config.go +++ b/op-node/p2p/config.go @@ -152,20 +152,20 @@ func NewConfig(ctx *cli.Context) (*Config, error) { p, err := loadNetworkPrivKey(ctx) if err != nil { - return nil, fmt.Errorf("failed to load p2p priv key: %v", err) + return nil, fmt.Errorf("failed to load p2p priv key: %w", err) } conf.Priv = p if err := conf.loadListenOpts(ctx); err != nil { - return nil, fmt.Errorf("failed to load p2p listen options: %v", err) + return nil, fmt.Errorf("failed to load p2p listen options: %w", err) } if err := conf.loadDiscoveryOpts(ctx); err != nil { - return nil, fmt.Errorf("failed to load p2p discovery options: %v", err) + return nil, fmt.Errorf("failed to load p2p discovery options: %w", err) } if err := conf.loadLibp2pOpts(ctx); err != nil { - return nil, fmt.Errorf("failed to load p2p options: %v", err) + return nil, fmt.Errorf("failed to load p2p options: %w", err) } conf.ConnGater = DefaultConnGater @@ -189,11 +189,11 @@ func (conf *Config) loadListenOpts(ctx *cli.Context) error { var err error conf.ListenTCPPort, err = validatePort(ctx.GlobalUint(flags.ListenTCPPort.Name)) if err != nil { - return fmt.Errorf("bad listen TCP port: %v", err) + return fmt.Errorf("bad listen TCP port: %w", err) } conf.ListenUDPPort, err = validatePort(ctx.GlobalUint(flags.ListenUDPPort.Name)) if err != nil { - return fmt.Errorf("bad listen UDP port: %v", err) + return fmt.Errorf("bad listen UDP port: %w", err) } return nil } @@ -206,17 +206,17 @@ func (conf *Config) loadDiscoveryOpts(ctx *cli.Context) error { var err error conf.AdvertiseTCPPort, err = validatePort(ctx.GlobalUint(flags.AdvertiseTCPPort.Name)) if err != nil { - return fmt.Errorf("bad advertised TCP port: %v", err) + return fmt.Errorf("bad advertised TCP port: %w", err) } conf.AdvertiseUDPPort, err = validatePort(ctx.GlobalUint(flags.AdvertiseUDPPort.Name)) if err != nil { - return fmt.Errorf("bad advertised UDP port: %v", err) + return fmt.Errorf("bad advertised UDP port: %w", err) } adIP := ctx.GlobalString(flags.AdvertiseIP.Name) if adIP != "" { // optional ips, err := net.LookupIP(adIP) if err != nil { - return fmt.Errorf("failed to lookup IP of %q to advertise in ENR: %v", adIP, err) + return fmt.Errorf("failed to lookup IP of %q to advertise in ENR: %w", adIP, err) } // Find the first v4 IP it resolves to for _, ip := range ips { @@ -239,7 +239,7 @@ func (conf *Config) loadDiscoveryOpts(ctx *cli.Context) error { } conf.DiscoveryDB, err = enode.OpenDB(dbPath) if err != nil { - return fmt.Errorf("failed to open discovery db: %v", err) + return fmt.Errorf("failed to open discovery db: %w", err) } records := strings.Split(ctx.GlobalString(flags.Bootnodes.Name), ",") @@ -250,7 +250,7 @@ func (conf *Config) loadDiscoveryOpts(ctx *cli.Context) error { } nodeRecord, err := enode.Parse(enode.ValidSchemes, recordB64) if err != nil { - return fmt.Errorf("bootnode record %d (of %d) is invalid: %q err: %v", i, len(records), recordB64, err) + return fmt.Errorf("bootnode record %d (of %d) is invalid: %q err: %w", i, len(records), recordB64, err) } conf.Bootnodes = append(conf.Bootnodes, nodeRecord) } @@ -300,7 +300,7 @@ func (conf *Config) loadLibp2pOpts(ctx *cli.Context) error { } a, err := multiaddr.NewMultiaddr(addr) if err != nil { - return fmt.Errorf("failed to parse multi addr of static peer %d (out of %d): %q err: %v", i, len(addrs), addr, err) + return fmt.Errorf("failed to parse multi addr of static peer %d (out of %d): %q err: %w", i, len(addrs), addr, err) } conf.StaticPeers = append(conf.StaticPeers, a) } @@ -318,7 +318,7 @@ func (conf *Config) loadLibp2pOpts(ctx *cli.Context) error { return fmt.Errorf("could not recognize mux %s", v) } if err != nil { - return fmt.Errorf("failed to make %s constructor: %v", v, err) + return fmt.Errorf("failed to make %s constructor: %w", v, err) } conf.HostMux = append(conf.HostMux, mc) } @@ -342,7 +342,7 @@ func (conf *Config) loadLibp2pOpts(ctx *cli.Context) error { return fmt.Errorf("could not recognize security %s", v) } if err != nil { - return fmt.Errorf("failed to make %s constructor: %v", v, err) + return fmt.Errorf("failed to make %s constructor: %w", v, err) } conf.HostSecurity = append(conf.HostSecurity, sc) } @@ -368,7 +368,7 @@ func (conf *Config) loadLibp2pOpts(ctx *cli.Context) error { } else { store, err = leveldb.NewDatastore(peerstorePath, nil) // default leveldb options are fine if err != nil { - return fmt.Errorf("failed to open leveldb db for peerstore: %v", err) + return fmt.Errorf("failed to open leveldb db for peerstore: %w", err) } } conf.Store = store @@ -386,26 +386,26 @@ func loadNetworkPrivKey(ctx *cli.Context) (*crypto.Secp256k1PrivateKey, error) { if os.IsNotExist(err) { p, _, err := crypto.GenerateSecp256k1Key(rand.Reader) if err != nil { - return nil, fmt.Errorf("failed to generate new p2p priv key: %v", err) + return nil, fmt.Errorf("failed to generate new p2p priv key: %w", err) } b, err := p.Raw() if err != nil { - return nil, fmt.Errorf("failed to encode new p2p priv key: %v", err) + return nil, fmt.Errorf("failed to encode new p2p priv key: %w", err) } f, err := os.OpenFile(keyPath, os.O_CREATE|os.O_WRONLY, 0600) if err != nil { - return nil, fmt.Errorf("failed to store new p2p priv key: %v", err) + return nil, fmt.Errorf("failed to store new p2p priv key: %w", err) } defer f.Close() if _, err := f.WriteString(hex.EncodeToString(b)); err != nil { - return nil, fmt.Errorf("failed to write new p2p priv key: %v", err) + return nil, fmt.Errorf("failed to write new p2p priv key: %w", err) } return (p).(*crypto.Secp256k1PrivateKey), nil } else { defer f.Close() data, err := io.ReadAll(f) if err != nil { - return nil, fmt.Errorf("failed to read priv key file: %v", err) + return nil, fmt.Errorf("failed to read priv key file: %w", err) } return parsePriv(strings.TrimSpace(string(data))) } diff --git a/op-node/p2p/discovery.go b/op-node/p2p/discovery.go index 432d4052280e7..c71e4e1f102fc 100644 --- a/op-node/p2p/discovery.go +++ b/op-node/p2p/discovery.go @@ -137,7 +137,7 @@ func enrToAddrInfo(r *enode.Node) (*peer.AddrInfo, *crypto.Secp256k1PublicKey, e } mAddr, err := multiaddr.NewMultiaddr(fmt.Sprintf("/%s/%s/tcp/%d", ipScheme, ip.String(), r.TCP())) if err != nil { - return nil, nil, fmt.Errorf("could not construct multi addr: %v", err) + return nil, nil, fmt.Errorf("could not construct multi addr: %w", err) } var enrPub Secp256k1 if err := r.Load(&enrPub); err != nil { @@ -146,7 +146,7 @@ func enrToAddrInfo(r *enode.Node) (*peer.AddrInfo, *crypto.Secp256k1PublicKey, e pub := (*crypto.Secp256k1PublicKey)(&enrPub) peerID, err := peer.IDFromPublicKey(pub) if err != nil { - return nil, pub, fmt.Errorf("could not compute peer ID from pubkey for multi-addr: %v", err) + return nil, pub, fmt.Errorf("could not compute peer ID from pubkey for multi-addr: %w", err) } return &peer.AddrInfo{ ID: peerID, @@ -177,18 +177,18 @@ func (o *OptimismENRData) EncodeRLP(w io.Writer) error { func (o *OptimismENRData) DecodeRLP(s *rlp.Stream) error { b, err := s.Bytes() if err != nil { - return fmt.Errorf("failed to decode outer ENR entry: %v", err) + return fmt.Errorf("failed to decode outer ENR entry: %w", err) } // We don't check the byte length: the below readers are limited, and the ENR itself has size limits. // Future "optimism" entries may contain additional data, and will be tagged with a newer version etc. r := bytes.NewReader(b) chainID, err := binary.ReadUvarint(r) if err != nil { - return fmt.Errorf("failed to read chain ID var int: %v", err) + return fmt.Errorf("failed to read chain ID var int: %w", err) } version, err := binary.ReadUvarint(r) if err != nil { - return fmt.Errorf("failed to read version var int: %v", err) + return fmt.Errorf("failed to read version var int: %w", err) } o.chainID = chainID o.version = version diff --git a/op-node/p2p/gossip.go b/op-node/p2p/gossip.go index 9d07e0af1415d..61eb98e98bc9a 100644 --- a/op-node/p2p/gossip.go +++ b/op-node/p2p/gossip.go @@ -31,6 +31,10 @@ func init() { } const maxGossipSize = 1 << 20 + +// minGossipSize is used to make sure that there is at least some data +// to validate the signature against. +const minGossipSize = 66 const maxOutboundQueue = 256 const maxValidateQueue = 256 const globalValidateThrottle = 512 @@ -189,7 +193,7 @@ func BuildBlocksValidator(log log.Logger, cfg *rollup.Config) pubsub.ValidatorEx // uint64 -> *seenBlocks blockHeightLRU, err := lru.New(100) if err != nil { - panic(fmt.Errorf("failed to set up block height LRU cache: %v", err)) + panic(fmt.Errorf("failed to set up block height LRU cache: %w", err)) } return func(ctx context.Context, id peer.ID, message *pubsub.Message) pubsub.ValidationResult { @@ -203,6 +207,10 @@ func BuildBlocksValidator(log log.Logger, cfg *rollup.Config) pubsub.ValidatorEx log.Warn("possible snappy zip bomb, decoded length is too large", "decoded_length", outLen, "peer", id) return pubsub.ValidationReject } + if outLen < minGossipSize { + log.Warn("rejecting undersized gossip payload") + return pubsub.ValidationReject + } res := msgBufPool.Get().(*[]byte) defer msgBufPool.Put(res) @@ -216,6 +224,22 @@ func BuildBlocksValidator(log log.Logger, cfg *rollup.Config) pubsub.ValidatorEx // message starts with compact-encoding secp256k1 encoded signature signatureBytes, payloadBytes := data[:65], data[65:] + // [REJECT] if the signature by the sequencer is not valid + signingHash := BlockSigningHash(cfg, payloadBytes) + + pub, err := crypto.SigToPub(signingHash[:], signatureBytes) + if err != nil { + log.Warn("invalid block signature", "err", err, "peer", id) + return pubsub.ValidationReject + } + addr := crypto.PubkeyToAddress(*pub) + + // TODO: in the future we can support multiple valid p2p addresses. + if addr != cfg.P2PSequencerAddress { + log.Warn("unexpected block author", "err", err, "peer", id) + return pubsub.ValidationReject + } + // [REJECT] if the block encoding is not valid var payload eth.ExecutionPayload if err := payload.UnmarshalSSZ(uint32(len(payloadBytes)), bytes.NewReader(payloadBytes)); err != nil { @@ -260,22 +284,6 @@ func BuildBlocksValidator(log log.Logger, cfg *rollup.Config) pubsub.ValidatorEx return pubsub.ValidationIgnore } - // [REJECT] if the signature by the sequencer is not valid - signingHash := BlockSigningHash(cfg, payloadBytes) - - pub, err := crypto.SigToPub(signingHash[:], signatureBytes) - if err != nil { - log.Warn("invalid block signature", "err", err, "peer", id) - return pubsub.ValidationReject - } - addr := crypto.PubkeyToAddress(*pub) - - // TODO: in the future we can support multiple valid p2p addresses. - if addr != cfg.P2PSequencerAddress { - log.Warn("unexpected block author", "err", err, "peer", id) - return pubsub.ValidationReject - } - // mark it as seen. (note: with concurrent validation more than 5 blocks may be marked as seen still, // but validator concurrency is limited anyway) seen.(*seenBlocks).markSeen(payload.BlockHash) @@ -322,13 +330,13 @@ func (p *publisher) PublishL2Payload(ctx context.Context, payload *eth.Execution buf.Write(make([]byte, 65)) if _, err := payload.MarshalSSZ(buf); err != nil { - return fmt.Errorf("failed to encoded execution payload to publish: %v", err) + return fmt.Errorf("failed to encoded execution payload to publish: %w", err) } data := buf.Bytes() payloadData := data[65:] sig, err := signer.Sign(ctx, SigningDomainBlocksV1, p.cfg.L2ChainID, payloadData) if err != nil { - return fmt.Errorf("failed to sign execution payload with signer: %v", err) + return fmt.Errorf("failed to sign execution payload with signer: %w", err) } copy(data[:65], sig[:]) @@ -351,15 +359,15 @@ func JoinGossip(p2pCtx context.Context, self peer.ID, ps *pubsub.PubSub, log log pubsub.WithValidatorTimeout(3*time.Second), pubsub.WithValidatorConcurrency(4)) if err != nil { - return nil, fmt.Errorf("failed to register blocks gossip topic: %v", err) + return nil, fmt.Errorf("failed to register blocks gossip topic: %w", err) } blocksTopic, err := ps.Join(blocksTopicName) if err != nil { - return nil, fmt.Errorf("failed to join blocks gossip topic: %v", err) + return nil, fmt.Errorf("failed to join blocks gossip topic: %w", err) } blocksTopicEvents, err := blocksTopic.EventHandler() if err != nil { - return nil, fmt.Errorf("failed to create blocks gossip topic handler: %v", err) + return nil, fmt.Errorf("failed to create blocks gossip topic handler: %w", err) } go LogTopicEvents(p2pCtx, log.New("topic", "blocks"), blocksTopicEvents) @@ -371,7 +379,7 @@ func JoinGossip(p2pCtx context.Context, self peer.ID, ps *pubsub.PubSub, log log subscription, err := blocksTopic.Subscribe() if err != nil { - return nil, fmt.Errorf("failed to subscribe to blocks gossip topic: %v", err) + return nil, fmt.Errorf("failed to subscribe to blocks gossip topic: %w", err) } subscriber := MakeSubscriber(log, BlocksHandler(gossipIn.OnUnsafeL2Payload)) diff --git a/op-node/p2p/host.go b/op-node/p2p/host.go index 93d4c02b46f0f..52ecb5a8e6d53 100644 --- a/op-node/p2p/host.go +++ b/op-node/p2p/host.go @@ -48,40 +48,40 @@ func (conf *Config) Host(log log.Logger) (host.Host, error) { pub := conf.Priv.GetPublic() pid, err := peer.IDFromPublicKey(pub) if err != nil { - return nil, fmt.Errorf("failed to derive pubkey from network priv key: %v", err) + return nil, fmt.Errorf("failed to derive pubkey from network priv key: %w", err) } ps, err := pstoreds.NewPeerstore(context.Background(), conf.Store, pstoreds.DefaultOpts()) if err != nil { - return nil, fmt.Errorf("failed to open peerstore: %v", err) + return nil, fmt.Errorf("failed to open peerstore: %w", err) } if err := ps.AddPrivKey(pid, conf.Priv); err != nil { - return nil, fmt.Errorf("failed to set up peerstore with priv key: %v", err) + return nil, fmt.Errorf("failed to set up peerstore with priv key: %w", err) } if err := ps.AddPubKey(pid, pub); err != nil { - return nil, fmt.Errorf("failed to set up peerstore with pub key: %v", err) + return nil, fmt.Errorf("failed to set up peerstore with pub key: %w", err) } connGtr, err := conf.ConnGater(conf) if err != nil { - return nil, fmt.Errorf("failed to open connection gater: %v", err) + return nil, fmt.Errorf("failed to open connection gater: %w", err) } connMngr, err := conf.ConnMngr(conf) if err != nil { - return nil, fmt.Errorf("failed to open connection manager: %v", err) + return nil, fmt.Errorf("failed to open connection manager: %w", err) } listenAddr, err := addrFromIPAndPort(conf.ListenIP, conf.ListenTCPPort) if err != nil { - return nil, fmt.Errorf("failed to make listen addr: %v", err) + return nil, fmt.Errorf("failed to make listen addr: %w", err) } tcpTransport, err := lconf.TransportConstructor( tcp.NewTCPTransport, tcp.WithConnectionTimeout(time.Minute*60)) // break unused connections if err != nil { - return nil, fmt.Errorf("failed to create TCP transport: %v", err) + return nil, fmt.Errorf("failed to create TCP transport: %w", err) } // TODO: technically we can also run the node on websocket and QUIC transports. Maybe in the future? @@ -140,7 +140,7 @@ func (conf *Config) Host(log log.Logger) (host.Host, error) { for _, peerAddr := range conf.StaticPeers { addr, err := peer.AddrInfoFromP2pAddr(peerAddr) if err != nil { - return nil, fmt.Errorf("bad peer address: %v", err) + return nil, fmt.Errorf("bad peer address: %w", err) } h.Peerstore().AddAddrs(addr.ID, addr.Addrs, time.Hour*24*7) // We protect the peer, so the connection manager doesn't decide to prune it. diff --git a/op-node/p2p/node.go b/op-node/p2p/node.go index 77636e8fb16f1..bcf7863baab17 100644 --- a/op-node/p2p/node.go +++ b/op-node/p2p/node.go @@ -56,7 +56,7 @@ func (n *NodeP2P) init(resourcesCtx context.Context, rollupCfg *rollup.Config, l if n.dv5Udp != nil { n.dv5Udp.Close() } - return fmt.Errorf("failed to start p2p host: %v", err) + return fmt.Errorf("failed to start p2p host: %w", err) } if n.host != nil { @@ -71,12 +71,12 @@ func (n *NodeP2P) init(resourcesCtx context.Context, rollupCfg *rollup.Config, l n.host.RemoveStreamHandler(identify.IDDelta) n.gs, err = NewGossipSub(resourcesCtx, n.host, rollupCfg) if err != nil { - return fmt.Errorf("failed to start gossipsub router: %v", err) + return fmt.Errorf("failed to start gossipsub router: %w", err) } n.gsOut, err = JoinGossip(resourcesCtx, n.host.ID(), n.gs, log, rollupCfg, gossipIn) if err != nil { - return fmt.Errorf("failed to join blocks gossip topic: %v", err) + return fmt.Errorf("failed to join blocks gossip topic: %w", err) } log.Info("started p2p host", "addrs", n.host.Addrs(), "peerID", n.host.ID().Pretty()) @@ -88,7 +88,7 @@ func (n *NodeP2P) init(resourcesCtx context.Context, rollupCfg *rollup.Config, l // All nil if disabled. n.dv5Local, n.dv5Udp, err = setup.Discovery(log.New("p2p", "discv5"), rollupCfg, tcpPort) if err != nil { - return fmt.Errorf("failed to start discv5: %v", err) + return fmt.Errorf("failed to start discv5: %w", err) } } return nil @@ -129,12 +129,12 @@ func (n *NodeP2P) Close() error { } if n.gsOut != nil { if err := n.gsOut.Close(); err != nil { - result = multierror.Append(result, fmt.Errorf("failed to close gossip cleanly: %v", err)) + result = multierror.Append(result, fmt.Errorf("failed to close gossip cleanly: %w", err)) } } if n.host != nil { if err := n.host.Close(); err != nil { - result = multierror.Append(result, fmt.Errorf("failed to close p2p host cleanly: %v", err)) + result = multierror.Append(result, fmt.Errorf("failed to close p2p host cleanly: %w", err)) } } return result.ErrorOrNil() diff --git a/op-node/p2p/rpc_server.go b/op-node/p2p/rpc_server.go index 3536daa6e7590..8fd51efbeaa02 100644 --- a/op-node/p2p/rpc_server.go +++ b/op-node/p2p/rpc_server.go @@ -356,7 +356,7 @@ func (s *APIBackend) ConnectPeer(ctx context.Context, addr string) error { h := s.node.Host() addrInfo, err := peer.AddrInfoFromString(addr) if err != nil { - return fmt.Errorf("bad peer address: %v", err) + return fmt.Errorf("bad peer address: %w", err) } // Put a sanity limit on the connection time ctx, cancel := context.WithTimeout(ctx, time.Second*30) diff --git a/op-node/p2p/signer.go b/op-node/p2p/signer.go index ec171c0c5c27d..5ac6d241aaf54 100644 --- a/op-node/p2p/signer.go +++ b/op-node/p2p/signer.go @@ -88,7 +88,7 @@ func LoadSignerSetup(ctx *cli.Context) (SignerSetup, error) { // TODO: load from encrypted keystore priv, err := crypto.LoadECDSA(keyFile) if err != nil { - return nil, fmt.Errorf("failed to read batch submitter key: %v", err) + return nil, fmt.Errorf("failed to read batch submitter key: %w", err) } return &PreparedSigner{Signer: NewLocalSigner(priv)}, nil diff --git a/op-node/rollup/derive/attributes_test.go b/op-node/rollup/derive/attributes_test.go index 6baca9f5d1201..ba0d2f73f6896 100644 --- a/op-node/rollup/derive/attributes_test.go +++ b/op-node/rollup/derive/attributes_test.go @@ -172,7 +172,7 @@ func encodeDeposits(deposits []*types.DepositTx) (out []eth.Data, err error) { for i, tx := range deposits { opaqueTx, err := types.NewTx(tx).MarshalBinary() if err != nil { - return nil, fmt.Errorf("bad deposit %d: %v", i, err) + return nil, fmt.Errorf("bad deposit %d: %w", i, err) } out = append(out, opaqueTx) } diff --git a/op-node/rollup/derive/channel.go b/op-node/rollup/derive/channel.go index febead7f65615..6a40230afe245 100644 --- a/op-node/rollup/derive/channel.go +++ b/op-node/rollup/derive/channel.go @@ -19,7 +19,8 @@ import ( // channel may mark itself as ready for reading once all intervening frames have been added type Channel struct { // id of the channel - id ChannelID + id ChannelID + openBlock eth.L1BlockRef // estimated memory size, used to drop the channel if we have too much data size uint64 @@ -42,10 +43,11 @@ type Channel struct { highestL1InclusionBlock eth.L1BlockRef } -func NewChannel(id ChannelID) *Channel { +func NewChannel(id ChannelID, openBlock eth.L1BlockRef) *Channel { return &Channel{ - id: id, - inputs: make(map[uint64][]byte), + id: id, + inputs: make(map[uint64][]byte), + openBlock: openBlock, } } @@ -80,6 +82,12 @@ func (ch *Channel) AddFrame(frame Frame, l1InclusionBlock eth.L1BlockRef) error return nil } +// OpenBlockNumber returns the block number of L1 block that contained +// the first frame for this channel. +func (ch *Channel) OpenBlockNumber() uint64 { + return ch.openBlock.Number +} + // Size returns the current size of the channel including frame overhead. // Reading from the channel does not reduce the size as reading is done // on uncompressed data while this size is over compressed data. diff --git a/op-node/rollup/derive/channel_bank.go b/op-node/rollup/derive/channel_bank.go index 498a088790378..00d603469b17a 100644 --- a/op-node/rollup/derive/channel_bank.go +++ b/op-node/rollup/derive/channel_bank.go @@ -35,8 +35,6 @@ type ChannelBank struct { channels map[ChannelID]*Channel // channels by ID channelQueue []ChannelID // channels in FIFO order - resetting bool - progress Progress next ChannelBankOutput @@ -94,25 +92,20 @@ func (ib *ChannelBank) IngestData(data []byte) { // Process each frame for _, f := range frames { - // check if the channel is not timed out - if f.ID.Time+ib.cfg.ChannelTimeout < ib.progress.Origin.Time { - ib.log.Warn("channel is timed out, ignore frame", "channel", f.ID, "id_time", f.ID.Time, "frame", f.FrameNumber) - continue - } - // check if the channel is not included too soon (otherwise timeouts wouldn't be effective) - if f.ID.Time > ib.progress.Origin.Time { - ib.log.Warn("channel claims to be from the future, ignore frame", "channel", f.ID, "id_time", f.ID.Time, "frame", f.FrameNumber) - continue - } - currentCh, ok := ib.channels[f.ID] if !ok { // create new channel if it doesn't exist yet - currentCh = NewChannel(f.ID) + currentCh = NewChannel(f.ID, ib.progress.Origin) ib.channels[f.ID] = currentCh ib.channelQueue = append(ib.channelQueue, f.ID) } + // check if the channel is not timed out + if currentCh.OpenBlockNumber()+ib.cfg.ChannelTimeout < ib.progress.Origin.Number { + ib.log.Warn("channel is timed out, ignore frame", "channel", f.ID, "frame", f.FrameNumber) + continue + } + ib.log.Trace("ingesting frame", "channel", f.ID, "frame_number", f.FrameNumber, "length", len(f.Data)) if err := currentCh.AddFrame(f, ib.progress.Origin); err != nil { ib.log.Warn("failed to ingest frame into channel", "channel", f.ID, "frame_number", f.FrameNumber, "err", err) @@ -129,16 +122,17 @@ func (ib *ChannelBank) Read() (data []byte, err error) { } first := ib.channelQueue[0] ch := ib.channels[first] - timedOut := first.Time+ib.cfg.ChannelTimeout < ib.progress.Origin.Time + timedOut := ch.OpenBlockNumber()+ib.cfg.ChannelTimeout < ib.progress.Origin.Number if timedOut { ib.log.Debug("channel timed out", "channel", first, "frames", len(ch.inputs)) + delete(ib.channels, first) + ib.channelQueue = ib.channelQueue[1:] + return nil, io.EOF } - if ch.IsReady() { - ib.log.Debug("channel ready", "channel", first) - } - if !timedOut && !ch.IsReady() { // check if channel is readya (can then be read) + if !ch.IsReady() { return nil, io.EOF } + delete(ib.channels, first) ib.channelQueue = ib.channelQueue[1:] r := ch.Reader() @@ -176,26 +170,19 @@ func (ib *ChannelBank) Step(ctx context.Context, outer Progress) error { // Any channel data before this origin will be timed out by the time the channel bank is synced up to the origin, // so it is not relevant to replay it into the bank. func (ib *ChannelBank) ResetStep(ctx context.Context, l1Fetcher L1Fetcher) error { - if !ib.resetting { - ib.progress = ib.next.Progress() - ib.resetting = true - return nil - } - if ib.progress.Origin.Time+ib.cfg.ChannelTimeout < ib.next.Progress().Origin.Time || ib.progress.Origin.Number <= ib.cfg.Genesis.L1.Number { - ib.log.Debug("found reset origin for channel bank", "origin", ib.progress.Origin) - ib.resetting = false - return io.EOF - } - + ib.progress = ib.next.Progress() ib.log.Debug("walking back to find reset origin for channel bank", "origin", ib.progress.Origin) - // go back in history if we are not distant enough from the next stage - parent, err := l1Fetcher.L1BlockRefByHash(ctx, ib.progress.Origin.ParentHash) + resetBlock := ib.progress.Origin.Number - ib.cfg.ChannelTimeout + if ib.progress.Origin.Number < ib.cfg.ChannelTimeout { + resetBlock = 0 // don't underflow + } + parent, err := l1Fetcher.L1BlockRefByNumber(ctx, resetBlock) if err != nil { return NewTemporaryError(fmt.Errorf("failed to find channel bank block, failed to retrieve L1 reference: %w", err)) } ib.progress.Origin = parent - return nil + return io.EOF } type L1BlockRefByHashFetcher interface { diff --git a/op-node/rollup/derive/channel_bank_test.go b/op-node/rollup/derive/channel_bank_test.go index 7aef9374023bf..f8b294ffbe6e1 100644 --- a/op-node/rollup/derive/channel_bank_test.go +++ b/op-node/rollup/derive/channel_bank_test.go @@ -73,25 +73,20 @@ func (ct *channelBankTestCase) Run(t *testing.T) { ct.fn(bt) } -// format: ::: -// example: "abc:123:0:helloworld!" +// format: :: +// example: "abc:0:helloworld!" type testFrame string func (tf testFrame) ChannelID() ChannelID { parts := strings.Split(string(tf), ":") var chID ChannelID - copy(chID.Data[:], parts[0]) - x, err := strconv.ParseUint(parts[1], 0, 64) - if err != nil { - panic(err) - } - chID.Time = x + copy(chID[:], parts[0]) return chID } func (tf testFrame) FrameNumber() uint64 { parts := strings.Split(string(tf), ":") - frameNum, err := strconv.ParseUint(parts[2], 0, 64) + frameNum, err := strconv.ParseUint(parts[1], 0, 64) if err != nil { panic(err) } @@ -100,12 +95,12 @@ func (tf testFrame) FrameNumber() uint64 { func (tf testFrame) IsLast() bool { parts := strings.Split(string(tf), ":") - return strings.HasSuffix(parts[3], "!") + return strings.HasSuffix(parts[2], "!") } func (tf testFrame) Content() []byte { parts := strings.Split(string(tf), ":") - return []byte(strings.TrimSuffix(parts[3], "!")) + return []byte(strings.TrimSuffix(parts[2], "!")) } func (tf testFrame) ToFrame() Frame { @@ -138,12 +133,7 @@ func (bt *bankTestSetup) repeatStep(max int, outer int, outerClosed bool, err er func (bt *bankTestSetup) repeatResetStep(max int, err error) { require.Equal(bt.t, err, RepeatResetStep(bt.t, bt.cb.ResetStep, bt.l1, max)) } -func (bt *bankTestSetup) assertProgressOpen() { - require.False(bt.t, bt.cb.progress.Closed) -} -func (bt *bankTestSetup) assertProgressClosed() { - require.True(bt.t, bt.cb.progress.Closed) -} + func (bt *bankTestSetup) assertOrigin(i int) { require.Equal(bt.t, bt.cb.progress.Origin, bt.origins[i]) } @@ -153,8 +143,8 @@ func (bt *bankTestSetup) assertOriginTime(x uint64) { func (bt *bankTestSetup) expectChannel(data string) { bt.out.ExpectWriteChannel([]byte(data)) } -func (bt *bankTestSetup) expectL1RefByHash(i int) { - bt.l1.ExpectL1BlockRefByHash(bt.origins[i].Hash, bt.origins[i], nil) +func (bt *bankTestSetup) expectL1BlockRefByNumber(i int) { + bt.l1.ExpectL1BlockRefByNumber(bt.origins[i].Number, bt.origins[i], nil) } func (bt *bankTestSetup) assertExpectations() { bt.l1.AssertExpectations(bt.t) @@ -162,120 +152,83 @@ func (bt *bankTestSetup) assertExpectations() { bt.out.AssertExpectations(bt.t) bt.out.ExpectedCalls = nil } -func (bt *bankTestSetup) logf(format string, args ...any) { - bt.t.Logf(format, args...) -} func TestL1ChannelBank(t *testing.T) { testCases := []channelBankTestCase{ { name: "time outs and buffering", - originTimes: []uint64{101, 102, 105, 107, 109}, - nextStartsAt: 3, // start next stage at 107 - channelTimeout: 3, // 107-3 = 104, reset to next lower origin, thus 102 + originTimes: []uint64{0, 1, 2, 3, 4, 5}, + nextStartsAt: 3, // Start next stage at block #3 + channelTimeout: 2, // Start at block #1 fn: func(bt *bankTestSetup) { - bt.logf("reset to an origin that is timed out") - bt.expectL1RefByHash(2) - bt.expectL1RefByHash(1) - bt.repeatResetStep(10, nil) // bank rewinds to origin pre-timeout - bt.assertExpectations() - bt.assertOrigin(1) - bt.assertOriginTime(102) - - bt.logf("first step after reset should be EOF to start getting data") - bt.repeatStep(1, 1, false, nil) - - bt.logf("read from there onwards, but drop content since we did not reach start origin yet") - bt.ingestFrames("a:98:0:too old") // timed out, can continue - bt.repeatStep(3, 1, false, nil) - bt.ingestFrames("b:99:0:just new enough!") // closed frame, can be read, but dropped - bt.repeatStep(3, 1, false, nil) + bt.expectL1BlockRefByNumber(1) + bt.repeatResetStep(10, nil) + bt.ingestFrames("a:0:first") // will time out b/c not closed - bt.logf("close origin 1") - bt.repeatStep(2, 1, true, nil) - bt.assertOrigin(1) - bt.assertProgressClosed() - - bt.logf("open and close 2 without data") - bt.repeatStep(2, 2, false, nil) + bt.repeatStep(10, 1, true, nil) + bt.repeatStep(10, 2, false, nil) bt.assertOrigin(2) - bt.assertProgressOpen() - bt.repeatStep(2, 2, true, nil) - bt.assertProgressClosed() - bt.logf("open 3, where we meet the next stage. Data isn't dropped anymore") - bt.repeatStep(2, 3, false, nil) + bt.repeatStep(10, 2, true, nil) + bt.repeatStep(10, 3, false, nil) bt.assertOrigin(3) - bt.assertProgressOpen() - bt.assertOriginTime(107) - - bt.ingestFrames("c:104:0:foobar") - bt.repeatStep(1, 3, false, nil) - bt.ingestFrames("d:104:0:other!") - bt.repeatStep(1, 3, false, nil) - bt.ingestFrames("e:105:0:time-out-later") // timed out when we get to 109 - bt.repeatStep(1, 3, false, nil) - bt.ingestFrames("c:104:1:close!") - bt.expectChannel("foobarclose") - bt.expectChannel("other") - bt.repeatStep(3, 3, false, nil) - bt.assertExpectations() - bt.logf("close 3") - bt.repeatStep(2, 3, true, nil) - bt.assertProgressClosed() + bt.repeatStep(10, 3, true, nil) + bt.repeatStep(10, 4, false, nil) + bt.assertOrigin(4) - bt.logf("open 4") - bt.expectChannel("time-out-later") // not closed, but processed after timeout - bt.repeatStep(3, 4, false, nil) - bt.assertExpectations() - bt.assertProgressOpen() - bt.assertOriginTime(109) - - bt.logf("data from 4") - bt.ingestFrames("f:108:0:hello!") - bt.expectChannel("hello") - bt.repeatStep(2, 4, false, nil) + // Properly closed channel + bt.expectChannel("foobarclosed") + bt.ingestFrames("b:0:foobar") + bt.ingestFrames("b:1:closed!") + bt.repeatStep(10, 4, true, nil) bt.assertExpectations() }, }, { name: "duplicate frames", - originTimes: []uint64{101, 102}, - nextStartsAt: 0, - channelTimeout: 3, + originTimes: []uint64{0, 1, 2, 3, 4, 5}, + nextStartsAt: 3, // Start next stage at block #3 + channelTimeout: 2, // Start at block #1c fn: func(bt *bankTestSetup) { - // don't do the whole setup process, just override where the stages are - bt.cb.progress = Progress{Origin: bt.origins[0], Closed: false} - bt.out.progress = Progress{Origin: bt.origins[0], Closed: false} + bt.expectL1BlockRefByNumber(1) + bt.repeatResetStep(10, nil) + bt.ingestFrames("a:0:first") // will time out b/c not closed - bt.assertOriginTime(101) + bt.repeatStep(10, 1, true, nil) + bt.repeatStep(10, 2, false, nil) + bt.assertOrigin(2) - bt.ingestFrames("x:102:0:foobar") // future frame is ignored when included too early - bt.repeatStep(2, 0, false, nil) + bt.repeatStep(10, 2, true, nil) + bt.repeatStep(10, 3, false, nil) + bt.assertOrigin(3) + + bt.repeatStep(10, 3, true, nil) + bt.repeatStep(10, 4, false, nil) + bt.assertOrigin(4) - bt.ingestFrames("a:101:0:first") - bt.repeatStep(1, 0, false, nil) - bt.ingestFrames("a:101:1:second") - bt.repeatStep(1, 0, false, nil) - bt.ingestFrames("a:101:0:altfirst") // ignored as duplicate - bt.repeatStep(1, 0, false, nil) - bt.ingestFrames("a:101:1:altsecond") // ignored as duplicate - bt.repeatStep(1, 0, false, nil) - bt.ingestFrames("a:100:0:new") // different time, considered to be different channel - bt.repeatStep(1, 0, false, nil) + bt.ingestFrames("a:0:first") + bt.repeatStep(1, 4, false, nil) + bt.ingestFrames("a:1:second") + bt.repeatStep(1, 4, false, nil) + bt.ingestFrames("a:0:altfirst") // ignored as duplicate + bt.repeatStep(1, 4, false, nil) + bt.ingestFrames("a:1:altsecond") // ignored as duplicate + bt.repeatStep(1, 4, false, nil) + bt.ingestFrames("b:0:new") + bt.repeatStep(1, 4, false, nil) - // close origin 0 - bt.repeatStep(2, 0, true, nil) + // close origin 4 + bt.repeatStep(2, 4, true, nil) // open origin 1 - bt.repeatStep(2, 1, false, nil) - bt.ingestFrames("a:100:1:hi!") // close the other one first, but blocked - bt.repeatStep(1, 1, false, nil) - bt.ingestFrames("a:101:2:!") // empty closing frame + bt.repeatStep(2, 5, false, nil) + bt.ingestFrames("b:1:hi!") // close the other one first, but blocked + bt.repeatStep(1, 5, false, nil) + bt.ingestFrames("a:2:!") // empty closing frame bt.expectChannel("firstsecond") bt.expectChannel("newhi") - bt.repeatStep(3, 1, false, nil) + bt.repeatStep(5, 5, false, nil) bt.assertExpectations() }, }, @@ -293,7 +246,7 @@ func TestL1ChannelBank(t *testing.T) { badTx := new(bytes.Buffer) badTx.WriteByte(DerivationVersion0) - goodFrame := testFrame("a:101:0:helloworld!").ToFrame() + goodFrame := testFrame("a:0:helloworld!").ToFrame() if err := goodFrame.MarshalBinary(badTx); err != nil { panic(fmt.Errorf("error in marshalling frame: %w", err)) } diff --git a/op-node/rollup/derive/channel_out.go b/op-node/rollup/derive/channel_out.go index 1716b16dd072a..49589acb80574 100644 --- a/op-node/rollup/derive/channel_out.go +++ b/op-node/rollup/derive/channel_out.go @@ -34,15 +34,13 @@ func (co *ChannelOut) ID() ChannelID { return co.id } -func NewChannelOut(channelTime uint64) (*ChannelOut, error) { +func NewChannelOut() (*ChannelOut, error) { c := &ChannelOut{ - id: ChannelID{ - Time: channelTime, - }, + id: ChannelID{}, // TODO: use GUID here instead of fully random data frame: 0, offset: 0, } - _, err := rand.Read(c.id.Data[:]) + _, err := rand.Read(c.id[:]) if err != nil { return nil, err } @@ -57,15 +55,14 @@ func NewChannelOut(channelTime uint64) (*ChannelOut, error) { } // TODO: reuse ChannelOut for performance -func (co *ChannelOut) Reset(channelTime uint64) error { +func (co *ChannelOut) Reset() error { co.frame = 0 co.offset = 0 co.buf.Reset() co.scratch.Reset() co.compress.Reset(&co.buf) co.closed = false - co.id.Time = channelTime - _, err := rand.Read(co.id.Data[:]) + _, err := rand.Read(co.id[:]) if err != nil { return err } diff --git a/op-node/rollup/derive/engine_queue.go b/op-node/rollup/derive/engine_queue.go index 1b42e10a5413b..040802c057495 100644 --- a/op-node/rollup/derive/engine_queue.go +++ b/op-node/rollup/derive/engine_queue.go @@ -2,17 +2,18 @@ package derive import ( "context" + "errors" "fmt" "io" "time" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum-optimism/optimism/op-node/eth" "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-node/rollup/sync" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" ) @@ -26,8 +27,31 @@ type Engine interface { L2BlockRefByHash(ctx context.Context, l2Hash common.Hash) (eth.L2BlockRef, error) } -// Max number of unsafe payloads that may be queued up for execution -const maxUnsafePayloads = 50 +// Max memory used for buffering unsafe payloads +const maxUnsafePayloadsMemory = 500 * 1024 * 1024 + +// finalityLookback defines the amount of L1<>L2 relations to track for finalization purposes, one per L1 block. +// +// When L1 finalizes blocks, it finalizes finalityLookback blocks behind the L1 head. +// Non-finality may take longer, but when it does finalize again, it is within this range of the L1 head. +// Thus we only need to retain the L1<>L2 derivation relation data of this many L1 blocks. +// +// In the event of older finalization signals, misconfiguration, or insufficient L1<>L2 derivation relation data, +// then we may miss the opportunity to finalize more L2 blocks. +// This does not cause any divergence, it just causes lagging finalization status. +// +// The beacon chain on mainnet has 32 slots per epoch, +// and new finalization events happen at most 4 epochs behind the head. +// And then we add 1 to make pruning easier by leaving room for a new item without pruning the 32*4. +const finalityLookback = 4*32 + 1 + +type FinalityData struct { + // The last L2 block that was fully derived and inserted into the L2 engine while processing this L1 block. + L2Block eth.L2BlockRef + // The L1 block this stage was at when inserting the L2 block. + // When this L1 block is finalized, the L2 chain up to this block can be fully reproduced from finalized L1 data. + L1Block eth.BlockID +} // EngineQueue queues up payload attributes to consolidate or process with the provided Engine type EngineQueue struct { @@ -38,21 +62,36 @@ type EngineQueue struct { safeHead eth.L2BlockRef unsafeHead eth.L2BlockRef - toFinalize eth.BlockID + finalizedL1 eth.BlockID progress Progress safeAttributes []*eth.PayloadAttributes - unsafePayloads []*eth.ExecutionPayload + unsafePayloads PayloadsQueue // queue of unsafe payloads, ordered by ascending block number, may have gaps + + // Tracks which L2 blocks where last derived from which L1 block. At most finalityLookback large. + finalityData []FinalityData engine Engine + + metrics Metrics } var _ AttributesQueueOutput = (*EngineQueue)(nil) // NewEngineQueue creates a new EngineQueue, which should be Reset(origin) before use. -func NewEngineQueue(log log.Logger, cfg *rollup.Config, engine Engine) *EngineQueue { - return &EngineQueue{log: log, cfg: cfg, engine: engine} +func NewEngineQueue(log log.Logger, cfg *rollup.Config, engine Engine, metrics Metrics) *EngineQueue { + return &EngineQueue{ + log: log, + cfg: cfg, + engine: engine, + metrics: metrics, + finalityData: make([]FinalityData, 0, finalityLookback), + unsafePayloads: PayloadsQueue{ + MaxSize: maxUnsafePayloadsMemory, + SizeFn: payloadMemSize, + }, + } } func (eq *EngineQueue) Progress() Progress { @@ -61,15 +100,21 @@ func (eq *EngineQueue) Progress() Progress { func (eq *EngineQueue) SetUnsafeHead(head eth.L2BlockRef) { eq.unsafeHead = head + eq.metrics.RecordL2Ref("l2_unsafe", head) } func (eq *EngineQueue) AddUnsafePayload(payload *eth.ExecutionPayload) { - if len(eq.unsafePayloads) > maxUnsafePayloads { - eq.log.Debug("Refusing to add unsafe payload", "hash", payload.BlockHash, "number", uint64(payload.BlockNumber)) - return // don't DoS ourselves by buffering too many unsafe payloads + if payload == nil { + eq.log.Warn("cannot add nil unsafe payload") + return } - eq.log.Trace("Adding unsafe payload", "hash", payload.BlockHash, "number", uint64(payload.BlockNumber), "timestamp", uint64(payload.Timestamp)) - eq.unsafePayloads = append(eq.unsafePayloads, payload) + if err := eq.unsafePayloads.Push(payload); err != nil { + eq.log.Warn("Could not add unsafe payload", "id", payload.ID(), "timestamp", uint64(payload.Timestamp), "err", err) + return + } + p := eq.unsafePayloads.Peek() + eq.metrics.RecordUnsafePayloadsBuffer(uint64(eq.unsafePayloads.Len()), eq.unsafePayloads.MemSize(), p.ID()) + eq.log.Trace("Next unsafe payload to process", "next", p.ID(), "timestamp", uint64(p.Timestamp)) } func (eq *EngineQueue) AddSafeAttributes(attributes *eth.PayloadAttributes) { @@ -78,7 +123,8 @@ func (eq *EngineQueue) AddSafeAttributes(attributes *eth.PayloadAttributes) { } func (eq *EngineQueue) Finalize(l1Origin eth.BlockID) { - eq.toFinalize = l1Origin + eq.finalizedL1 = l1Origin + eq.tryFinalizeL2() } func (eq *EngineQueue) Finalized() eth.L2BlockRef { @@ -104,51 +150,86 @@ func (eq *EngineQueue) Step(ctx context.Context, outer Progress) error { if changed, err := eq.progress.Update(outer); err != nil || changed { return err } - - // TODO: check if engine unsafehead/safehead/finalized data match, return error and reset pipeline if not. - // maybe better to do in the driver instead. - - // TODO: implement finalization - //if eq.finalized.ID() != eq.toFinalize { - // return eq.tryFinalize(ctx) - //} if len(eq.safeAttributes) > 0 { return eq.tryNextSafeAttributes(ctx) } - if len(eq.unsafePayloads) > 0 { + if eq.unsafePayloads.Len() > 0 { return eq.tryNextUnsafePayload(ctx) } return io.EOF } -// TODO: implement finalization -//func (eq *EngineQueue) tryFinalize(ctx context.Context) error { -// // find last l2 block ref that references the toFinalize origin, and is lower or equal to the safehead -// var finalizedL2 eth.L2BlockRef -// eq.finalized = finalizedL2 -// return nil -//} +// tryFinalizeL2 traverses the past L1 blocks, checks if any has been finalized, +// and then marks the latest fully derived L2 block from this as finalized, +// or defaults to the current finalized L2 block. +func (eq *EngineQueue) tryFinalizeL2() { + if eq.finalizedL1 == (eth.BlockID{}) { + return // if no L1 information is finalized yet, then skip this + } + // default to keep the same finalized block + finalizedL2 := eq.finalized + // go through the latest inclusion data, and find the last L2 block that was derived from a finalized L1 block + for _, fd := range eq.finalityData { + if fd.L2Block.Number > finalizedL2.Number && fd.L1Block.Number <= eq.finalizedL1.Number { + finalizedL2 = fd.L2Block + } + } + eq.finalized = finalizedL2 +} + +// postProcessSafeL2 buffers the L1 block the safe head was fully derived from, +// to finalize it once the L1 block, or later, finalizes. +func (eq *EngineQueue) postProcessSafeL2() { + // prune finality data if necessary + if len(eq.finalityData) >= finalityLookback { + eq.finalityData = append(eq.finalityData[:0], eq.finalityData[1:finalityLookback]...) + } + // remember the last L2 block that we fully derived from the given finality data + if len(eq.finalityData) == 0 || eq.finalityData[len(eq.finalityData)-1].L1Block.Number < eq.progress.Origin.Number { + // append entry for new L1 block + eq.finalityData = append(eq.finalityData, FinalityData{ + L2Block: eq.safeHead, + L1Block: eq.progress.Origin.ID(), + }) + } else { + // if it's a now L2 block that was derived from the same latest L1 block, then just update the entry + eq.finalityData[len(eq.finalityData)-1].L2Block = eq.safeHead + } +} + +func (eq *EngineQueue) logSyncProgress(reason string) { + eq.log.Info("Sync progress", + "reason", reason, + "l2_finalized", eq.finalized, + "l2_safe", eq.safeHead, + "l2_unsafe", eq.unsafeHead, + "l2_time", eq.unsafeHead.Time, + "l1_derived", eq.progress.Origin, + ) +} func (eq *EngineQueue) tryNextUnsafePayload(ctx context.Context) error { - first := eq.unsafePayloads[0] + first := eq.unsafePayloads.Peek() if uint64(first.BlockNumber) <= eq.safeHead.Number { eq.log.Info("skipping unsafe payload, since it is older than safe head", "safe", eq.safeHead.ID(), "unsafe", first.ID(), "payload", first.ID()) - eq.unsafePayloads = eq.unsafePayloads[1:] + eq.unsafePayloads.Pop() return nil } // TODO: once we support snap-sync we can remove this condition, and handle the "SYNCING" status of the execution engine. if first.ParentHash != eq.unsafeHead.Hash { - eq.log.Info("skipping unsafe payload, since it does not build onto the existing unsafe chain", "safe", eq.safeHead.ID(), "unsafe", first.ID(), "payload", first.ID()) - eq.unsafePayloads = eq.unsafePayloads[1:] - return nil + if uint64(first.BlockNumber) == eq.unsafeHead.Number+1 { + eq.log.Info("skipping unsafe payload, since it does not build onto the existing unsafe chain", "safe", eq.safeHead.ID(), "unsafe", first.ID(), "payload", first.ID()) + eq.unsafePayloads.Pop() + } + return io.EOF // time to go to next stage if we cannot process the first unsafe payload } ref, err := PayloadToBlockRef(first, &eq.cfg.Genesis) if err != nil { eq.log.Error("failed to decode L2 block ref from payload", "err", err) - eq.unsafePayloads = eq.unsafePayloads[1:] + eq.unsafePayloads.Pop() return nil } @@ -163,25 +244,37 @@ func (eq *EngineQueue) tryNextUnsafePayload(ctx context.Context) error { } fcRes, err := eq.engine.ForkchoiceUpdate(ctx, &fc, nil) if err != nil { - return NewTemporaryError(fmt.Errorf("failed to update forkchoice to prepare for new unsafe payload: %v", err)) + var inputErr eth.InputError + if errors.As(err, &inputErr) { + switch inputErr.Code { + case eth.InvalidForkchoiceState: + return NewResetError(fmt.Errorf("pre-unsafe-block forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap())) + default: + return NewTemporaryError(fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err)) + } + } else { + return NewTemporaryError(fmt.Errorf("failed to update forkchoice to prepare for new unsafe payload: %w", err)) + } } if fcRes.PayloadStatus.Status != eth.ExecutionValid { - eq.unsafePayloads = eq.unsafePayloads[1:] - return NewTemporaryError(fmt.Errorf("cannot prepare unsafe chain for new payload: new - %v; parent: %v; err: %v", + eq.unsafePayloads.Pop() + return NewTemporaryError(fmt.Errorf("cannot prepare unsafe chain for new payload: new - %v; parent: %v; err: %w", first.ID(), first.ParentID(), eth.ForkchoiceUpdateErr(fcRes.PayloadStatus))) } status, err := eq.engine.NewPayload(ctx, first) if err != nil { - return NewTemporaryError(fmt.Errorf("failed to update insert payload: %v", err)) + return NewTemporaryError(fmt.Errorf("failed to update insert payload: %w", err)) } if status.Status != eth.ExecutionValid { - eq.unsafePayloads = eq.unsafePayloads[1:] - return NewTemporaryError(fmt.Errorf("cannot process unsafe payload: new - %v; parent: %v; err: %v", + eq.unsafePayloads.Pop() + return NewTemporaryError(fmt.Errorf("cannot process unsafe payload: new - %v; parent: %v; err: %w", first.ID(), first.ParentID(), eth.ForkchoiceUpdateErr(fcRes.PayloadStatus))) } eq.unsafeHead = ref - eq.unsafePayloads = eq.unsafePayloads[1:] + eq.unsafePayloads.Pop() + eq.metrics.RecordL2Ref("l2_unsafe", ref) eq.log.Trace("Executed unsafe payload", "hash", ref.Hash, "number", ref.Number, "timestamp", ref.Time, "l1Origin", ref.L1Origin) + eq.logSyncProgress("unsafe payload from sequencer") return nil } @@ -195,6 +288,7 @@ func (eq *EngineQueue) tryNextSafeAttributes(ctx context.Context) error { // For some reason the unsafe head is behind the safe head. Log it, and correct it. eq.log.Error("invalid sync state, unsafe head is behind safe head", "unsafe", eq.unsafeHead, "safe", eq.safeHead) eq.unsafeHead = eq.safeHead + eq.metrics.RecordL2Ref("l2_unsafe", eq.unsafeHead) return nil } } @@ -208,7 +302,7 @@ func (eq *EngineQueue) consolidateNextSafeAttributes(ctx context.Context) error payload, err := eq.engine.PayloadByNumber(ctx, eq.safeHead.Number+1) if err != nil { - return NewTemporaryError(fmt.Errorf("failed to get existing unsafe payload to compare against derived attributes from L1: %v", err)) + return NewTemporaryError(fmt.Errorf("failed to get existing unsafe payload to compare against derived attributes from L1: %w", err)) } if err := AttributesMatchBlock(eq.safeAttributes[0], eq.safeHead.Hash, payload); err != nil { eq.log.Warn("L2 reorg: existing unsafe block does not match derived attributes from L1", "err", err) @@ -217,12 +311,14 @@ func (eq *EngineQueue) consolidateNextSafeAttributes(ctx context.Context) error } ref, err := PayloadToBlockRef(payload, &eq.cfg.Genesis) if err != nil { - return NewResetError(fmt.Errorf("failed to decode L2 block ref from payload: %v", err)) + return NewResetError(fmt.Errorf("failed to decode L2 block ref from payload: %w", err)) } eq.safeHead = ref + eq.metrics.RecordL2Ref("l2_safe", ref) // unsafe head stays the same, we did not reorg the chain. eq.safeAttributes = eq.safeAttributes[1:] - eq.log.Trace("Reconciled safe payload", "hash", ref.Hash, "number", ref.Number, "timestamp", ref.Time, "l1Origin", ref.L1Origin) + eq.postProcessSafeL2() + eq.logSyncProgress("reconciled with L1") return nil } @@ -238,36 +334,45 @@ func (eq *EngineQueue) forceNextSafeAttributes(ctx context.Context) error { FinalizedBlockHash: eq.finalized.Hash, } attrs := eq.safeAttributes[0] - payload, rpcErr, payloadErr := InsertHeadBlock(ctx, eq.log, eq.engine, fc, attrs, true) - if rpcErr != nil { - // RPC errors are recoverable, we can retry the buffered payload attributes later. - return NewTemporaryError(fmt.Errorf("failed to insert new block: %v", rpcErr)) - } - if payloadErr != nil { - eq.log.Warn("could not process payload derived from L1 data", "err", payloadErr) - // filter everything but the deposits - var deposits []hexutil.Bytes - for _, tx := range attrs.Transactions { - if len(tx) > 0 && tx[0] == types.DepositTxType { - deposits = append(deposits, tx) + payload, errType, err := InsertHeadBlock(ctx, eq.log, eq.engine, fc, attrs, true) + if err != nil { + switch errType { + case BlockInsertTemporaryErr: + // RPC errors are recoverable, we can retry the buffered payload attributes later. + return NewTemporaryError(fmt.Errorf("temporarily cannot insert new safe block: %w", err)) + case BlockInsertPrestateErr: + return NewResetError(fmt.Errorf("need reset to resolve pre-state problem: %w", err)) + case BlockInsertPayloadErr: + eq.log.Warn("could not process payload derived from L1 data", "err", err) + // filter everything but the deposits + var deposits []hexutil.Bytes + for _, tx := range attrs.Transactions { + if len(tx) > 0 && tx[0] == types.DepositTxType { + deposits = append(deposits, tx) + } } + if len(attrs.Transactions) > len(deposits) { + eq.log.Warn("dropping sequencer transactions from payload for re-attempt, batcher may have included invalid transactions", + "txs", len(attrs.Transactions), "deposits", len(deposits), "parent", eq.safeHead) + eq.safeAttributes[0].Transactions = deposits + return nil + } + return NewCriticalError(fmt.Errorf("failed to process block with only deposit transactions: %w", err)) + default: + return NewCriticalError(fmt.Errorf("unknown InsertHeadBlock error type %d: %w", errType, err)) } - if len(attrs.Transactions) > len(deposits) { - eq.log.Warn("dropping sequencer transactions from payload for re-attempt, batcher may have included invalid transactions", - "txs", len(attrs.Transactions), "deposits", len(deposits), "parent", eq.safeHead) - eq.safeAttributes[0].Transactions = deposits - return nil - } - return NewCriticalError(fmt.Errorf("failed to process block with only deposit transactions: %w", payloadErr)) } ref, err := PayloadToBlockRef(payload, &eq.cfg.Genesis) if err != nil { - return NewTemporaryError(fmt.Errorf("failed to decode L2 block ref from payload: %v", err)) + return NewTemporaryError(fmt.Errorf("failed to decode L2 block ref from payload: %w", err)) } eq.safeHead = ref eq.unsafeHead = ref + eq.metrics.RecordL2Ref("l2_safe", ref) + eq.metrics.RecordL2Ref("l2_unsafe", ref) eq.safeAttributes = eq.safeAttributes[1:] - eq.log.Trace("Inserted safe block", "hash", ref.Hash, "number", ref.Number, "timestamp", ref.Time, "l1Origin", ref.L1Origin) + eq.postProcessSafeL2() + eq.logSyncProgress("processed safe block derived from L1") return nil } @@ -275,6 +380,14 @@ func (eq *EngineQueue) forceNextSafeAttributes(ctx context.Context) error { // ResetStep Walks the L2 chain backwards until it finds an L2 block whose L1 origin is canonical. // The unsafe head is set to the head of the L2 chain, unless the existing safe head is not canonical. func (eq *EngineQueue) ResetStep(ctx context.Context, l1Fetcher L1Fetcher) error { + finalized, err := eq.engine.L2BlockRefByLabel(ctx, eth.Finalized) + if errors.Is(err, ethereum.NotFound) { + // default to genesis if we have not finalized anything before. + finalized, err = eq.engine.L2BlockRefByHash(ctx, eq.cfg.Genesis.L2.Hash) + } + if err != nil { + return NewTemporaryError(fmt.Errorf("failed to find the finalized L2 block: %w", err)) + } // TODO: this should be resetting using the safe head instead. Out of scope for L2 client bindings PR. prevUnsafe, err := eq.engine.L2BlockRefByLabel(ctx, eth.Unsafe) if err != nil { @@ -286,7 +399,7 @@ func (eq *EngineQueue) ResetStep(ctx context.Context, l1Fetcher L1Fetcher) error } l1Origin, err := l1Fetcher.L1BlockRefByHash(ctx, safe.L1Origin.Hash) if err != nil { - return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %v; err: %v", safe.L1Origin, err)) + return NewTemporaryError(fmt.Errorf("failed to fetch the new L1 progress: origin: %v; err: %w", safe.L1Origin, err)) } if safe.Time < l1Origin.Time { return NewResetError(fmt.Errorf("cannot reset block derivation to start at L2 block %s with time %d older than its L1 origin %s with time %d, time invariant is broken", @@ -295,9 +408,16 @@ func (eq *EngineQueue) ResetStep(ctx context.Context, l1Fetcher L1Fetcher) error eq.log.Debug("Reset engine queue", "safeHead", safe, "unsafe", unsafe, "safe_timestamp", safe.Time, "unsafe_timestamp", unsafe.Time, "l1Origin", l1Origin) eq.unsafeHead = unsafe eq.safeHead = safe + eq.finalized = finalized + eq.finalityData = eq.finalityData[:0] + // note: we do not clear the unsafe payloadds queue; if the payloads are not applicable anymore the parent hash checks will clear out the old payloads. eq.progress = Progress{ Origin: l1Origin, Closed: false, } + eq.metrics.RecordL2Ref("l2_finalized", finalized) + eq.metrics.RecordL2Ref("l2_safe", safe) + eq.metrics.RecordL2Ref("l2_unsafe", unsafe) + eq.logSyncProgress("reset derivation work") return io.EOF } diff --git a/op-node/rollup/derive/engine_queue_test.go b/op-node/rollup/derive/engine_queue_test.go new file mode 100644 index 0000000000000..103d44d4f663c --- /dev/null +++ b/op-node/rollup/derive/engine_queue_test.go @@ -0,0 +1,145 @@ +package derive + +import ( + "math/rand" + "testing" + + "github.com/ethereum-optimism/optimism/op-node/eth" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-node/testlog" + "github.com/ethereum-optimism/optimism/op-node/testutils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/stretchr/testify/require" +) + +func TestEngineQueue_Finalize(t *testing.T) { + logger := testlog.Logger(t, log.LvlInfo) + + rng := rand.New(rand.NewSource(1234)) + // create a short test L2 chain: + // + // L2: + // A0: genesis + // A1: finalized, incl in B + // B0: safe, incl in C + // B1: not yet included in L1 + // C0: head, not included in L1 yet + // + // L1: + // A: genesis + // B: finalized, incl A1 + // C: safe, incl B0 + // D: unsafe, not yet referenced by L2 + + l1Time := uint64(2) + refA := testutils.RandomBlockRef(rng) + + refB := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA.Number + 1, + ParentHash: refA.Hash, + Time: refA.Time + l1Time, + } + refC := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refB.Number + 1, + ParentHash: refB.Hash, + Time: refB.Time + l1Time, + } + refD := eth.L1BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refC.Number + 1, + ParentHash: refC.Hash, + Time: refC.Time + l1Time, + } + + refA0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: 0, + ParentHash: common.Hash{}, + Time: refA.Time, + L1Origin: refA.ID(), + SequenceNumber: 0, + } + cfg := &rollup.Config{ + Genesis: rollup.Genesis{ + L1: refA.ID(), + L2: refA0.ID(), + L2Time: refA0.Time, + }, + BlockTime: 1, + SeqWindowSize: 2, + } + refA1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA0.Number + 1, + ParentHash: refA0.Hash, + Time: refA0.Time + cfg.BlockTime, + L1Origin: refA.ID(), + SequenceNumber: 1, + } + refB0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refA1.Number + 1, + ParentHash: refA1.Hash, + Time: refA1.Time + cfg.BlockTime, + L1Origin: refB.ID(), + SequenceNumber: 0, + } + refB1 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refB0.Number + 1, + ParentHash: refB0.Hash, + Time: refB0.Time + cfg.BlockTime, + L1Origin: refB.ID(), + SequenceNumber: 1, + } + refC0 := eth.L2BlockRef{ + Hash: testutils.RandomHash(rng), + Number: refB1.Number + 1, + ParentHash: refB1.Hash, + Time: refB1.Time + cfg.BlockTime, + L1Origin: refC.ID(), + SequenceNumber: 0, + } + + metrics := &TestMetrics{} + eng := &testutils.MockEngine{} + eng.ExpectL2BlockRefByLabel(eth.Finalized, refA1, nil) + // TODO(Proto): update expectation once we're using safe block label properly for sync starting point + eng.ExpectL2BlockRefByLabel(eth.Unsafe, refC0, nil) + + // we find the common point to initialize to by comparing the L1 origins in the L2 chain with the L1 chain + l1F := &testutils.MockL1Source{} + l1F.ExpectL1BlockRefByLabel(eth.Unsafe, refD, nil) + l1F.ExpectL1BlockRefByNumber(refC0.L1Origin.Number, refC, nil) + eng.ExpectL2BlockRefByHash(refC0.ParentHash, refB1, nil) // good L1 origin + eng.ExpectL2BlockRefByHash(refB1.ParentHash, refB0, nil) // need a block with seqnr == 0, don't stop at above + l1F.ExpectL1BlockRefByHash(refB0.L1Origin.Hash, refB, nil) // the origin of the safe L2 head will be the L1 starting point for derivation. + + eq := NewEngineQueue(logger, cfg, eng, metrics) + require.NoError(t, RepeatResetStep(t, eq.ResetStep, l1F, 3)) + + // TODO(proto): this is changing, needs to be a sequence window ago, but starting traversal back from safe block, + // safe blocks with canon origin are good, but we go back a full window to ensure they are all included in L1, + // by forcing them to be consolidated with L1 again. + require.Equal(t, eq.SafeL2Head(), refB0, "L2 reset should go back to sequence window ago") + + require.Equal(t, refA1, eq.Finalized(), "A1 is recognized as finalized before we run any steps") + + // we are not adding blocks in this test, + // but we can still trigger post-processing for the already existing safe head, + // so the engine can prepare to finalize that. + eq.postProcessSafeL2() + // let's finalize C, which included B0, but not B1 + eq.Finalize(refC.ID()) + + // Now a few steps later, without consuming any additional L1 inputs, + // we should be able to resolve that B0 is now finalized + require.NoError(t, RepeatStep(t, eq.Step, eq.progress, 10)) + require.Equal(t, refB0, eq.Finalized(), "B0 was included in finalized C, and should now be finalized") + + l1F.AssertExpectations(t) + eng.AssertExpectations(t) +} diff --git a/op-node/rollup/derive/engine_update.go b/op-node/rollup/derive/engine_update.go index 804a41e756194..0f37052e7fc00 100644 --- a/op-node/rollup/derive/engine_update.go +++ b/op-node/rollup/derive/engine_update.go @@ -65,43 +65,69 @@ func sanityCheckPayload(payload *eth.ExecutionPayload) error { return nil } +type BlockInsertionErrType uint + +const ( + BlockInsertOK BlockInsertionErrType = iota + BlockInsertTemporaryErr + BlockInsertPrestateErr + BlockInsertPayloadErr +) + // InsertHeadBlock creates, executes, and inserts the specified block as the head block. // It first uses the given FC to start the block creation process and then after the payload is executed, // sets the FC to the same safe and finalized hashes, but updates the head hash to the new block. // If updateSafe is true, the head block is considered to be the safe head as well as the head. // It returns the payload, an RPC error (if the payload might still be valid), and a payload error (if the payload was not valid) -func InsertHeadBlock(ctx context.Context, log log.Logger, eng Engine, fc eth.ForkchoiceState, attrs *eth.PayloadAttributes, updateSafe bool) (out *eth.ExecutionPayload, rpcErr error, payloadErr error) { +func InsertHeadBlock(ctx context.Context, log log.Logger, eng Engine, fc eth.ForkchoiceState, attrs *eth.PayloadAttributes, updateSafe bool) (out *eth.ExecutionPayload, errTyp BlockInsertionErrType, err error) { fcRes, err := eng.ForkchoiceUpdate(ctx, &fc, attrs) if err != nil { - return nil, fmt.Errorf("failed to create new block via forkchoice: %w", err), nil - } - if fcRes.PayloadStatus.Status == eth.ExecutionInvalid || fcRes.PayloadStatus.Status == eth.ExecutionInvalidBlockHash { - return nil, nil, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) + var inputErr eth.InputError + if errors.As(err, &inputErr) { + switch inputErr.Code { + case eth.InvalidForkchoiceState: + return nil, BlockInsertPrestateErr, fmt.Errorf("pre-block-creation forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap()) + case eth.InvalidPayloadAttributes: + return nil, BlockInsertPayloadErr, fmt.Errorf("payload attributes are not valid, cannot build block: %w", inputErr.Unwrap()) + default: + return nil, BlockInsertPrestateErr, fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err) + } + } else { + return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to create new block via forkchoice: %w", err) + } } - if fcRes.PayloadStatus.Status != eth.ExecutionValid { - return nil, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus), nil + + switch fcRes.PayloadStatus.Status { + // TODO(proto): snap sync - specify explicit different error type if node is syncing + case eth.ExecutionInvalid, eth.ExecutionInvalidBlockHash: + return nil, BlockInsertPayloadErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) + case eth.ExecutionValid: + break + default: + return nil, BlockInsertTemporaryErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) } id := fcRes.PayloadID if id == nil { - return nil, errors.New("nil id in forkchoice result when expecting a valid ID"), nil + return nil, BlockInsertTemporaryErr, errors.New("nil id in forkchoice result when expecting a valid ID") } payload, err := eng.GetPayload(ctx, *id) if err != nil { - return nil, fmt.Errorf("failed to get execution payload: %w", err), nil + // even if it is an input-error (unknown payload ID), it is temporary, since we will re-attempt the full payload building, not just the retrieval of the payload. + return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to get execution payload: %w", err) } if err := sanityCheckPayload(payload); err != nil { - return nil, nil, err + return nil, BlockInsertPayloadErr, err } status, err := eng.NewPayload(ctx, payload) if err != nil { - return nil, fmt.Errorf("failed to insert execution payload: %w", err), nil + return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to insert execution payload: %w", err) } if status.Status == eth.ExecutionInvalid || status.Status == eth.ExecutionInvalidBlockHash { - return nil, nil, eth.NewPayloadErr(payload, status) + return nil, BlockInsertPayloadErr, eth.NewPayloadErr(payload, status) } if status.Status != eth.ExecutionValid { - return nil, eth.NewPayloadErr(payload, status), nil + return nil, BlockInsertTemporaryErr, eth.NewPayloadErr(payload, status) } fc.HeadBlockHash = payload.BlockHash @@ -110,14 +136,25 @@ func InsertHeadBlock(ctx context.Context, log log.Logger, eng Engine, fc eth.For } fcRes, err = eng.ForkchoiceUpdate(ctx, &fc, nil) if err != nil { - return nil, fmt.Errorf("failed to make the new L2 block canonical via forkchoice: %w", err), nil + var inputErr eth.InputError + if errors.As(err, &inputErr) { + switch inputErr.Code { + case eth.InvalidForkchoiceState: + // if we succeed to update the forkchoice pre-payload, but fail post-payload, then it is a payload error + return nil, BlockInsertPayloadErr, fmt.Errorf("post-block-creation forkchoice update was inconsistent with engine, need reset to resolve: %w", inputErr.Unwrap()) + default: + return nil, BlockInsertPrestateErr, fmt.Errorf("unexpected error code in forkchoice-updated response: %w", err) + } + } else { + return nil, BlockInsertTemporaryErr, fmt.Errorf("failed to make the new L2 block canonical via forkchoice: %w", err) + } } if fcRes.PayloadStatus.Status != eth.ExecutionValid { - return nil, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus), nil + return nil, BlockInsertPayloadErr, eth.ForkchoiceUpdateErr(fcRes.PayloadStatus) } log.Info("inserted block", "hash", payload.BlockHash, "number", uint64(payload.BlockNumber), "state_root", payload.StateRoot, "timestamp", uint64(payload.Timestamp), "parent", payload.ParentHash, "prev_randao", payload.PrevRandao, "fee_recipient", payload.FeeRecipient, "txs", len(payload.Transactions), "update_safe", updateSafe) - return payload, nil, nil + return payload, BlockInsertOK, nil } diff --git a/op-node/rollup/derive/frame.go b/op-node/rollup/derive/frame.go index 44d706afa314c..09ec0d9e6cd87 100644 --- a/op-node/rollup/derive/frame.go +++ b/op-node/rollup/derive/frame.go @@ -17,9 +17,7 @@ const MaxFrameLen = 1_000_000 // // frame = channel_id ++ frame_number ++ frame_data_length ++ frame_data ++ is_last // -// channel_id = random ++ timestamp -// random = bytes32 -// timestamp = uint64 +// channel_id = bytes16 // frame_number = uint16 // frame_data_length = uint32 // frame_data = bytes @@ -36,13 +34,10 @@ type Frame struct { // It returns any errors encountered while writing, but // generally expects the writer very rarely fail. func (f *Frame) MarshalBinary(w io.Writer) error { - _, err := w.Write(f.ID.Data[:]) + _, err := w.Write(f.ID[:]) if err != nil { return err } - if err := binary.Write(w, binary.BigEndian, f.ID.Time); err != nil { - return err - } if err := binary.Write(w, binary.BigEndian, f.FrameNumber); err != nil { return err } @@ -74,13 +69,9 @@ type ByteReader interface { // If `r` fails a read, it returns the error from the reader // The reader will be left in a partially read state. func (f *Frame) UnmarshalBinary(r ByteReader) error { - if _, err := io.ReadFull(r, f.ID.Data[:]); err != nil { + if _, err := io.ReadFull(r, f.ID[:]); err != nil { return fmt.Errorf("error reading ID: %w", err) } - if err := binary.Read(r, binary.BigEndian, &f.ID.Time); err != nil { - return fmt.Errorf("error reading ID time: %w", err) - } - if err := binary.Read(r, binary.BigEndian, &f.FrameNumber); err != nil { return fmt.Errorf("error reading frame number: %w", err) } diff --git a/op-node/rollup/derive/l1_block_info.go b/op-node/rollup/derive/l1_block_info.go index 38afe3333a9c1..49fa4c43fc136 100644 --- a/op-node/rollup/derive/l1_block_info.go +++ b/op-node/rollup/derive/l1_block_info.go @@ -120,12 +120,12 @@ func L1InfoDeposit(seqNumber uint64, block eth.BlockInfo) (*types.DepositTx, err func L1InfoDepositBytes(seqNumber uint64, l1Info eth.BlockInfo) ([]byte, error) { dep, err := L1InfoDeposit(seqNumber, l1Info) if err != nil { - return nil, fmt.Errorf("failed to create L1 info tx: %v", err) + return nil, fmt.Errorf("failed to create L1 info tx: %w", err) } l1Tx := types.NewTx(dep) opaqueL1Tx, err := l1Tx.MarshalBinary() if err != nil { - return nil, fmt.Errorf("failed to encode L1 info tx: %v", err) + return nil, fmt.Errorf("failed to encode L1 info tx: %w", err) } return opaqueL1Tx, nil } diff --git a/op-node/rollup/derive/params.go b/op-node/rollup/derive/params.go index 56c39aa55d995..b660c4896f231 100644 --- a/op-node/rollup/derive/params.go +++ b/op-node/rollup/derive/params.go @@ -1,10 +1,8 @@ package derive import ( - "encoding/hex" "errors" "fmt" - "strconv" ) // count the tagging info as 200 in terms of buffer size. @@ -20,50 +18,17 @@ const MaxChannelBankSize = 100_000_000 // DuplicateErr is returned when a newly read frame is already known var DuplicateErr = errors.New("duplicate frame") -// ChannelIDDataSize defines the length of the channel ID data part -const ChannelIDDataSize = 32 +// ChannelIDLength defines the length of the channel IDs +const ChannelIDLength = 16 -// ChannelID identifies a "channel" a stream encoding a sequence of L2 information. -// A channelID is part random data (this may become a hash commitment to restrict who opens which channel), -// and part timestamp. The timestamp invalidates the ID, -// to ensure channels cannot be re-opened after timeout, or opened too soon. -// -// The ChannelID type is flat and can be used as map key. -type ChannelID struct { - Data [ChannelIDDataSize]byte - Time uint64 -} +// ChannelID is an opaque identifier for a channel. It is 128 bits to be globally unique. +type ChannelID [ChannelIDLength]byte func (id ChannelID) String() string { - return fmt.Sprintf("%x:%d", id.Data[:], id.Time) -} - -func (id ChannelID) MarshalText() ([]byte, error) { - return []byte(id.String()), nil -} - -func (id *ChannelID) UnmarshalText(text []byte) error { - if id == nil { - return errors.New("cannot unmarshal text into nil Channel ID") - } - if len(text) < ChannelIDDataSize+1 { - return fmt.Errorf("channel ID too short: %d", len(text)) - } - if _, err := hex.Decode(id.Data[:], text[:ChannelIDDataSize]); err != nil { - return fmt.Errorf("failed to unmarshal hex data part of channel ID: %v", err) - } - if c := text[ChannelIDDataSize*2]; c != ':' { - return fmt.Errorf("expected : separator in channel ID, but got %d", c) - } - v, err := strconv.ParseUint(string(text[ChannelIDDataSize*2+1:]), 10, 64) - if err != nil { - return fmt.Errorf("failed to unmarshal decimal time part of channel ID: %v", err) - } - id.Time = v - return nil + return fmt.Sprintf("%x", id[:]) } // TerminalString implements log.TerminalStringer, formatting a string for console output during logging. func (id ChannelID) TerminalString() string { - return fmt.Sprintf("%x..%x-%d", id.Data[:3], id.Data[29:], id.Time) + return fmt.Sprintf("%x..%x", id[:3], id[13:]) } diff --git a/op-node/rollup/derive/payload_util.go b/op-node/rollup/derive/payload_util.go index fbe058313a2f7..a999408a9bb56 100644 --- a/op-node/rollup/derive/payload_util.go +++ b/op-node/rollup/derive/payload_util.go @@ -25,14 +25,14 @@ func PayloadToBlockRef(payload *eth.ExecutionPayload, genesis *rollup.Genesis) ( } var tx types.Transaction if err := tx.UnmarshalBinary(payload.Transactions[0]); err != nil { - return eth.L2BlockRef{}, fmt.Errorf("failed to decode first tx to read l1 info from: %v", err) + return eth.L2BlockRef{}, fmt.Errorf("failed to decode first tx to read l1 info from: %w", err) } if tx.Type() != types.DepositTxType { return eth.L2BlockRef{}, fmt.Errorf("first payload tx has unexpected tx type: %d", tx.Type()) } info, err := L1InfoDepositTxData(tx.Data()) if err != nil { - return eth.L2BlockRef{}, fmt.Errorf("failed to parse L1 info deposit tx from L2 block: %v", err) + return eth.L2BlockRef{}, fmt.Errorf("failed to parse L1 info deposit tx from L2 block: %w", err) } l1Origin = eth.BlockID{Hash: info.BlockHash, Number: info.Number} sequenceNumber = info.SequenceNumber diff --git a/op-node/rollup/derive/payloads_queue.go b/op-node/rollup/derive/payloads_queue.go new file mode 100644 index 0000000000000..d71ccf8c90409 --- /dev/null +++ b/op-node/rollup/derive/payloads_queue.go @@ -0,0 +1,136 @@ +package derive + +import ( + "container/heap" + "errors" + "fmt" + + "github.com/ethereum-optimism/optimism/op-node/eth" +) + +type payloadAndSize struct { + payload *eth.ExecutionPayload + size uint64 +} + +// payloadsByNumber buffers payloads ordered by block number. +// The lowest block number is peeked/popped first. +// +// payloadsByNumber implements heap.Interface: use the heap package methods to modify the queue. +type payloadsByNumber []payloadAndSize + +var _ heap.Interface = (*payloadsByNumber)(nil) + +func (pq payloadsByNumber) Len() int { return len(pq) } + +func (pq payloadsByNumber) Less(i, j int) bool { + return pq[i].payload.BlockNumber < pq[j].payload.BlockNumber +} + +// Swap is a heap.Interface method. Do not use this method directly. +func (pq payloadsByNumber) Swap(i, j int) { + pq[i], pq[j] = pq[j], pq[i] +} + +// Push is a heap.Interface method. Do not use this method directly, use heap.Push instead. +func (pq *payloadsByNumber) Push(x any) { + *pq = append(*pq, x.(payloadAndSize)) +} + +// Pop is a heap.Interface method. Do not use this method directly, use heap.Pop instead. +func (pq *payloadsByNumber) Pop() any { + old := *pq + n := len(old) + item := old[n-1] + old[n-1] = payloadAndSize{} // avoid memory leak + *pq = old[0 : n-1] + return item +} + +const ( + // ~580 bytes per payload, with some margin for overhead + payloadMemFixedCost uint64 = 600 + // 24 bytes per tx overhead (size of slice header in memory) + payloadTxMemOverhead uint64 = 24 +) + +func payloadMemSize(p *eth.ExecutionPayload) uint64 { + out := payloadMemFixedCost + if p == nil { + return out + } + // 24 byte overhead per tx + for _, tx := range p.Transactions { + out += uint64(len(tx)) + payloadTxMemOverhead + } + return out +} + +// PayloadsQueue buffers payloads by block number. +// PayloadsQueue is not safe to use concurrently. +// PayloadsQueue exposes typed Push/Peek/Pop methods to use the queue, +// without the need to use heap.Push/heap.Pop as caller. +// PayloadsQueue maintains a MaxSize by counting and tracking sizes of added eth.ExecutionPayload entries. +// When the size grows too large, the first (lowest block-number) payload is removed from the queue. +// PayloadsQueue allows entries with same block number, or even full duplicates. +type PayloadsQueue struct { + pq payloadsByNumber + currentSize uint64 + MaxSize uint64 + SizeFn func(p *eth.ExecutionPayload) uint64 +} + +func (upq *PayloadsQueue) Len() int { + return len(upq.pq) +} + +func (upq *PayloadsQueue) MemSize() uint64 { + return upq.currentSize +} + +// Push adds the payload to the queue, in O(log(N)). +// +// Don't DoS ourselves by buffering too many unsafe payloads. +// If the queue size after pushing exceed the allowed memory, then pop payloads until memory is not exceeding anymore. +// +// We prefer higher block numbers over lower block numbers, since lower block numbers are more likely to be conflicts and/or read from L1 sooner. +// The higher payload block numbers can be preserved, and once L1 contents meets these, they can all be processed in order. +func (upq *PayloadsQueue) Push(p *eth.ExecutionPayload) error { + if p == nil { + return errors.New("cannot add nil payload") + } + size := upq.SizeFn(p) + if size > upq.MaxSize { + return fmt.Errorf("cannot add payload %s, payload mem size %d is larger than max queue size %d", p.ID(), size, upq.MaxSize) + } + heap.Push(&upq.pq, payloadAndSize{ + payload: p, + size: size, + }) + upq.currentSize += size + for upq.currentSize > upq.MaxSize { + upq.Pop() + } + return nil +} + +// Peek retrieves the payload with the lowest block number from the queue in O(1), or nil if the queue is empty. +func (upq *PayloadsQueue) Peek() *eth.ExecutionPayload { + if len(upq.pq) == 0 { + return nil + } + // peek into the priority queue, the first element is the highest priority (lowest block number). + // This does not apply to other elements, those are structured like a heap. + return upq.pq[0].payload +} + +// Pop removes the payload with the lowest block number from the queue in O(log(N)), +// and may return nil if the queue is empty. +func (upq *PayloadsQueue) Pop() *eth.ExecutionPayload { + if len(upq.pq) == 0 { + return nil + } + ps := heap.Pop(&upq.pq).(payloadAndSize) // nosemgrep + upq.currentSize -= ps.size + return ps.payload +} diff --git a/op-node/rollup/derive/payloads_queue_test.go b/op-node/rollup/derive/payloads_queue_test.go new file mode 100644 index 0000000000000..8b4deb21888f4 --- /dev/null +++ b/op-node/rollup/derive/payloads_queue_test.go @@ -0,0 +1,131 @@ +package derive + +import ( + "container/heap" + "testing" + + "github.com/ethereum-optimism/optimism/op-node/eth" + "github.com/stretchr/testify/require" +) + +func TestPayloadsByNumber(t *testing.T) { + p := payloadsByNumber{} + mk := func(i uint64) payloadAndSize { + return payloadAndSize{ + payload: ð.ExecutionPayload{ + BlockNumber: eth.Uint64Quantity(i), + }, + } + } + // add payload A, check it was added + a := mk(123) + heap.Push(&p, a) + require.Equal(t, p.Len(), 1) + require.Equal(t, p[0], a) + + // add payload B, check it was added in top-priority spot + b := mk(100) + heap.Push(&p, b) + require.Equal(t, p.Len(), 2) + require.Equal(t, p[0], b) + + // add payload C, check it did not get first like B, since block num is higher + c := mk(150) + heap.Push(&p, c) + require.Equal(t, p.Len(), 3) + require.Equal(t, p[0], b) // still b + + // pop b + heap.Pop(&p) + require.Equal(t, p.Len(), 2) + require.Equal(t, p[0], a) + + // pop a + heap.Pop(&p) + require.Equal(t, p.Len(), 1) + require.Equal(t, p[0], c) + + // pop c + heap.Pop(&p) + require.Equal(t, p.Len(), 0) + + // duplicate entry + heap.Push(&p, b) + require.Equal(t, p.Len(), 1) + heap.Push(&p, b) + require.Equal(t, p.Len(), 2) + heap.Pop(&p) + require.Equal(t, p.Len(), 1) +} + +func TestPayloadMemSize(t *testing.T) { + require.Equal(t, payloadMemFixedCost, payloadMemSize(nil), "nil is same fixed cost") + require.Equal(t, payloadMemFixedCost, payloadMemSize(ð.ExecutionPayload{}), "empty payload fixed cost") + require.Equal(t, payloadMemFixedCost+payloadTxMemOverhead, payloadMemSize(ð.ExecutionPayload{Transactions: []eth.Data{nil}}), "nil tx counts") + require.Equal(t, payloadMemFixedCost+payloadTxMemOverhead, payloadMemSize(ð.ExecutionPayload{Transactions: []eth.Data{make([]byte, 0)}}), "empty tx counts") + require.Equal(t, payloadMemFixedCost+4*payloadTxMemOverhead+42+1337+0+1, + payloadMemSize(ð.ExecutionPayload{Transactions: []eth.Data{ + make([]byte, 42), + make([]byte, 1337), + make([]byte, 0), + make([]byte, 1), + }}), "mixed txs") +} + +func TestPayloadsQueue(t *testing.T) { + pq := PayloadsQueue{ + MaxSize: payloadMemFixedCost * 3, + SizeFn: payloadMemSize, + } + require.Equal(t, 0, pq.Len()) + require.Equal(t, (*eth.ExecutionPayload)(nil), pq.Peek()) + require.Equal(t, (*eth.ExecutionPayload)(nil), pq.Pop()) + + a := ð.ExecutionPayload{BlockNumber: 3} + b := ð.ExecutionPayload{BlockNumber: 4} + c := ð.ExecutionPayload{BlockNumber: 5} + bAlt := ð.ExecutionPayload{BlockNumber: 4} + require.NoError(t, pq.Push(b)) + require.Equal(t, pq.Len(), 1) + require.Equal(t, pq.Peek(), b) + + require.Error(t, pq.Push(nil), "cannot add nil payloads") + + require.NoError(t, pq.Push(c)) + require.Equal(t, pq.Len(), 2) + require.Equal(t, pq.MemSize(), 2*payloadMemFixedCost) + require.Equal(t, pq.Peek(), b, "expecting b to still be the lowest number payload") + + require.NoError(t, pq.Push(a)) + require.Equal(t, pq.Len(), 3) + require.Equal(t, pq.MemSize(), 3*payloadMemFixedCost) + require.Equal(t, pq.Peek(), a, "expecting a to be new lowest number") + + require.Equal(t, pq.Pop(), a) + require.Equal(t, pq.Len(), 2, "expecting to pop the lowest") + + require.NoError(t, pq.Push(bAlt)) + require.Equal(t, pq.Len(), 3) + require.Equal(t, pq.Peek(), b, "expecting b to be lowest, compared to bAlt and c") + + require.Equal(t, pq.Pop(), b) + require.Equal(t, pq.Len(), 2) + require.Equal(t, pq.MemSize(), 2*payloadMemFixedCost) + + require.Equal(t, pq.Pop(), bAlt) + require.Equal(t, pq.Len(), 1) + require.Equal(t, pq.Peek(), c, "expecting c to only remain") + + d := ð.ExecutionPayload{BlockNumber: 5, Transactions: []eth.Data{make([]byte, payloadMemFixedCost*3+1)}} + require.Error(t, pq.Push(d), "cannot add payloads that are too large") + + require.NoError(t, pq.Push(b)) + require.Equal(t, pq.Len(), 2, "expecting b, c") + require.Equal(t, pq.Peek(), b) + require.NoError(t, pq.Push(a)) + require.Equal(t, pq.Len(), 3, "expecting a, b, c") + require.Equal(t, pq.Peek(), a) + require.NoError(t, pq.Push(bAlt)) + require.Equal(t, pq.Len(), 3, "expecting b, bAlt, c") + require.NotContainsf(t, pq.pq[:], a, "a should be dropped after 3 items already exist under max size constraint") +} diff --git a/op-node/rollup/derive/pipeline.go b/op-node/rollup/derive/pipeline.go index 98629253d4e75..17dd7d8805afa 100644 --- a/op-node/rollup/derive/pipeline.go +++ b/op-node/rollup/derive/pipeline.go @@ -10,6 +10,12 @@ import ( "github.com/ethereum/go-ethereum/log" ) +type Metrics interface { + RecordL1Ref(name string, ref eth.L1BlockRef) + RecordL2Ref(name string, ref eth.L2BlockRef) + RecordUnsafePayloadsBuffer(length uint64, memSize uint64, next eth.BlockID) +} + type L1Fetcher interface { L1BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L1BlockRef, error) L1BlockRefByNumberFetcher @@ -71,11 +77,13 @@ type DerivationPipeline struct { stages []Stage eng EngineQueueStage + + metrics Metrics } // NewDerivationPipeline creates a derivation pipeline, which should be reset before use. -func NewDerivationPipeline(log log.Logger, cfg *rollup.Config, l1Fetcher L1Fetcher, engine Engine) *DerivationPipeline { - eng := NewEngineQueue(log, cfg, engine) +func NewDerivationPipeline(log log.Logger, cfg *rollup.Config, l1Fetcher L1Fetcher, engine Engine, metrics Metrics) *DerivationPipeline { + eng := NewEngineQueue(log, cfg, engine, metrics) attributesQueue := NewAttributesQueue(log, cfg, l1Fetcher, eng) batchQueue := NewBatchQueue(log, cfg, attributesQueue) chInReader := NewChannelInReader(log, batchQueue) @@ -93,6 +101,7 @@ func NewDerivationPipeline(log log.Logger, cfg *rollup.Config, l1Fetcher L1Fetch active: 0, stages: stages, eng: eng, + metrics: metrics, } } @@ -137,6 +146,8 @@ func (dp *DerivationPipeline) AddUnsafePayload(payload *eth.ExecutionPayload) { // An error is expected when the underlying source closes. // When Step returns nil, it should be called again, to continue the derivation process. func (dp *DerivationPipeline) Step(ctx context.Context) error { + defer dp.metrics.RecordL1Ref("l1_derived", dp.Progress().Origin) + // if any stages need to be reset, do that first. if dp.resetting < len(dp.stages) { if err := dp.stages[dp.resetting].ResetStep(ctx, dp.l1Fetcher); err == io.EOF { diff --git a/op-node/rollup/derive/pipeline_test.go b/op-node/rollup/derive/pipeline_test.go index 9ac4bd9eca118..958de481f6b86 100644 --- a/op-node/rollup/derive/pipeline_test.go +++ b/op-node/rollup/derive/pipeline_test.go @@ -5,9 +5,9 @@ import ( "io" "testing" - "github.com/stretchr/testify/mock" - + "github.com/ethereum-optimism/optimism/op-node/eth" "github.com/ethereum-optimism/optimism/op-node/testutils" + "github.com/stretchr/testify/mock" ) var _ Engine = (*testutils.MockEngine)(nil) @@ -58,3 +58,31 @@ func RepeatStep(t *testing.T, step func(ctx context.Context, outer Progress) err t.Fatal("ran out of steps") return nil } + +// TestMetrics implements the metrics used in the derivation pipeline as no-op operations. +// Optionally a test may hook into the metrics +type TestMetrics struct { + recordL1Ref func(name string, ref eth.L1BlockRef) + recordL2Ref func(name string, ref eth.L2BlockRef) + recordUnsafePayloads func(length uint64, memSize uint64, next eth.BlockID) +} + +func (t *TestMetrics) RecordL1Ref(name string, ref eth.L1BlockRef) { + if t.recordL1Ref != nil { + t.recordL1Ref(name, ref) + } +} + +func (t *TestMetrics) RecordL2Ref(name string, ref eth.L2BlockRef) { + if t.recordL2Ref != nil { + t.recordL2Ref(name, ref) + } +} + +func (t *TestMetrics) RecordUnsafePayloadsBuffer(length uint64, memSize uint64, next eth.BlockID) { + if t.recordUnsafePayloads != nil { + t.recordUnsafePayloads(length, memSize, next) + } +} + +var _ Metrics = (*TestMetrics)(nil) diff --git a/op-node/rollup/driver/conf_depth.go b/op-node/rollup/driver/conf_depth.go index 365ef861b46aa..e308dfb93eb12 100644 --- a/op-node/rollup/driver/conf_depth.go +++ b/op-node/rollup/driver/conf_depth.go @@ -27,7 +27,7 @@ func NewConfDepth(depth uint64, l1Head func() eth.L1BlockRef, fetcher derive.L1F // Any block numbers that are within confirmation depth of the L1 head are mocked to be "not found", // effectively hiding the uncertain part of the L1 chain. func (c *confDepth) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1BlockRef, error) { - // TODO: performance optimization: buffer the l1Head, invalidate any reorged previous buffer content, + // TODO: performance optimization: buffer the l1Unsafe, invalidate any reorged previous buffer content, // and instantly return the origin by number from the buffer if we can. if num == 0 || c.depth == 0 || num+c.depth <= c.l1Head().Number { diff --git a/op-node/rollup/driver/driver.go b/op-node/rollup/driver/driver.go index a6a7453cc9fb9..15009c9c28a97 100644 --- a/op-node/rollup/driver/driver.go +++ b/op-node/rollup/driver/driver.go @@ -26,6 +26,8 @@ type Metrics interface { RecordL1Ref(name string, ref eth.L1BlockRef) RecordL2Ref(name string, ref eth.L2BlockRef) + RecordUnsafePayloadsBuffer(length uint64, memSize uint64, next eth.BlockID) + SetDerivationIdle(idle bool) RecordL1ReorgDepth(d uint64) @@ -79,7 +81,7 @@ func NewDriver(driverCfg *Config, cfg *rollup.Config, l2 L2Chain, l1 L1Chain, ne var state *state verifConfDepth := NewConfDepth(driverCfg.VerifierConfDepth, func() eth.L1BlockRef { return state.l1Head }, l1) - derivationPipeline := derive.NewDerivationPipeline(log, cfg, verifConfDepth, l2) + derivationPipeline := derive.NewDerivationPipeline(log, cfg, verifConfDepth, l2, metrics) state = NewState(driverCfg, log, snapshotLog, cfg, l1, l2, output, derivationPipeline, network, metrics) return &Driver{s: state} } @@ -88,6 +90,14 @@ func (d *Driver) OnL1Head(ctx context.Context, head eth.L1BlockRef) error { return d.s.OnL1Head(ctx, head) } +func (d *Driver) OnL1Safe(ctx context.Context, safe eth.L1BlockRef) error { + return d.s.OnL1Safe(ctx, safe) +} + +func (d *Driver) OnL1Finalized(ctx context.Context, finalized eth.L1BlockRef) error { + return d.s.OnL1Finalized(ctx, finalized) +} + func (d *Driver) OnUnsafeL2Payload(ctx context.Context, payload *eth.ExecutionPayload) error { return d.s.OnUnsafeL2Payload(ctx, payload) } diff --git a/op-node/rollup/driver/state.go b/op-node/rollup/driver/state.go index b723fde384d8f..ffeff19ff3b33 100644 --- a/op-node/rollup/driver/state.go +++ b/op-node/rollup/driver/state.go @@ -16,7 +16,8 @@ import ( "github.com/ethereum/go-ethereum/log" ) -// SyncStatus is a snapshot of the driver +// SyncStatus is a snapshot of the driver. +// Values may be zeroed if not yet initialized. type SyncStatus struct { // CurrentL1 is the block that the derivation process is currently at, // this may not be fully derived into L2 data yet. @@ -25,7 +26,9 @@ type SyncStatus struct { // HeadL1 is the perceived head of the L1 chain, no confirmation distance. // The head is not guaranteed to build on the other L1 sync status fields, // as the node may be in progress of resetting to adapt to a L1 reorg. - HeadL1 eth.L1BlockRef `json:"head_l1"` + HeadL1 eth.L1BlockRef `json:"head_l1"` + SafeL1 eth.L1BlockRef `json:"safe_l1"` + FinalizedL1 eth.L1BlockRef `json:"finalized_l1"` // UnsafeL2 is the absolute tip of the L2 chain, // pointing to block data that has not been submitted to L1 yet. // The sequencer is building this, and verifiers may also be ahead of the @@ -40,14 +43,13 @@ type SyncStatus struct { } type state struct { - // Chain State - l1Head eth.L1BlockRef // Latest recorded head of the L1 Chain, independent of derivation work - l2Head eth.L2BlockRef // L2 Unsafe Head - l2SafeHead eth.L2BlockRef // L2 Safe Head - this is the head of the L2 chain as derived from L1 - l2Finalized eth.L2BlockRef // L2 Block that will never be reversed + // Latest recorded head, safe block and finalized block of the L1 Chain, independent of derivation work + l1Head eth.L1BlockRef + l1Safe eth.L1BlockRef + l1Finalized eth.L1BlockRef // The derivation pipeline is reset whenever we reorg. - // The derivation pipeline determines the new l2SafeHead. + // The derivation pipeline determines the new l2Safe. derivation DerivationPipeline // When the derivation pipeline is waiting for new data to do anything @@ -66,13 +68,23 @@ type state struct { // Driver config: verifier and sequencer settings DriverConfig *Config - // Connections (in/out) - l1Heads chan eth.L1BlockRef + // L1 Signals: + // + // Not all L1 blocks, or all changes, have to be signalled: + // the derivation process traverses the chain and handles reorgs as necessary, + // the driver just needs to be aware of the *latest* signals enough so to not + // lag behind actionable data. + l1HeadSig chan eth.L1BlockRef + l1SafeSig chan eth.L1BlockRef + l1FinalizedSig chan eth.L1BlockRef + + // L2 Signals: unsafeL2Payloads chan *eth.ExecutionPayload - l1 L1Chain - l2 L2Chain - output outputInterface - network Network // may be nil, network for is optional + + l1 L1Chain + l2 L2Chain + output outputInterface + network Network // may be nil, network for is optional metrics Metrics log log.Logger @@ -101,23 +113,16 @@ func NewState(driverCfg *Config, log log.Logger, snapshotLog log.Logger, config output: output, network: network, metrics: metrics, - l1Heads: make(chan eth.L1BlockRef, 10), + l1HeadSig: make(chan eth.L1BlockRef, 10), + l1SafeSig: make(chan eth.L1BlockRef, 10), + l1FinalizedSig: make(chan eth.L1BlockRef, 10), unsafeL2Payloads: make(chan *eth.ExecutionPayload, 10), } } -// Start starts up the state loop. The context is only for initialization. +// Start starts up the state loop. // The loop will have been started iff err is not nil. -func (s *state) Start(ctx context.Context) error { - l1Head, err := s.l1.L1BlockRefByLabel(ctx, eth.Unsafe) - if err != nil { - return err - } - s.l1Head = l1Head - s.l2Head, _ = s.l2.L2BlockRefByLabel(ctx, eth.Unsafe) - s.metrics.RecordL1Ref("l1_head", s.l1Head) - s.metrics.RecordL2Ref("l2_unsafe", s.l2Head) - +func (s *state) Start(_ context.Context) error { s.derivation.Reset() s.wg.Add(1) @@ -132,11 +137,33 @@ func (s *state) Close() error { return nil } -func (s *state) OnL1Head(ctx context.Context, head eth.L1BlockRef) error { +// OnL1Head signals the driver that the L1 chain changed the "unsafe" block, +// also known as head of the chain, or "latest". +func (s *state) OnL1Head(ctx context.Context, unsafe eth.L1BlockRef) error { + select { + case <-ctx.Done(): + return ctx.Err() + case s.l1HeadSig <- unsafe: + return nil + } +} + +// OnL1Safe signals the driver that the L1 chain changed the "safe", +// also known as the justified checkpoint (as seen on L1 beacon-chain). +func (s *state) OnL1Safe(ctx context.Context, safe eth.L1BlockRef) error { select { case <-ctx.Done(): return ctx.Err() - case s.l1Heads <- head: + case s.l1SafeSig <- safe: + return nil + } +} + +func (s *state) OnL1Finalized(ctx context.Context, finalized eth.L1BlockRef) error { + select { + case <-ctx.Done(): + return ctx.Err() + case s.l1FinalizedSig <- finalized: return nil } } @@ -150,37 +177,54 @@ func (s *state) OnUnsafeL2Payload(ctx context.Context, payload *eth.ExecutionPay } } -func (s *state) handleNewL1Block(newL1Head eth.L1BlockRef) { +func (s *state) handleNewL1HeadBlock(head eth.L1BlockRef) { // We don't need to do anything if the head hasn't changed. - if s.l1Head.Hash == newL1Head.Hash { - s.log.Trace("Received L1 head signal that is the same as the current head", "l1Head", newL1Head) - } else if s.l1Head.Hash == newL1Head.ParentHash { + if s.l1Head == (eth.L1BlockRef{}) { + s.log.Info("Received first L1 head signal", "l1_head", head) + } else if s.l1Head.Hash == head.Hash { + s.log.Trace("Received L1 head signal that is the same as the current head", "l1_head", head) + } else if s.l1Head.Hash == head.ParentHash { // We got a new L1 block whose parent hash is the same as the current L1 head. Means we're // dealing with a linear extension (new block is the immediate child of the old one). - s.log.Debug("L1 head moved forward", "l1Head", newL1Head) + s.log.Debug("L1 head moved forward", "l1_head", head) } else { - if s.l1Head.Number >= newL1Head.Number { - s.metrics.RecordL1ReorgDepth(s.l1Head.Number - newL1Head.Number) + if s.l1Head.Number >= head.Number { + s.metrics.RecordL1ReorgDepth(s.l1Head.Number - head.Number) } // New L1 block is not the same as the current head or a single step linear extension. - // This could either be a long L1 extension, or a reorg. Both can be handled the same way. - s.log.Warn("L1 Head signal indicates an L1 re-org", "old_l1_head", s.l1Head, "new_l1_head_parent", newL1Head.ParentHash, "new_l1_head", newL1Head) + // This could either be a long L1 extension, or a reorg, or we simply missed a head update. + s.log.Warn("L1 head signal indicates a possible L1 re-org", "old_l1_head", s.l1Head, "new_l1_head_parent", head.ParentHash, "new_l1_head", head) } - s.metrics.RecordL1Ref("l1_head", newL1Head) - s.l1Head = newL1Head + s.snapshot("New L1 Head") + s.metrics.RecordL1Ref("l1_head", head) + s.l1Head = head +} + +func (s *state) handleNewL1SafeBlock(safe eth.L1BlockRef) { + s.log.Info("New L1 safe block", "l1_safe", safe) + s.metrics.RecordL1Ref("l1_safe", safe) + s.l1Safe = safe +} + +func (s *state) handleNewL1FinalizedBlock(finalized eth.L1BlockRef) { + s.log.Info("New L1 finalized block", "l1_finalized", finalized) + s.metrics.RecordL1Ref("l1_finalized", finalized) + s.l1Finalized = finalized + // TODO(proto): forward signal to derivation to finalize L2 chain as well } // findL1Origin determines what the next L1 Origin should be. // The L1 Origin is either the L2 Head's Origin, or the following L1 block // if the next L2 block's time is greater than or equal to the L2 Head's Origin. func (s *state) findL1Origin(ctx context.Context) (eth.L1BlockRef, error) { + l2Head := s.derivation.UnsafeL2Head() // If we are at the head block, don't do a lookup. - if s.l2Head.L1Origin.Hash == s.l1Head.Hash { + if l2Head.L1Origin.Hash == s.l1Head.Hash { return s.l1Head, nil } // Grab a reference to the current L1 origin block. - currentOrigin, err := s.l1.L1BlockRefByHash(ctx, s.l2Head.L1Origin.Hash) + currentOrigin, err := s.l1.L1BlockRefByHash(ctx, l2Head.L1Origin.Hash) if err != nil { return eth.L1BlockRef{}, err } @@ -191,7 +235,7 @@ func (s *state) findL1Origin(ctx context.Context) (eth.L1BlockRef, error) { s.log.Info("sequencing with old origin to preserve conf depth", "current", currentOrigin, "current_time", currentOrigin.Time, "l1_head", s.l1Head, "l1_head_time", s.l1Head.Time, - "l2_head", s.l2Head, "l2_head_time", s.l2Head.Time, + "l2_head", l2Head, "l2_head_time", l2Head.Time, "depth", s.DriverConfig.SequencerConfDepth) return currentOrigin, nil } @@ -209,7 +253,7 @@ func (s *state) findL1Origin(ctx context.Context) (eth.L1BlockRef, error) { // could decide to continue to build on top of the previous origin until the Sequencer runs out // of slack. For simplicity, we implement our Sequencer to always start building on the latest // L1 block when we can. - if s.l2Head.Time+s.Config.BlockTime >= nextOrigin.Time { + if l2Head.Time+s.Config.BlockTime >= nextOrigin.Time { return nextOrigin, nil } @@ -233,27 +277,30 @@ func (s *state) createNewL2Block(ctx context.Context) error { return nil } + l2Head := s.derivation.UnsafeL2Head() + l2Safe := s.derivation.SafeL2Head() + l2Finalized := s.derivation.Finalized() + // Should never happen. Sequencer will halt if we get into this situation somehow. - nextL2Time := s.l2Head.Time + s.Config.BlockTime + nextL2Time := l2Head.Time + s.Config.BlockTime if nextL2Time < l1Origin.Time { s.log.Error("Cannot build L2 block for time before L1 origin", - "l2Head", s.l2Head, "nextL2Time", nextL2Time, "l1Origin", l1Origin, "l1OriginTime", l1Origin.Time) + "l2Unsafe", l2Head, "nextL2Time", nextL2Time, "l1Origin", l1Origin, "l1OriginTime", l1Origin.Time) return fmt.Errorf("cannot build L2 block on top %s for time %d before L1 origin %s at time %d", - s.l2Head, nextL2Time, l1Origin, l1Origin.Time) + l2Head, nextL2Time, l1Origin, l1Origin.Time) } // Actually create the new block. - newUnsafeL2Head, payload, err := s.output.createNewBlock(ctx, s.l2Head, s.l2SafeHead.ID(), s.l2Finalized.ID(), l1Origin) + newUnsafeL2Head, payload, err := s.output.createNewBlock(ctx, l2Head, l2Safe.ID(), l2Finalized.ID(), l1Origin) if err != nil { - s.log.Error("Could not extend chain as sequencer", "err", err, "l2UnsafeHead", s.l2Head, "l1Origin", l1Origin) + s.log.Error("Could not extend chain as sequencer", "err", err, "l2_parent", l2Head, "l1_origin", l1Origin) return err } // Update our L2 head block based on the new unsafe block we just generated. s.derivation.SetUnsafeHead(newUnsafeL2Head) - s.l2Head = newUnsafeL2Head - s.log.Info("Sequenced new l2 block", "l2Head", s.l2Head, "l1Origin", s.l2Head.L1Origin, "txs", len(payload.Transactions), "time", s.l2Head.Time) + s.log.Info("Sequenced new l2 block", "l2_unsafe", newUnsafeL2Head, "l1_origin", newUnsafeL2Head.L1Origin, "txs", len(payload.Transactions), "time", newUnsafeL2Head.Time) s.metrics.CountSequencedTxs(len(payload.Transactions)) if s.network != nil { @@ -363,8 +410,9 @@ func (s *state) eventLoop() { // We need to catch up to the next origin as quickly as possible. We can do this by // requesting a new block ASAP instead of waiting for the next tick. // We don't request a block if the confirmation depth is not met. - if s.l1Head.Number > s.l2Head.L1Origin.Number+s.DriverConfig.SequencerConfDepth { - s.log.Trace("Asking for a second L2 block asap", "l2Head", s.l2Head) + l2Head := s.derivation.UnsafeL2Head() + if s.l1Head.Number > l2Head.L1Origin.Number+s.DriverConfig.SequencerConfDepth { + s.log.Trace("Building another L2 block asap to catch up with L1 head", "l2_unsafe", l2Head, "l2_unsafe_l1_origin", l2Head.L1Origin, "l1_head", s.l1Head) // But not too quickly to minimize busy-waiting for new blocks time.AfterFunc(time.Millisecond*10, reqL2BlockCreation) } @@ -376,11 +424,15 @@ func (s *state) eventLoop() { s.metrics.RecordReceivedUnsafePayload(payload) reqStep() - case newL1Head := <-s.l1Heads: - s.log.Info("new l1 Head") - s.snapshot("New L1 Head") - s.handleNewL1Block(newL1Head) + case newL1Head := <-s.l1HeadSig: + s.handleNewL1HeadBlock(newL1Head) reqStep() // a new L1 head may mean we have the data to not get an EOF again. + case newL1Safe := <-s.l1SafeSig: + s.handleNewL1SafeBlock(newL1Safe) + // no step, justified L1 information does not do anything for L2 derivation or status + case newL1Finalized := <-s.l1FinalizedSig: + s.handleNewL1FinalizedBlock(newL1Finalized) + reqStep() // we may be able to mark more L2 data as finalized now case <-delayedStepReq: delayedStepReq = nil step() @@ -417,28 +469,17 @@ func (s *state) eventLoop() { continue } else { stepAttempts = 0 - finalized, safe, unsafe := s.derivation.Finalized(), s.derivation.SafeL2Head(), s.derivation.UnsafeL2Head() - // log sync progress when it changes - if s.l2Finalized != finalized || s.l2SafeHead != safe || s.l2Head != unsafe { - s.log.Info("Sync progress", "finalized", finalized, "safe", safe, "unsafe", unsafe) - s.metrics.RecordL2Ref("l2_finalized", finalized) - s.metrics.RecordL2Ref("l2_safe", safe) - s.metrics.RecordL2Ref("l2_unsafe", unsafe) - } - s.metrics.RecordL1Ref("l1_derived", s.derivation.Progress().Origin) - // update the heads - s.l2Finalized = finalized - s.l2SafeHead = safe - s.l2Head = unsafe reqStep() // continue with the next step if we can } case respCh := <-s.syncStatusReq: respCh <- SyncStatus{ CurrentL1: s.derivation.Progress().Origin, HeadL1: s.l1Head, - UnsafeL2: s.l2Head, - SafeL2: s.l2SafeHead, - FinalizedL2: s.l2Finalized, + SafeL1: s.l1Safe, + FinalizedL1: s.l1Finalized, + UnsafeL2: s.derivation.UnsafeL2Head(), + SafeL2: s.derivation.SafeL2Head(), + FinalizedL2: s.derivation.Finalized(), } case respCh := <-s.forceReset: s.log.Warn("Derivation pipeline is manually reset") @@ -499,7 +540,7 @@ func (s *state) snapshot(event string) { "event", event, "l1Head", deferJSONString{s.l1Head}, "l1Current", deferJSONString{s.derivation.Progress().Origin}, - "l2Head", deferJSONString{s.l2Head}, - "l2SafeHead", deferJSONString{s.l2SafeHead}, - "l2FinalizedHead", deferJSONString{s.l2Finalized}) + "l2Head", deferJSONString{s.derivation.UnsafeL2Head()}, + "l2Safe", deferJSONString{s.derivation.SafeL2Head()}, + "l2FinalizedHead", deferJSONString{s.derivation.Finalized()}) } diff --git a/op-node/rollup/driver/step.go b/op-node/rollup/driver/step.go index b9239058abab5..c27d93d425868 100644 --- a/op-node/rollup/driver/step.go +++ b/op-node/rollup/driver/step.go @@ -45,12 +45,9 @@ func (d *outputImpl) createNewBlock(ctx context.Context, l2Head eth.L2BlockRef, } // Actually execute the block and add it to the head of the chain. - payload, rpcErr, payloadErr := derive.InsertHeadBlock(ctx, d.log, d.l2, fc, attrs, false) - if rpcErr != nil { - return l2Head, nil, fmt.Errorf("failed to extend L2 chain due to RPC error: %v", rpcErr) - } - if payloadErr != nil { - return l2Head, nil, fmt.Errorf("failed to extend L2 chain, cannot produce valid payload: %v", payloadErr) + payload, errType, err := derive.InsertHeadBlock(ctx, d.log, d.l2, fc, attrs, false) + if err != nil { + return l2Head, nil, fmt.Errorf("failed to extend L2 chain, error (%d): %w", errType, err) } // Generate an L2 block ref from the payload. diff --git a/op-node/rollup/types.go b/op-node/rollup/types.go index 5410d8326e204..350e531ffd409 100644 --- a/op-node/rollup/types.go +++ b/op-node/rollup/types.go @@ -32,7 +32,7 @@ type Config struct { MaxSequencerDrift uint64 `json:"max_sequencer_drift"` // Number of epochs (L1 blocks) per sequencing window, including the epoch L1 origin block itself SeqWindowSize uint64 `json:"seq_window_size"` - // Number of seconds (w.r.t. L1 time) that a frame can be valid when included in L1 + // Number of L1 blocks between when a channel can be opened and when it must be closed by. ChannelTimeout uint64 `json:"channel_timeout"` // Required to verify L1 signatures L1ChainID *big.Int `json:"l1_chain_id"` diff --git a/op-node/service.go b/op-node/service.go index 223f8214d0985..b237ed76d4b44 100644 --- a/op-node/service.go +++ b/op-node/service.go @@ -40,22 +40,22 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) { p2pSignerSetup, err := p2p.LoadSignerSetup(ctx) if err != nil { - return nil, fmt.Errorf("failed to load p2p signer: %v", err) + return nil, fmt.Errorf("failed to load p2p signer: %w", err) } p2pConfig, err := p2p.NewConfig(ctx) if err != nil { - return nil, fmt.Errorf("failed to load p2p config: %v", err) + return nil, fmt.Errorf("failed to load p2p config: %w", err) } l1Endpoint, err := NewL1EndpointConfig(ctx) if err != nil { - return nil, fmt.Errorf("failed to load l1 endpoint info: %v", err) + return nil, fmt.Errorf("failed to load l1 endpoint info: %w", err) } l2Endpoint, err := NewL2EndpointConfig(ctx, log) if err != nil { - return nil, fmt.Errorf("failed to load l2 endpoints info: %v", err) + return nil, fmt.Errorf("failed to load l2 endpoints info: %w", err) } cfg := &node.Config{ @@ -78,8 +78,9 @@ func NewConfig(ctx *cli.Context, log log.Logger) (*node.Config, error) { ListenAddr: ctx.GlobalString(flags.PprofAddrFlag.Name), ListenPort: ctx.GlobalString(flags.PprofPortFlag.Name), }, - P2P: p2pConfig, - P2PSigner: p2pSignerSetup, + P2P: p2pConfig, + P2PSigner: p2pSignerSetup, + L1EpochPollInterval: ctx.GlobalDuration(flags.L1EpochPollIntervalFlag.Name), } if err := cfg.Check(); err != nil { return nil, err @@ -111,7 +112,7 @@ func NewL2EndpointConfig(ctx *cli.Context, log log.Logger) (*node.L2EndpointConf } else { log.Warn("Failed to read JWT secret from file, generating a new one now. Configure L2 geth with --authrpc.jwt-secret=" + fmt.Sprintf("%q", fileName)) if _, err := io.ReadFull(rand.Reader, secret[:]); err != nil { - return nil, fmt.Errorf("failed to generate jwt secret: %v", err) + return nil, fmt.Errorf("failed to generate jwt secret: %w", err) } if err := os.WriteFile(fileName, []byte(hexutil.Encode(secret[:])), 0600); err != nil { return nil, err @@ -136,13 +137,13 @@ func NewRollupConfig(ctx *cli.Context) (*rollup.Config, error) { rollupConfigPath := ctx.GlobalString(flags.RollupConfig.Name) file, err := os.Open(rollupConfigPath) if err != nil { - return nil, fmt.Errorf("failed to read rollup config: %v", err) + return nil, fmt.Errorf("failed to read rollup config: %w", err) } defer file.Close() var rollupConfig rollup.Config if err := json.NewDecoder(file).Decode(&rollupConfig); err != nil { - return nil, fmt.Errorf("failed to decode rollup config: %v", err) + return nil, fmt.Errorf("failed to decode rollup config: %w", err) } return &rollupConfig, nil } diff --git a/op-node/sources/engine_client.go b/op-node/sources/engine_client.go index c05dfd53a43f3..2d7bb634796f4 100644 --- a/op-node/sources/engine_client.go +++ b/op-node/sources/engine_client.go @@ -43,8 +43,10 @@ func NewEngineClient(client client.RPC, log log.Logger, metrics caching.Metrics, // ForkchoiceUpdate updates the forkchoice on the execution client. If attributes is not nil, the engine client will also begin building a block // based on attributes after the new head block and return the payload ID. // -// The RPC may return an error in ForkchoiceUpdatedResult.PayloadStatusV1.ValidationError or other non-success PayloadStatusV1, -// and this type of error is kept separate from the returned `error` used for RPC errors, like timeouts. +// The RPC may return three types of errors: +// 1. Processing error: ForkchoiceUpdatedResult.PayloadStatusV1.ValidationError or other non-success PayloadStatusV1, +// 2. `error` as eth.InputError: the forkchoice state or attributes are not valid. +// 3. Other types of `error`: temporary RPC errors, like timeouts. func (s *EngineClient) ForkchoiceUpdate(ctx context.Context, fc *eth.ForkchoiceState, attributes *eth.PayloadAttributes) (*eth.ForkchoiceUpdatedResult, error) { e := s.log.New("state", fc, "attr", attributes) e.Trace("Sharing forkchoice-updated signal") @@ -59,12 +61,18 @@ func (s *EngineClient) ForkchoiceUpdate(ctx context.Context, fc *eth.ForkchoiceS } return &result, nil } else { - e = e.New("err", err) + e.Warn("Failed to share forkchoice-updated signal", "err", err) if rpcErr, ok := err.(rpc.Error); ok { code := eth.ErrorCode(rpcErr.ErrorCode()) - e.Warn("Unexpected error code in forkchoice-updated response", "code", code) - } else { - e.Error("Failed to share forkchoice-updated signal") + switch code { + case eth.InvalidForkchoiceState, eth.InvalidPayloadAttributes: + return nil, eth.InputError{ + Inner: err, + Code: code, + } + default: + return nil, fmt.Errorf("unrecognized rpc error: %w", err) + } } return nil, err } @@ -89,23 +97,28 @@ func (s *EngineClient) NewPayload(ctx context.Context, payload *eth.ExecutionPay return &result, nil } -// GetPayload gets the execution payload associated with the PayloadId +// GetPayload gets the execution payload associated with the PayloadId. +// There may be two types of error: +// 1. `error` as eth.InputError: the payload ID may be unknown +// 2. Other types of `error`: temporary RPC errors, like timeouts. func (s *EngineClient) GetPayload(ctx context.Context, payloadId eth.PayloadID) (*eth.ExecutionPayload, error) { e := s.log.New("payload_id", payloadId) e.Trace("getting payload") var result eth.ExecutionPayload err := s.client.CallContext(ctx, &result, "engine_getPayloadV1", payloadId) if err != nil { - e = e.New("payload_id", payloadId, "err", err) + e.Warn("Failed to get payload", "payload_id", payloadId, "err", err) if rpcErr, ok := err.(rpc.Error); ok { code := eth.ErrorCode(rpcErr.ErrorCode()) - if code != eth.UnavailablePayload { - e.Warn("unexpected error code in get-payload response", "code", code) - } else { - e.Warn("unavailable payload in get-payload request", "code", code) + switch code { + case eth.UnknownPayload: + return nil, eth.InputError{ + Inner: err, + Code: code, + } + default: + return nil, fmt.Errorf("unrecognized rpc error: %w", err) } - } else { - e.Error("failed to get payload") } return nil, err } diff --git a/op-node/testutils/mock_l1.go b/op-node/testutils/mock_l1.go index 81f2719d57580..79543d494f6fc 100644 --- a/op-node/testutils/mock_l1.go +++ b/op-node/testutils/mock_l1.go @@ -12,7 +12,7 @@ type MockL1Source struct { } func (m *MockL1Source) L1BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L1BlockRef, error) { - out := m.Mock.MethodCalled("L1BlockRefByLabel") + out := m.Mock.MethodCalled("L1BlockRefByLabel", label) return out[0].(eth.L1BlockRef), *out[1].(*error) } diff --git a/op-node/testutils/mock_l2.go b/op-node/testutils/mock_l2.go index 7b48e3f3c73f3..2e5b9ca4c16d9 100644 --- a/op-node/testutils/mock_l2.go +++ b/op-node/testutils/mock_l2.go @@ -15,7 +15,7 @@ func (c *MockL2Client) L2BlockRefByLabel(ctx context.Context, label eth.BlockLab return c.Mock.MethodCalled("L2BlockRefByLabel", label).Get(0).(eth.L2BlockRef), nil } -func (m *MockL1Source) ExpectL2BlockRefByLabel(label eth.BlockLabel, ref eth.L2BlockRef, err error) { +func (m *MockL2Client) ExpectL2BlockRefByLabel(label eth.BlockLabel, ref eth.L2BlockRef, err error) { m.Mock.On("L2BlockRefByLabel", label).Once().Return(ref, &err) } @@ -23,7 +23,7 @@ func (c *MockL2Client) L2BlockRefByNumber(ctx context.Context, num uint64) (eth. return c.Mock.MethodCalled("L2BlockRefByNumber", num).Get(0).(eth.L2BlockRef), nil } -func (m *MockL1Source) ExpectL2BlockRefByNumber(num uint64, ref eth.L2BlockRef, err error) { +func (m *MockL2Client) ExpectL2BlockRefByNumber(num uint64, ref eth.L2BlockRef, err error) { m.Mock.On("L2BlockRefByNumber", num).Once().Return(ref, &err) } @@ -31,6 +31,6 @@ func (c *MockL2Client) L2BlockRefByHash(ctx context.Context, hash common.Hash) ( return c.Mock.MethodCalled("L2BlockRefByHash", hash).Get(0).(eth.L2BlockRef), nil } -func (m *MockL1Source) ExpectL2BlockRefByHash(hash common.Hash, ref eth.L2BlockRef, err error) { +func (m *MockL2Client) ExpectL2BlockRefByHash(hash common.Hash, ref eth.L2BlockRef, err error) { m.Mock.On("L2BlockRefByHash", hash).Once().Return(ref, &err) } diff --git a/op-node/withdrawals/utils.go b/op-node/withdrawals/utils.go index 04926bd6b808e..697c7d3ccc106 100644 --- a/op-node/withdrawals/utils.go +++ b/op-node/withdrawals/utils.go @@ -319,6 +319,5 @@ func StorageSlotOfWithdrawalHash(hash common.Hash) common.Hash { // Where p is the 32 byte value of the storage slot and ++ is concatenation buf := make([]byte, 64) copy(buf, hash[:]) - buf[63] = 1 return crypto.Keccak256Hash(buf) } diff --git a/op-proposer/Makefile b/op-proposer/Makefile index b975a9158a35a..c752c0cc4113e 100644 --- a/op-proposer/Makefile +++ b/op-proposer/Makefile @@ -17,7 +17,7 @@ test: go test -v ./... lint: - golangci-lint run -E asciicheck,goimports,misspell ./... + golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell,errorlint -e "errors.As" -e "errors.Is" .PHONY: \ clean \ diff --git a/op-proposer/drivers/l2output/driver.go b/op-proposer/drivers/l2output/driver.go index 10f8fed6b8a9a..bf231b1a3b559 100644 --- a/op-proposer/drivers/l2output/driver.go +++ b/op-proposer/drivers/l2output/driver.go @@ -168,12 +168,12 @@ func (d *Driver) CraftTx( l1Header, err := d.cfg.L1Client.HeaderByNumber(ctx, nil) if err != nil { - return nil, fmt.Errorf("error resolving checkpoint block: %v", err) + return nil, fmt.Errorf("error resolving checkpoint block: %w", err) } l2Header, err := d.cfg.L2Client.HeaderByNumber(ctx, nextCheckpointBlock) if err != nil { - return nil, fmt.Errorf("error resolving checkpoint block: %v", err) + return nil, fmt.Errorf("error resolving checkpoint block: %w", err) } if l2Header.Number.Cmp(nextCheckpointBlock) != 0 { diff --git a/op-proposer/go.mod b/op-proposer/go.mod index f5bb62694826b..6c06aaffc3060 100644 --- a/op-proposer/go.mod +++ b/op-proposer/go.mod @@ -3,10 +3,10 @@ module github.com/ethereum-optimism/optimism/op-proposer go 1.18 require ( - github.com/ethereum-optimism/optimism/op-bindings v0.5.0 - github.com/ethereum-optimism/optimism/op-node v0.5.0 - github.com/ethereum-optimism/optimism/op-service v0.5.0 - github.com/ethereum/go-ethereum v1.10.21 + github.com/ethereum-optimism/optimism/op-bindings v0.8.6 + github.com/ethereum-optimism/optimism/op-node v0.8.6 + github.com/ethereum-optimism/optimism/op-service v0.8.6 + github.com/ethereum/go-ethereum v1.10.23 github.com/miguelmota/go-ethereum-hdwallet v0.1.1 github.com/stretchr/testify v1.8.0 github.com/urfave/cli v1.22.9 @@ -24,7 +24,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/fjl/memsize v0.0.1 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -41,7 +40,6 @@ require ( github.com/holiman/uint256 v1.2.0 // indirect github.com/huin/goupnp v1.0.3 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect @@ -78,4 +76,4 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 +replace github.com/ethereum/go-ethereum v1.10.23 => github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 diff --git a/op-proposer/go.sum b/op-proposer/go.sum index 5b7a91449f951..bb6f25bcb1580 100644 --- a/op-proposer/go.sum +++ b/op-proposer/go.sum @@ -122,7 +122,6 @@ github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1 github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -145,19 +144,18 @@ github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbT github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 h1:+WfrwiRELp3hoeb1bnPws3FtUUoYCDDYsCkwvKek5FY= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0 h1:bJT8KmDu5YAVOqPQHxHkntGlRrtRdTIsH+X28LOIcqU= -github.com/ethereum-optimism/optimism/op-bindings v0.5.0/go.mod h1:Ft+sL57mlBysH6nuXZA11GLMMajfBa8SjpEBtitl1Vw= -github.com/ethereum-optimism/optimism/op-node v0.5.0 h1:MwNvYDBFS4quSWkEzfJBGJkzI1yveqQ/GuVK6aTJJ0A= -github.com/ethereum-optimism/optimism/op-node v0.5.0/go.mod h1:jzsaU998O9OISO7ybwpKKm01pQZFpydRPSXP9+U8MYA= -github.com/ethereum-optimism/optimism/op-service v0.5.0 h1:D0OyBbRGttT3geECT935W4DPhbVAibPWZAayWpEd+e4= -github.com/ethereum-optimism/optimism/op-service v0.5.0/go.mod h1:otr/BXzgcZmJKUl18v+WLJjtWoIwqoJ/L0/cNvIIkUs= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 h1:W/ZU6BZH7ilTrpdoJOF9N4OReqXbpeRtUB6klIpEdMA= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6 h1:jJYhmygt7hqGzYa+8sme9SdnKt1c3Y6EbWgIrRONoxw= +github.com/ethereum-optimism/optimism/op-bindings v0.8.6/go.mod h1:gUX5317IAvRMjB4GftayM87JVln3DTqukfirwJpEWnE= +github.com/ethereum-optimism/optimism/op-node v0.8.6 h1:xNwN+Q/Rt17vSKawhBeG9qTcqcyh8JU8PGjK1iuGkF4= +github.com/ethereum-optimism/optimism/op-node v0.8.6/go.mod h1:gkyzgVHV3+tIhLZ8GhT+bL9GrrmouQCW4mKYukS0SHg= +github.com/ethereum-optimism/optimism/op-service v0.8.6 h1:ruZp/BxL8TGn1y9EJmygypPTeVAFlAA0A/h8LsCoV+M= +github.com/ethereum-optimism/optimism/op-service v0.8.6/go.mod h1:gm8YNzERrL/CHBPWx3+01mR/NOVpLLw4GEUSnnTdyFU= github.com/ethereum/go-ethereum v1.10.4/go.mod h1:nEE0TP5MtxGzOMd7egIrbPJMQBnhVU3ELNxhBglIzhg= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -339,7 +337,6 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= diff --git a/op-proposer/txmgr/txmgr.go b/op-proposer/txmgr/txmgr.go index d41b064fb2e9a..11416eb15cf99 100644 --- a/op-proposer/txmgr/txmgr.go +++ b/op-proposer/txmgr/txmgr.go @@ -327,7 +327,8 @@ func waitMined( // CalcGasFeeCap deterministically computes the recommended gas fee cap given // the base fee and gasTipCap. The resulting gasFeeCap is equal to: -// gasTipCap + 2*baseFee. +// +// gasTipCap + 2*baseFee. func CalcGasFeeCap(baseFee, gasTipCap *big.Int) *big.Int { return new(big.Int).Add( gasTipCap, diff --git a/op-service/go.mod b/op-service/go.mod index 540daa0cb26ac..e1625e9312575 100644 --- a/op-service/go.mod +++ b/op-service/go.mod @@ -3,7 +3,7 @@ module github.com/ethereum-optimism/optimism/op-service go 1.18 require ( - github.com/ethereum/go-ethereum v1.10.21 + github.com/ethereum/go-ethereum v1.10.23 github.com/prometheus/client_golang v1.13.0 github.com/stretchr/testify v1.8.0 github.com/urfave/cli v1.22.9 @@ -65,4 +65,4 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) -replace github.com/ethereum/go-ethereum v1.10.21 => github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 +replace github.com/ethereum/go-ethereum v1.10.23 => github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 diff --git a/op-service/go.sum b/op-service/go.sum index 919fa278e9b99..c841ce0f86846 100644 --- a/op-service/go.sum +++ b/op-service/go.sum @@ -108,8 +108,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61 h1:+WfrwiRELp3hoeb1bnPws3FtUUoYCDDYsCkwvKek5FY= -github.com/ethereum-optimism/op-geth v0.0.0-20220819161933-acfde114de61/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1 h1:W/ZU6BZH7ilTrpdoJOF9N4OReqXbpeRtUB6klIpEdMA= +github.com/ethereum-optimism/op-geth v0.0.0-20220909213840-e6575c0168f1/go.mod h1:/6CsT5Ceen2WPLI/oCA3xMcZ5sWMF/D46SjM/ayY0Oo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.1 h1:+zhkb+dhUgx0/e+M8sF0QqiouvMQUiKR+QYvdxIOKcQ= github.com/fjl/memsize v0.0.1/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= diff --git a/op-service/rpc/server_test.go b/op-service/rpc/server_test.go index c4bfe28df0c05..a495c244e2404 100644 --- a/op-service/rpc/server_test.go +++ b/op-service/rpc/server_test.go @@ -2,7 +2,7 @@ package rpc import ( "fmt" - "io/ioutil" + "io" "math/rand" "net/http" "testing" @@ -41,7 +41,8 @@ func TestBaseServer(t *testing.T) { t.Run("supports GET /healthz", func(t *testing.T) { res, err := http.Get(fmt.Sprintf("http://%s/healthz", server.endpoint)) require.NoError(t, err) - body, err := ioutil.ReadAll(res.Body) + defer res.Body.Close() + body, err := io.ReadAll(res.Body) require.NoError(t, err) require.EqualValues(t, fmt.Sprintf("{\"version\":\"%s\"}\n", appVersion), string(body)) }) diff --git a/ops-bedrock/devnet-up.sh b/ops-bedrock/devnet-up.sh index bf13afb0d8d94..a21c636712154 100755 --- a/ops-bedrock/devnet-up.sh +++ b/ops-bedrock/devnet-up.sh @@ -62,14 +62,20 @@ mkdir -p ./.devnet # Regenerate the L1 genesis file if necessary. The existence of the genesis # file is used to determine if we need to recreate the devnet's state folder. -if [ ! -f $DEVNET/genesis-l1.json ]; then - echo "Regenerating L1 genesis." +if [ ! -f "$DEVNET/done" ]; then + echo "Regenerating genesis files" + + TIMESTAMP=$(date +%s | xargs printf '0x%x') + cat "$CONTRACTS_BEDROCK/deploy-config/devnetL1.json" | jq -r ".l1GenesisBlockTimestamp = \"$TIMESTAMP\"" > /tmp/bedrock-devnet-deploy-config.json + ( cd "$OP_NODE" - go run cmd/main.go genesis devnet-l1 \ - --network $NETWORK \ - --deploy-config $CONTRACTS_BEDROCK/deploy-config \ - --outfile $DEVNET/genesis-l1.json + go run cmd/main.go genesis devnet \ + --deploy-config /tmp/bedrock-devnet-deploy-config.json \ + --outfile.l1 $DEVNET/genesis-l1.json \ + --outfile.l2 $DEVNET/genesis-l2.json \ + --outfile.rollup $DEVNET/rollup.json + touch "$DEVNET/done" ) fi @@ -82,34 +88,6 @@ fi wait_up $L1_URL ) -# Deploy contracts using Hardhat. -if [ ! -d "$CONTRACTS_BEDROCK/deployments/$NETWORK" ]; then - ( - echo "Deploying contracts." - cd "$CONTRACTS_BEDROCK" - yarn hardhat --network $NETWORK deploy - ) -else - echo "Contracts already deployed, skipping." -fi - -if [ ! -f "$DEVNET/genesis-l2.json" ]; then - ( - echo "Creating L2 genesis file." - cd "$OP_NODE" - go run cmd/main.go genesis devnet-l2 \ - --artifacts "$CONTRACTS_BEDROCK/artifacts,$CONTRACTS_GOVERNANCE/artifacts" \ - --network $NETWORK \ - --deployments "$CONTRACTS_BEDROCK/deployments" \ - --deploy-config "$CONTRACTS_BEDROCK/deploy-config" \ - --rpc-url http://localhost:8545 \ - --outfile "$DEVNET/genesis-l2.json" - echo "Created L2 genesis." - ) -else - echo "L2 genesis already exists." -fi - # Bring up L2. ( cd ops-bedrock @@ -118,19 +96,7 @@ fi wait_up $L2_URL ) -# Start putting together the rollup config. -if [ ! -f "$DEVNET/rollup.json" ]; then - ( - echo "Building rollup config..." - cd "$CONTRACTS_BEDROCK" - npx hardhat --network $NETWORK rollup-config - mv rollup.json "$DEVNET/rollup.json" - ) -else - echo "Rollup config already exists" -fi - -L2OO_ADDRESS=$(jq -r .address < "$CONTRACTS_BEDROCK/deployments/$NETWORK/L2OutputOracleProxy.json") +L2OO_ADDRESS="0x6900000000000000000000000000000000000000" SEQUENCER_GENESIS_HASH="$(jq -r '.l2.hash' < $DEVNET/rollup.json)" SEQUENCER_BATCH_INBOX_ADDRESS="$(cat $DEVNET/rollup.json | jq -r '.batch_inbox_address')" diff --git a/ops/docker-compose.yml b/ops/docker-compose.yml index 2c4f3bbf4f3d9..879e2c9c815a6 100644 --- a/ops/docker-compose.yml +++ b/ops/docker-compose.yml @@ -12,7 +12,7 @@ x-system-addr-env: &system-addr-env services: # this is a helper service used because there's no official hardhat image l1_chain: - image: ethereumoptimism/hardhat:${DOCKER_TAG_HARDHAT:-latest} + image: ethereumoptimism/hardhat-node:${DOCKER_TAG_HARDHAT:-latest} build: context: ./docker/hardhat dockerfile: Dockerfile diff --git a/ops/docker/Dockerfile.packages b/ops/docker/Dockerfile.packages index 8032b0e9f6cfb..a9c9432aff80b 100644 --- a/ops/docker/Dockerfile.packages +++ b/ops/docker/Dockerfile.packages @@ -67,6 +67,13 @@ WORKDIR /opt/optimism/packages/contracts COPY ./ops/scripts/deployer.sh . CMD ["yarn", "run", "deploy"] +FROM alpine:3.16.2 as contract-artifacts-bedrock +RUN mkdir -p /artifacts +WORKDIR /artifacts +COPY --from=base /opt/optimism/packages/contracts-bedrock/artifacts /artifacts/contracts-bedrock +COPY --from=base /opt/optimism/packages/contracts-governance/artifacts /artifacts/contracts-governance +CMD ["echo", "0"] + FROM base as deployer-bedrock WORKDIR /opt/optimism/packages/contracts-bedrock CMD ["yarn", "run", "deploy"] diff --git a/ops/docker/foundry/Dockerfile b/ops/docker/foundry/Dockerfile index 2461c7e114aea..40b1e137a5429 100644 --- a/ops/docker/foundry/Dockerfile +++ b/ops/docker/foundry/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /opt/foundry # Only diff from upstream docker image is this clone instead # of COPY. We select a specific commit to use. RUN git clone https://github.com/foundry-rs/foundry.git . \ - && git checkout 64fe4acc97e6d76551cea7598c201f05ecd65639 + && git checkout a4b04caf66643e42d3d2c10f9b9845b4bc0cb0d8 RUN source $HOME/.profile && cargo build --release \ && strip /opt/foundry/target/release/forge \ diff --git a/ops/scripts/build-ci.sh b/ops/scripts/build-ci.sh index 588789a22252f..3ad2105bac79d 100755 --- a/ops/scripts/build-ci.sh +++ b/ops/scripts/build-ci.sh @@ -16,7 +16,7 @@ function build() { mkdir -p /tmp/.buildx-cache-new build l2geth "ethereumoptimism/l2geth:latest" "./l2geth/Dockerfile" . -build l1chain "ethereumoptimism/hardhat:latest" "./ops/docker/hardhat/Dockerfile" ./ops/docker/hardhat +build l1chain "ethereumoptimism/hardhat-node:latest" "./ops/docker/hardhat/Dockerfile" ./ops/docker/hardhat wait diff --git a/ops/scripts/tag-bedrock-go-modules.sh b/ops/scripts/tag-bedrock-go-modules.sh new file mode 100755 index 0000000000000..57ccb48363d29 --- /dev/null +++ b/ops/scripts/tag-bedrock-go-modules.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash + +BEDROCK_TAGS_REMOTE="$1" +VERSION="$2" + +if [ -z "$VERSION" ]; then + echo "You must specify a version." + exit 0 +fi + +FIRST_CHAR=$(printf '%s' "$VERSION" | cut -c1) +if [ "$FIRST_CHAR" != "v" ]; then + echo "Tag must start with v." + exit 0 +fi + +git tag "op-bindings/$VERSION" +git tag "op-service/$VERSION" +git push $BEDROCK_TAGS_REMOTE "op-bindings/$VERSION" +git push $BEDROCK_TAGS_REMOTE "op-service/$VERSION" + +cd op-chain-ops +go get github.com/ethereum-optimism/optimism/op-bindings@$VERSION +go get github.com/ethereum-optimism/optimism/op-service@$VERSION +go mod tidy + +git add . +git commit -am 'chore: Upgrade op-chain-ops dependencies' + +git tag "op-chain-ops/$VERSION" +git push $BEDROCK_TAGS_REMOTE "op-chain-ops/$VERSION" + +cd ../op-node +go get github.com/ethereum-optimism/optimism/op-bindings@$VERSION +go get github.com/ethereum-optimism/optimism/op-service@$VERSION +go get github.com/ethereum-optimism/optimism/op-chain-ops@$VERSION +go mod tidy + +git add . +git commit -am 'chore: Upgrade op-node dependencies' +git push $BEDROCK_TAGS_REMOTE +git tag "op-node/$VERSION" +git push $BEDROCK_TAGS_REMOTE "op-node/$VERSION" + +cd ../op-proposer +go get github.com/ethereum-optimism/optimism/op-bindings@$VERSION +go get github.com/ethereum-optimism/optimism/op-service@$VERSION +go get github.com/ethereum-optimism/optimism/op-node@$VERSION +go mod tidy + +git add . +git commit -am 'chore: Upgrade op-proposer dependencies' +git push $BEDROCK_TAGS_REMOTE +git tag "op-proposer/$VERSION" +git push $BEDROCK_TAGS_REMOTE "op-proposer/$VERSION" + +cd ../op-batcher +go get github.com/ethereum-optimism/optimism/op-bindings@$VERSION +go get github.com/ethereum-optimism/optimism/op-service@$VERSION +go get github.com/ethereum-optimism/optimism/op-node@$VERSION +go get github.com/ethereum-optimism/optimism/op-proposer@$VERSION +go mod tidy + +git add . +git commit -am 'chore: Upgrade op-batcher dependencies' +git push $BEDROCK_TAGS_REMOTE +git tag "op-batcher/$VERSION" +git push $BEDROCK_TAGS_REMOTE "op-batcher/$VERSION" + +cd ../op-e2e +go get github.com/ethereum-optimism/optimism/op-bindings@$VERSION +go get github.com/ethereum-optimism/optimism/op-service@$VERSION +go get github.com/ethereum-optimism/optimism/op-node@$VERSION +go get github.com/ethereum-optimism/optimism/op-proposer@$VERSION +go get github.com/ethereum-optimism/optimism/op-batcher@$VERSION +go mod tidy + +git add . +git commit -am 'chore: Upgrade op-e2e dependencies' +git push $BEDROCK_TAGS_REMOTE +git tag "op-e2e/$VERSION" +git push $BEDROCK_TAGS_REMOTE "op-e2e/$VERSION" \ No newline at end of file diff --git a/packages/contracts-bedrock/deploy-config/devnetL1.json b/packages/contracts-bedrock/deploy-config/devnetL1.json index 08f83fd221911..d17fd5d274263 100644 --- a/packages/contracts-bedrock/deploy-config/devnetL1.json +++ b/packages/contracts-bedrock/deploy-config/devnetL1.json @@ -1,5 +1,4 @@ { - "l1StartingBlockTag": "earliest", "l1ChainID": 900, "l2ChainID": 901, "l2BlockTime": 2, @@ -16,6 +15,7 @@ "l2OutputOracleStartingTimestamp": -1, "l2OutputOracleProposer": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", "l2OutputOracleOwner": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "l2GenesisBlockCoinbase": "0x42000000000000000000000000000000000000f0", "l1BlockTime": 15, "cliqueSignerAddress": "0xca062b0fd91172d89bcd4bb084ac4e21972cc467", @@ -23,5 +23,6 @@ "optimismBaseFeeRecipient": "0xBcd4042DE499D14e55001CcbB24a551F3b954096", "optimismL1FeeRecipient": "0x71bE63f3384f5fb98995898A86B02Fb2426c5788", - "deploymentWaitConfirmations": 1 + "deploymentWaitConfirmations": 1, + "fundDevAccounts": true } diff --git a/packages/contracts-periphery/contracts/L1/L1ERC721Bridge.sol b/packages/contracts-periphery/contracts/L1/L1ERC721Bridge.sol index 0ee2d260ae709..947b85ebdaae2 100644 --- a/packages/contracts-periphery/contracts/L1/L1ERC721Bridge.sol +++ b/packages/contracts-periphery/contracts/L1/L1ERC721Bridge.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; import { CrossDomainEnabled -} from "@eth-optimism/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol"; +} from "@eth-optimism/contracts/libraries/bridge/CrossDomainEnabled.sol"; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; diff --git a/packages/contracts-periphery/contracts/L2/L2ERC721Bridge.sol b/packages/contracts-periphery/contracts/L2/L2ERC721Bridge.sol index 05b8ddc06ee2c..237dcdd4de9cb 100644 --- a/packages/contracts-periphery/contracts/L2/L2ERC721Bridge.sol +++ b/packages/contracts-periphery/contracts/L2/L2ERC721Bridge.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; import { CrossDomainEnabled -} from "@eth-optimism/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol"; +} from "@eth-optimism/contracts/libraries/bridge/CrossDomainEnabled.sol"; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; diff --git a/packages/contracts/.gitignore b/packages/contracts/.gitignore index ddc7c0d65d1e4..d077503918939 100644 --- a/packages/contracts/.gitignore +++ b/packages/contracts/.gitignore @@ -1,2 +1,7 @@ src/contract-artifacts.ts src/contract-deployed-artifacts.ts +/chugsplash +/L1 +/L2 +/libraries +/standards diff --git a/packages/contracts/package.json b/packages/contracts/package.json index c94f477ef9ba6..9b3dd5543b6ea 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -8,8 +8,11 @@ "dist/**/*.js", "dist/**/*.d.ts", "dist/types", - "artifacts/contracts/**/*.json", - "deployments/**/*.json", + "artifacts/contracts/chugsplash/**/*.json", + "artifacts/contracts/L1/**/*.json", + "artifacts/contracts/L2/**/*.json", + "artifacts/contracts/libraries/**/*.json", + "artifacts/contracts/standards/**/*.json", "chugsplash", "L1", "L2", @@ -17,11 +20,12 @@ "standards" ], "scripts": { - "build": "yarn build:contracts && yarn autogen:artifacts && yarn build:typescript", + "build": "yarn build:contracts && yarn copy:contracts && yarn autogen:artifacts && yarn build:typescript", "build:typescript": "tsc -p ./tsconfig.json", "build:contracts": "hardhat compile --show-stack-traces", "autogen:markdown": "ts-node scripts/generate-markdown.ts", "autogen:artifacts": "ts-node scripts/generate-artifacts.ts && ts-node scripts/generate-deployed-artifacts.ts", + "copy:contracts": "yarn copyfiles -u 1 -e \"**/test-*/**/*\" \"contracts/**/*\" ./", "test": "yarn test:contracts", "test:contracts": "hardhat test --show-stack-traces", "test:coverage": "NODE_OPTIONS=--max_old_space_size=8192 hardhat coverage && istanbul check-coverage --statements 90 --branches 84 --functions 88 --lines 90", @@ -35,11 +39,7 @@ "lint:contracts:fix": "yarn prettier --write 'contracts/**/*.sol'", "lint:fix": "yarn lint:contracts:fix && yarn lint:ts:fix", "lint": "yarn lint:fix && yarn lint:check", - "clean": "rm -rf ./dist ./artifacts ./cache ./coverage ./tsconfig.tsbuildinfo", - "prepublishOnly": "yarn copyfiles -u 1 -e \"**/test-*/**/*\" \"contracts/**/*\" ./", - "postpublish": "rimraf chugsplash L1 L2 libraries standards", - "prepack": "yarn prepublishOnly", - "postpack": "yarn postpublish", + "clean": "rm -rf ./dist ./artifacts ./cache ./coverage ./tsconfig.tsbuildinfo ./chugsplash ./L1 ./L2 ./libraries ./standards", "pre-commit": "lint-staged", "validateDocs": "hardhat validateOutput" }, diff --git a/packages/contracts/scripts/generate-deployed-artifacts.ts b/packages/contracts/scripts/generate-deployed-artifacts.ts index fe99f071c6ce4..4f55a8ea1c3cb 100644 --- a/packages/contracts/scripts/generate-deployed-artifacts.ts +++ b/packages/contracts/scripts/generate-deployed-artifacts.ts @@ -50,7 +50,11 @@ const main = async () => { ) artifactNames.push(artifactName) - content += `const ${artifactName} = require('${relPath}')\n` + // eslint-disable-next-line @typescript-eslint/no-var-requires + const artifact = require(relPath) + content += `const ${artifactName} = { abi: ${JSON.stringify( + artifact.abi + )}, address: '${artifact.address}' }\n` } } diff --git a/packages/contracts/src/contract-defs.ts b/packages/contracts/src/contract-defs.ts index 009c595ac6cb4..cfe8dcd86d349 100644 --- a/packages/contracts/src/contract-defs.ts +++ b/packages/contracts/src/contract-defs.ts @@ -31,7 +31,10 @@ export const getContractDefinition = (name: string): any => { export const getDeployedContractDefinition = ( name: string, network: string -): any => { +): { + address: string + abi: any +} => { const { getDeployedContractArtifact, // eslint-disable-next-line @typescript-eslint/no-var-requires diff --git a/packages/core-utils/package.json b/packages/core-utils/package.json index 36749cb4b17a4..87717cdac4fc0 100644 --- a/packages/core-utils/package.json +++ b/packages/core-utils/package.json @@ -32,14 +32,22 @@ "url": "https://github.com/ethereum-optimism/optimism.git" }, "dependencies": { + "@ethersproject/abi": "^5.6.3", "@ethersproject/abstract-provider": "^5.6.1", + "@ethersproject/address": "^5.6.1", + "@ethersproject/bignumber": "^5.6.1", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/contracts": "^5.6.2", + "@ethersproject/constants": "^5.6.1", + "@ethersproject/hash": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", "@ethersproject/providers": "^5.6.8", + "@ethersproject/rlp": "^5.6.1", "@ethersproject/transactions": "^5.6.2", "@ethersproject/properties": "^5.6.0", "@ethersproject/web": "^5.6.1", "bufio": "^1.0.7", - "chai": "^4.3.4", - "ethers": "^5.6.8" + "chai": "^4.3.4" }, "devDependencies": { "mocha": "^10.0.0" diff --git a/packages/core-utils/src/common/bn.ts b/packages/core-utils/src/common/bn.ts index 42d4438499ddb..4ef48ac69c3c2 100644 --- a/packages/core-utils/src/common/bn.ts +++ b/packages/core-utils/src/common/bn.ts @@ -1,4 +1,5 @@ -import { ethers } from 'ethers' +import { BigNumber } from '@ethersproject/bignumber' +import { getAddress } from '@ethersproject/address' import { remove0x, add0x } from './hex-strings' @@ -8,15 +9,15 @@ import { remove0x, add0x } from './hex-strings' * @param bn BigNumber to convert to an address. * @return BigNumber converted to an address, represented as a hex string. */ -export const bnToAddress = (bn: ethers.BigNumber | number): string => { +export const bnToAddress = (bn: BigNumber | number): string => { // Coerce numbers into a BigNumber. - bn = ethers.BigNumber.from(bn) + bn = BigNumber.from(bn) // Negative numbers are converted to addresses by adding MAX_ADDRESS + 1. // TODO: Explain this in more detail, it's basically just matching the behavior of doing // addr(uint256(addr) - some_number) in Solidity where some_number > uint256(addr). if (bn.isNegative()) { - bn = ethers.BigNumber.from('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') + bn = BigNumber.from('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF') .add(bn) .add(1) } @@ -32,7 +33,7 @@ export const bnToAddress = (bn: ethers.BigNumber | number): string => { // Add 0x again addr = add0x(addr) // Convert into a checksummed address - addr = ethers.utils.getAddress(addr) + addr = getAddress(addr) return addr } diff --git a/packages/core-utils/src/common/hex-strings.ts b/packages/core-utils/src/common/hex-strings.ts index 8f001e097bab9..bc9f365cccffa 100644 --- a/packages/core-utils/src/common/hex-strings.ts +++ b/packages/core-utils/src/common/hex-strings.ts @@ -1,5 +1,6 @@ /* Imports: External */ -import { BigNumber, ethers } from 'ethers' +import { BigNumber } from '@ethersproject/bignumber' +import { isHexString, hexZeroPad } from '@ethersproject/bytes' /** * Removes "0x" from start of a string if it exists. @@ -112,11 +113,11 @@ export const encodeHex = (val: any, len: number): string => * @return True if equal */ export const hexStringEquals = (stringA: string, stringB: string): boolean => { - if (!ethers.utils.isHexString(stringA)) { + if (!isHexString(stringA)) { throw new Error(`input is not a hex string: ${stringA}`) } - if (!ethers.utils.isHexString(stringB)) { + if (!isHexString(stringB)) { throw new Error(`input is not a hex string: ${stringB}`) } @@ -130,5 +131,5 @@ export const hexStringEquals = (stringA: string, stringB: string): boolean => { * @return Number cast as a hex string. */ export const bytes32ify = (value: number | BigNumber): string => { - return ethers.utils.hexZeroPad(BigNumber.from(value).toHexString(), 32) + return hexZeroPad(BigNumber.from(value).toHexString(), 32) } diff --git a/packages/core-utils/src/common/test-utils.ts b/packages/core-utils/src/common/test-utils.ts index 0df28ae2b1b67..9ee8e11ebda61 100644 --- a/packages/core-utils/src/common/test-utils.ts +++ b/packages/core-utils/src/common/test-utils.ts @@ -1,5 +1,5 @@ import { expect } from 'chai' -import { BigNumber } from 'ethers' +import { BigNumber } from '@ethersproject/bignumber' import { sleep } from './misc' diff --git a/packages/core-utils/src/external/ethers/fallback-provider.ts b/packages/core-utils/src/external/ethers/fallback-provider.ts index 9b781a6234c75..c862bc9efabaa 100644 --- a/packages/core-utils/src/external/ethers/fallback-provider.ts +++ b/packages/core-utils/src/external/ethers/fallback-provider.ts @@ -2,9 +2,12 @@ * Provider Utilities */ -import { ethers } from 'ethers' -import { Provider } from '@ethersproject/providers' -import { ConnectionInfo } from 'ethers/lib/utils' +import { + Provider, + StaticJsonRpcProvider, + FallbackProvider as EthersFallbackProvider, +} from '@ethersproject/providers' +import { ConnectionInfo } from '@ethersproject/web' export interface HttpHeaders { [key: string]: string @@ -44,11 +47,11 @@ export const FallbackProvider = ( } configs.push({ priority: i, - provider: new ethers.providers.StaticJsonRpcProvider(connectionInfo), + provider: new StaticJsonRpcProvider(connectionInfo), }) } - return new ethers.providers.FallbackProvider(configs) + return new EthersFallbackProvider(configs) } - return new ethers.providers.FallbackProvider(config) + return new EthersFallbackProvider(config) } diff --git a/packages/core-utils/src/optimism/alias.ts b/packages/core-utils/src/optimism/alias.ts index db983d07200e3..f0b33851ae34a 100644 --- a/packages/core-utils/src/optimism/alias.ts +++ b/packages/core-utils/src/optimism/alias.ts @@ -1,4 +1,5 @@ -import { ethers } from 'ethers' +import { isAddress } from '@ethersproject/address' +import { BigNumber } from '@ethersproject/bignumber' import { bnToAddress } from '../common' @@ -18,11 +19,11 @@ export const L1_TO_L2_ALIAS_OFFSET = * @returns Address with the scheme applied. */ export const applyL1ToL2Alias = (address: string): string => { - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address)) { throw new Error(`not a valid address: ${address}`) } - return bnToAddress(ethers.BigNumber.from(address).add(L1_TO_L2_ALIAS_OFFSET)) + return bnToAddress(BigNumber.from(address).add(L1_TO_L2_ALIAS_OFFSET)) } /** @@ -32,9 +33,9 @@ export const applyL1ToL2Alias = (address: string): string => { * @returns Alias with the scheme reversed. */ export const undoL1ToL2Alias = (address: string): string => { - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address)) { throw new Error(`not a valid address: ${address}`) } - return bnToAddress(ethers.BigNumber.from(address).sub(L1_TO_L2_ALIAS_OFFSET)) + return bnToAddress(BigNumber.from(address).sub(L1_TO_L2_ALIAS_OFFSET)) } diff --git a/packages/core-utils/src/optimism/batch-encoding.ts b/packages/core-utils/src/optimism/batch-encoding.ts index 69e261a9be11e..19d7d67cf9396 100644 --- a/packages/core-utils/src/optimism/batch-encoding.ts +++ b/packages/core-utils/src/optimism/batch-encoding.ts @@ -1,8 +1,8 @@ import zlib from 'zlib' -import { parse, serialize } from '@ethersproject/transactions' -import { ethers } from 'ethers' +import { parse, serialize, Transaction } from '@ethersproject/transactions' import { Struct, BufferWriter, BufferReader } from 'bufio' +import { id } from '@ethersproject/hash' import { remove0x } from '../common' @@ -28,7 +28,7 @@ export interface AppendSequencerBatchParams { const APPEND_SEQUENCER_BATCH_METHOD_ID = 'appendSequencerBatch()' const FOUR_BYTE_APPEND_SEQUENCER_BATCH = Buffer.from( - ethers.utils.id(APPEND_SEQUENCER_BATCH_METHOD_ID).slice(2, 10), + id(APPEND_SEQUENCER_BATCH_METHOD_ID).slice(2, 10), 'hex' ) @@ -166,9 +166,9 @@ export class BatchedTx extends Struct { public txSize: number // rlp encoded transaction public raw: Buffer - public tx: ethers.Transaction + public tx: Transaction - constructor(tx?: ethers.Transaction) { + constructor(tx?: Transaction) { super() this.tx = tx } @@ -210,7 +210,7 @@ export class BatchedTx extends Struct { return this } - toTransaction(): ethers.Transaction { + toTransaction(): Transaction { if (this.tx) { return this.tx } diff --git a/packages/core-utils/src/optimism/deposit-transaction.ts b/packages/core-utils/src/optimism/deposit-transaction.ts index f234872eb5aca..7715781352ba4 100644 --- a/packages/core-utils/src/optimism/deposit-transaction.ts +++ b/packages/core-utils/src/optimism/deposit-transaction.ts @@ -1,14 +1,17 @@ +import { getAddress } from '@ethersproject/address' +import { ContractReceipt, Event } from '@ethersproject/contracts' +import { BigNumber, BigNumberish } from '@ethersproject/bignumber' +import { keccak256 } from '@ethersproject/keccak256' +import { Zero } from '@ethersproject/constants' +import * as RLP from '@ethersproject/rlp' import { - BigNumber, - BigNumberish, + arrayify, BytesLike, - ContractReceipt, - ethers, - Event, - utils, -} from 'ethers' - -const { hexDataSlice, stripZeros, hexConcat, keccak256, zeroPad } = utils + hexDataSlice, + stripZeros, + hexConcat, + zeroPad, +} from '@ethersproject/bytes' const formatBoolean = (value: boolean): Uint8Array => { return value ? new Uint8Array([1]) : new Uint8Array([]) @@ -34,7 +37,7 @@ const handleBoolean = (value: string): boolean => { const handleNumber = (value: string): BigNumber => { if (value === '0x') { - return ethers.constants.Zero + return Zero } return BigNumber.from(value) } @@ -44,7 +47,7 @@ const handleAddress = (value: string): string => { // @ts-ignore return null } - return utils.getAddress(value) + return getAddress(value) } export enum SourceHashDomain { @@ -142,8 +145,8 @@ export class DepositTx { encode() { const fields: any = [ this.sourceHash() || '0x', - utils.getAddress(this.from) || '0x', - this.to != null ? utils.getAddress(this.to) : '0x', + getAddress(this.from) || '0x', + this.to != null ? getAddress(this.to) : '0x', formatNumber(this.mint || 0, 'mint'), formatNumber(this.value || 0, 'value'), formatNumber(this.gas || 0, 'gas'), @@ -153,17 +156,17 @@ export class DepositTx { return hexConcat([ BigNumber.from(this.type).toHexString(), - utils.RLP.encode(fields), + RLP.encode(fields), ]) } decode(raw: BytesLike, extra: DepositTxExtraOpts = {}) { - const payload = utils.arrayify(raw) + const payload = arrayify(raw) if (payload[0] !== this.type) { throw new Error(`Invalid type ${payload[0]}`) } this.version = payload[1] - const transaction = utils.RLP.decode(payload.slice(1)) + const transaction = RLP.decode(payload.slice(1)) this._sourceHash = transaction[0] this.from = handleAddress(transaction[1]) this.to = handleAddress(transaction[2]) diff --git a/packages/core-utils/src/optimism/encoding.ts b/packages/core-utils/src/optimism/encoding.ts index cb1f58fa73c0b..f1f48281d9ba3 100644 --- a/packages/core-utils/src/optimism/encoding.ts +++ b/packages/core-utils/src/optimism/encoding.ts @@ -1,6 +1,7 @@ -import { ethers, BigNumberish, BigNumber } from 'ethers' +import { BigNumberish, BigNumber } from '@ethersproject/bignumber' +import { Interface } from '@ethersproject/abi' -const iface = new ethers.utils.Interface([ +const iface = new Interface([ 'function relayMessage(address,address,bytes,uint256)', 'function relayMessage(uint256,address,address,uint256,uint256,bytes)', ]) diff --git a/packages/core-utils/src/optimism/fees.ts b/packages/core-utils/src/optimism/fees.ts index db33b156685fa..a1103e5754082 100644 --- a/packages/core-utils/src/optimism/fees.ts +++ b/packages/core-utils/src/optimism/fees.ts @@ -2,7 +2,7 @@ * Fee related serialization and deserialization */ -import { BigNumber } from 'ethers' +import { BigNumber } from '@ethersproject/bignumber' import { remove0x } from '../common' diff --git a/packages/core-utils/src/optimism/hashing.ts b/packages/core-utils/src/optimism/hashing.ts index 8a48b7e2852fa..1d9f47abfc44d 100644 --- a/packages/core-utils/src/optimism/hashing.ts +++ b/packages/core-utils/src/optimism/hashing.ts @@ -1,5 +1,6 @@ -import { BigNumberish, BigNumber, utils } from 'ethers' -const { keccak256, defaultAbiCoder } = utils +import { BigNumberish, BigNumber } from '@ethersproject/bignumber' +import { keccak256 } from '@ethersproject/keccak256' +import { defaultAbiCoder } from '@ethersproject/abi' import { decodeVersionedNonce, diff --git a/packages/core-utils/src/optimism/op-provider.ts b/packages/core-utils/src/optimism/op-provider.ts index dda73a1dd6ad7..2dd6e2ece3bf2 100644 --- a/packages/core-utils/src/optimism/op-provider.ts +++ b/packages/core-utils/src/optimism/op-provider.ts @@ -1,6 +1,6 @@ import EventEmitter from 'events' -import { BigNumber } from 'ethers' +import { BigNumber } from '@ethersproject/bignumber' import { deepCopy } from '@ethersproject/properties' import { ConnectionInfo, fetchJson } from '@ethersproject/web' diff --git a/packages/core-utils/test/fees.spec.ts b/packages/core-utils/test/fees.spec.ts index b8b61cefdb843..1e81cf5fa89ed 100644 --- a/packages/core-utils/test/fees.spec.ts +++ b/packages/core-utils/test/fees.spec.ts @@ -1,6 +1,6 @@ import './setup' -import { BigNumber } from 'ethers' +import { BigNumber } from '@ethersproject/bignumber' import { zeroesAndOnes, calldataCost } from '../src' diff --git a/packages/core-utils/test/hex-utils.spec.ts b/packages/core-utils/test/hex-utils.spec.ts index ecac90f22c981..2fd99bbf28034 100644 --- a/packages/core-utils/test/hex-utils.spec.ts +++ b/packages/core-utils/test/hex-utils.spec.ts @@ -1,4 +1,4 @@ -import { BigNumber } from 'ethers' +import { BigNumber } from '@ethersproject/bignumber' /* Imports: Internal */ import { expect } from './setup' diff --git a/packages/sdk/src/utils/chain-constants.ts b/packages/sdk/src/utils/chain-constants.ts index b2f81d3b68215..8f5cae97ed9f3 100644 --- a/packages/sdk/src/utils/chain-constants.ts +++ b/packages/sdk/src/utils/chain-constants.ts @@ -130,17 +130,17 @@ export const CONTRACT_ADDRESSES: { }, [L2ChainID.OPTIMISM_BEDROCK_LOCAL_DEVNET]: { l1: { - AddressManager: '0x610178dA211FEF7D417bC0e6FeD39F05609AD788' as const, + AddressManager: '0x6900000000000000000000000000000000000005' as const, L1CrossDomainMessenger: - '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512' as const, - L1StandardBridge: '0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0' as const, + '0x6900000000000000000000000000000000000002' as const, + L1StandardBridge: '0x6900000000000000000000000000000000000003' as const, StateCommitmentChain: - '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9' as const, + '0x0000000000000000000000000000000000000000' as const, CanonicalTransactionChain: - '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9' as const, - BondManager: '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707' as const, - OptimismPortal: '0x0165878A594ca255338adfa4d48449f69242Eb8F' as const, - L2OutputOracle: '0x5FbDB2315678afecb367f032d93F642f64180aa3' as const, + '0x0000000000000000000000000000000000000000' as const, + BondManager: '0x0000000000000000000000000000000000000000' as const, + OptimismPortal: '0x6900000000000000000000000000000000000001' as const, + L2OutputOracle: '0x6900000000000000000000000000000000000000' as const, }, l2: DEFAULT_L2_CONTRACT_ADDRESSES, }, diff --git a/packages/sdk/tasks/deposit-erc20.ts b/packages/sdk/tasks/deposit-erc20.ts index 40650ba90e1f1..75974664b5e4d 100644 --- a/packages/sdk/tasks/deposit-erc20.ts +++ b/packages/sdk/tasks/deposit-erc20.ts @@ -2,14 +2,13 @@ import { task, types } from 'hardhat/config' import { HardhatRuntimeEnvironment } from 'hardhat/types' import '@nomiclabs/hardhat-ethers' import 'hardhat-deploy' -import { predeploys } from '@eth-optimism/contracts-bedrock' +import { + predeploys, + getContractDefinition, +} from '@eth-optimism/contracts-bedrock' import { Event, Contract, Wallet, providers, utils } from 'ethers' -import { - CrossChainMessenger, - StandardBridgeAdapter, - MessageStatus, -} from '../src' +import { CrossChainMessenger, MessageStatus, CONTRACT_ADDRESSES } from '../src' const deployWETH9 = async ( hre: HardhatRuntimeEnvironment, @@ -18,7 +17,7 @@ const deployWETH9 = async ( const signers = await hre.ethers.getSigners() const signer = signers[0] - const Artifact__WETH9 = await hre.deployments.getArtifact('WETH9') + const Artifact__WETH9 = await getContractDefinition('WETH9') const Factory__WETH9 = new hre.ethers.ContractFactory( Artifact__WETH9.abi, Artifact__WETH9.bytecode, @@ -44,15 +43,16 @@ const createOptimismMintableERC20 = async ( L1ERC20: Contract, l2Signer: Wallet ): Promise => { - const Deployment__OptimismMintableERC20TokenFactory = - await hre.deployments.get('OptimismMintableERC20Factory') + const Artifact__OptimismMintableERC20Token = await getContractDefinition( + 'OptimismMintableERC20' + ) - const Artifact__OptimismMintableERC20Token = - await hre.deployments.getArtifact('OptimismMintableERC20') + const Artifact__OptimismMintableERC20TokenFactory = + await getContractDefinition('OptimismMintableERC20Factory') - const OptimismMintableERC20TokenFactory = await hre.ethers.getContractAt( - Deployment__OptimismMintableERC20TokenFactory.abi, + const OptimismMintableERC20TokenFactory = new Contract( predeploys.OptimismMintableERC20Factory, + Artifact__OptimismMintableERC20TokenFactory.abi, l2Signer ) @@ -80,13 +80,11 @@ const createOptimismMintableERC20 = async ( const l2WethAddress = event.args.remoteToken console.log(`Deployed to ${l2WethAddress}`) - const contract = new Contract( + return new Contract( l2WethAddress, Artifact__OptimismMintableERC20Token.abi, l2Signer ) - - return contract } // TODO(tynes): this task could be modularized in the future @@ -130,61 +128,48 @@ task('deposit-erc20', 'Deposits WETH9 onto L2.') l2Provider ) - const Deployment__L2OutputOracleProxy = await hre.deployments.get( - 'L2OutputOracleProxy' - ) + const l2ChainId = await l2Signer.getChainId() + const contractAddrs = CONTRACT_ADDRESSES[l2ChainId] - const Artifact__L2ToL1MessagePasser = await hre.deployments.getArtifact( + const Artifact__L2ToL1MessagePasser = await getContractDefinition( 'L2ToL1MessagePasser' ) - const Artifact__L2CrossDomainMessenger = await hre.deployments.getArtifact( + const Artifact__L2CrossDomainMessenger = await getContractDefinition( 'L2CrossDomainMessenger' ) - const Artifact__L2StandardBridge = await hre.deployments.getArtifact( + const Artifact__L2StandardBridge = await getContractDefinition( 'L2StandardBridge' ) - const Deployment__OptimismPortal = await hre.deployments.get( + const Artifact__OptimismPortal = await getContractDefinition( 'OptimismPortal' ) - const Deployment__OptimismPortalProxy = await hre.deployments.get( - 'OptimismPortalProxy' - ) - - const Deployment__L1StandardBridgeProxy = await hre.deployments.get( - 'L1StandardBridgeProxy' - ) - - const Deployment__L1CrossDomainMessenger = await hre.deployments.get( + const Artifact__L1CrossDomainMessenger = await getContractDefinition( 'L1CrossDomainMessenger' ) - const Deployment__L1CrossDomainMessengerProxy = await hre.deployments.get( - 'L1CrossDomainMessengerProxy' - ) - - const Deployment__L1StandardBridge = await hre.deployments.get( + const Artifact__L1StandardBridge = await getContractDefinition( 'L1StandardBridge' ) const OptimismPortal = new hre.ethers.Contract( - Deployment__OptimismPortalProxy.address, - Deployment__OptimismPortal.abi, + contractAddrs.l1.OptimismPortal, + Artifact__OptimismPortal.abi, signer ) const L1CrossDomainMessenger = new hre.ethers.Contract( - Deployment__L1CrossDomainMessengerProxy.address, - Deployment__L1CrossDomainMessenger.abi, + contractAddrs.l1.L1CrossDomainMessenger, + Artifact__L1CrossDomainMessenger.abi, signer ) const L1StandardBridge = new hre.ethers.Contract( - Deployment__L1StandardBridgeProxy.address, - Deployment__L1StandardBridge.abi, + contractAddrs.l1.L1StandardBridge, + Artifact__L1StandardBridge.abi, signer ) @@ -207,23 +192,7 @@ task('deposit-erc20', 'Deposits WETH9 onto L2.') l1SignerOrProvider: signer, l2SignerOrProvider: l2Signer, l1ChainId: await signer.getChainId(), - l2ChainId: await l2Signer.getChainId(), - bridges: { - Standard: { - Adapter: StandardBridgeAdapter, - l1Bridge: Deployment__L1StandardBridgeProxy.address, - l2Bridge: predeploys.L2StandardBridge, - }, - }, - contracts: { - l1: { - L1StandardBridge: Deployment__L1StandardBridgeProxy.address, - L1CrossDomainMessenger: - Deployment__L1CrossDomainMessengerProxy.address, - L2OutputOracle: Deployment__L2OutputOracleProxy.address, - OptimismPortal: Deployment__OptimismPortalProxy.address, - }, - }, + l2ChainId, bedrock: true, }) diff --git a/packages/sdk/tasks/deposit-eth.ts b/packages/sdk/tasks/deposit-eth.ts index 7b4471b2f9b7d..b2855a6ececd6 100644 --- a/packages/sdk/tasks/deposit-eth.ts +++ b/packages/sdk/tasks/deposit-eth.ts @@ -1,14 +1,13 @@ import { task, types } from 'hardhat/config' import '@nomiclabs/hardhat-ethers' import 'hardhat-deploy' -import { predeploys } from '@eth-optimism/contracts-bedrock' +import { + predeploys, + getContractDefinition, +} from '@eth-optimism/contracts-bedrock' import { providers, utils } from 'ethers' -import { - CrossChainMessenger, - StandardBridgeAdapter, - MessageStatus, -} from '../src' +import { CrossChainMessenger, MessageStatus, CONTRACT_ADDRESSES } from '../src' task('deposit-eth', 'Deposits WETH9 onto L2.') .addParam( @@ -56,10 +55,6 @@ task('deposit-eth', 'Deposits WETH9 onto L2.') const l2Provider = new providers.StaticJsonRpcProvider(args.l2ProviderUrl) - const Deployment__L2OutputOracleProxy = await hre.deployments.get( - 'L2OutputOracleProxy' - ) - // send to self if not specified const to = args.to ? args.to : address const amount = args.amount @@ -74,57 +69,48 @@ task('deposit-eth', 'Deposits WETH9 onto L2.') l2Provider ) - const Artifact__L2ToL1MessagePasser = await hre.deployments.getArtifact( + const l2ChainId = await l2Signer.getChainId() + const contractAddrs = CONTRACT_ADDRESSES[l2ChainId] + + const Artifact__L2ToL1MessagePasser = await getContractDefinition( 'L2ToL1MessagePasser' ) - const Artifact__L2CrossDomainMessenger = await hre.deployments.getArtifact( + const Artifact__L2CrossDomainMessenger = await getContractDefinition( 'L2CrossDomainMessenger' ) - const Artifact__L2StandardBridge = await hre.deployments.getArtifact( + const Artifact__L2StandardBridge = await getContractDefinition( 'L2StandardBridge' ) - const Deployment__OptimismPortal = await hre.deployments.get( + const Artifact__OptimismPortal = await getContractDefinition( 'OptimismPortal' ) - const Deployment__OptimismPortalProxy = await hre.deployments.get( - 'OptimismPortalProxy' - ) - - const Deployment__L1StandardBridgeProxy = await hre.deployments.get( - 'L1StandardBridgeProxy' - ) - - const Deployment__L1CrossDomainMessenger = await hre.deployments.get( + const Artifact__L1CrossDomainMessenger = await getContractDefinition( 'L1CrossDomainMessenger' ) - const Deployment__L1CrossDomainMessengerProxy = await hre.deployments.get( - 'L1CrossDomainMessengerProxy' - ) - - const Deployment__L1StandardBridge = await hre.deployments.get( + const Artifact__L1StandardBridge = await getContractDefinition( 'L1StandardBridge' ) const OptimismPortal = new hre.ethers.Contract( - Deployment__OptimismPortalProxy.address, - Deployment__OptimismPortal.abi, + contractAddrs.l1.OptimismPortal, + Artifact__OptimismPortal.abi, signer ) const L1CrossDomainMessenger = new hre.ethers.Contract( - Deployment__L1CrossDomainMessengerProxy.address, - Deployment__L1CrossDomainMessenger.abi, + contractAddrs.l1.L1CrossDomainMessenger, + Artifact__L1CrossDomainMessenger.abi, signer ) const L1StandardBridge = new hre.ethers.Contract( - Deployment__L1StandardBridgeProxy.address, - Deployment__L1StandardBridge.abi, + contractAddrs.l1.L1StandardBridge, + Artifact__L1StandardBridge.abi, signer ) @@ -147,23 +133,7 @@ task('deposit-eth', 'Deposits WETH9 onto L2.') l1SignerOrProvider: signer, l2SignerOrProvider: l2Signer, l1ChainId: await signer.getChainId(), - l2ChainId: await l2Signer.getChainId(), - bridges: { - Standard: { - Adapter: StandardBridgeAdapter, - l1Bridge: Deployment__L1StandardBridgeProxy.address, - l2Bridge: predeploys.L2StandardBridge, - }, - }, - contracts: { - l1: { - L1StandardBridge: Deployment__L1StandardBridgeProxy.address, - L1CrossDomainMessenger: - Deployment__L1CrossDomainMessengerProxy.address, - L2OutputOracle: Deployment__L2OutputOracleProxy.address, - OptimismPortal: Deployment__OptimismPortalProxy.address, - }, - }, + l2ChainId, bedrock: true, }) @@ -238,15 +208,19 @@ task('deposit-eth', 'Deposits WETH9 onto L2.') ) console.log('Waiting to be able to withdraw') - setInterval(async () => { + const interval = setInterval(async () => { const currentStatus = await messenger.getMessageStatus(ethWithdrawReceipt) console.log(`Message status: ${MessageStatus[currentStatus]}`) }, 3000) - await messenger.waitForMessageStatus( - ethWithdrawReceipt, - MessageStatus.READY_FOR_RELAY - ) + try { + await messenger.waitForMessageStatus( + ethWithdrawReceipt, + MessageStatus.READY_FOR_RELAY + ) + } finally { + clearInterval(interval) + } const ethFinalize = await messenger.finalizeMessage(ethWithdrawReceipt) const ethFinalizeReceipt = await ethFinalize.wait() diff --git a/proxyd/backend.go b/proxyd/backend.go index 80de372bb2a73..9a004d054d862 100644 --- a/proxyd/backend.go +++ b/proxyd/backend.go @@ -8,7 +8,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math" "math/rand" "net/http" @@ -408,7 +407,7 @@ func (b *Backend) doForward(ctx context.Context, rpcReqs []*RPCReq, isBatch bool } defer httpRes.Body.Close() - resB, err := ioutil.ReadAll(io.LimitReader(httpRes.Body, b.maxResponseSize)) + resB, err := io.ReadAll(io.LimitReader(httpRes.Body, b.maxResponseSize)) if err != nil { return nil, wrapErr(err, "error reading response body") } diff --git a/proxyd/errors.go b/proxyd/errors.go index 97a7ebcc88701..51f8df6ddebb1 100644 --- a/proxyd/errors.go +++ b/proxyd/errors.go @@ -3,5 +3,5 @@ package proxyd import "fmt" func wrapErr(err error, msg string) error { - return fmt.Errorf("%s %v", msg, err) + return fmt.Errorf("%s %w", msg, err) } diff --git a/proxyd/integration_tests/mock_backend_test.go b/proxyd/integration_tests/mock_backend_test.go index aa8f0bad0bc2b..ade879c6ee847 100644 --- a/proxyd/integration_tests/mock_backend_test.go +++ b/proxyd/integration_tests/mock_backend_test.go @@ -4,7 +4,7 @@ import ( "bytes" "context" "encoding/json" - "io/ioutil" + "io" "net/http" "net/http/httptest" "strings" @@ -122,7 +122,7 @@ func (h *BatchRPCResponseRouter) ServeHTTP(w http.ResponseWriter, r *http.Reques h.mtx.Lock() defer h.mtx.Unlock() - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { panic(err) } @@ -241,12 +241,12 @@ func (m *MockBackend) Requests() []*RecordedRequest { func (m *MockBackend) wrappedHandler(w http.ResponseWriter, r *http.Request) { m.mtx.Lock() - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) if err != nil { panic(err) } clone := r.Clone(context.Background()) - clone.Body = ioutil.NopCloser(bytes.NewReader(body)) + clone.Body = io.NopCloser(bytes.NewReader(body)) m.requests = append(m.requests, &RecordedRequest{ Method: r.Method, Headers: r.Header.Clone(), diff --git a/proxyd/integration_tests/util_test.go b/proxyd/integration_tests/util_test.go index 2e443f6f888a8..db52d2f43bc63 100644 --- a/proxyd/integration_tests/util_test.go +++ b/proxyd/integration_tests/util_test.go @@ -4,7 +4,7 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "os" "testing" @@ -67,7 +67,7 @@ func (p *ProxydHTTPClient) SendRequest(body []byte) ([]byte, int, error) { } defer res.Body.Close() code := res.StatusCode - resBody, err := ioutil.ReadAll(res.Body) + resBody, err := io.ReadAll(res.Body) if err != nil { panic(err) } diff --git a/proxyd/rpc.go b/proxyd/rpc.go index ccd7c5f5c8b99..e34b01041fb90 100644 --- a/proxyd/rpc.go +++ b/proxyd/rpc.go @@ -3,7 +3,6 @@ package proxyd import ( "encoding/json" "io" - "io/ioutil" "strings" ) @@ -103,7 +102,7 @@ func ParseBatchRPCReq(body []byte) ([]json.RawMessage, error) { } func ParseRPCRes(r io.Reader) (*RPCRes, error) { - body, err := ioutil.ReadAll(r) + body, err := io.ReadAll(r) if err != nil { return nil, wrapErr(err, "error reading RPC response") } diff --git a/proxyd/server.go b/proxyd/server.go index 5f76e3e962bfc..86d7d5f3138a2 100644 --- a/proxyd/server.go +++ b/proxyd/server.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math" "net/http" "strconv" @@ -236,7 +235,7 @@ func (s *Server) HandleRPC(w http.ResponseWriter, r *http.Request) { "user_agent", userAgent, ) - body, err := ioutil.ReadAll(io.LimitReader(r.Body, s.maxBodySize)) + body, err := io.ReadAll(io.LimitReader(r.Body, s.maxBodySize)) if err != nil { log.Error("error reading request body", "err", err) writeRPCError(ctx, w, nil, ErrInternal) diff --git a/proxyd/tls.go b/proxyd/tls.go index 34b214cddaf2c..ed2bdaff44b4b 100644 --- a/proxyd/tls.go +++ b/proxyd/tls.go @@ -4,11 +4,11 @@ import ( "crypto/tls" "crypto/x509" "errors" - "io/ioutil" + "os" ) func CreateTLSClient(ca string) (*tls.Config, error) { - pem, err := ioutil.ReadFile(ca) + pem, err := os.ReadFile(ca) if err != nil { return nil, wrapErr(err, "error reading CA") } diff --git a/specs/derivation.md b/specs/derivation.md index ca41e7e58da83..87125b1d8fb31 100644 --- a/specs/derivation.md +++ b/specs/derivation.md @@ -313,38 +313,26 @@ A [channel frame][g-channel-frame] is encoded as: ```text frame = channel_id ++ frame_number ++ frame_data_length ++ frame_data ++ is_last -channel_id = random ++ timestamp -random = bytes32 -timestamp = uint64 +channel_id = bytes16 frame_number = uint16 frame_data_length = uint32 frame_data = bytes is_last = bool ``` -Where `uint64`, `uint32` and `uint16` are all big-endian unsigned integers. Type names should be interpreted to and +Where `uint32` and `uint16` are all big-endian unsigned integers. Type names should be interpreted to and encoded according to [the Solidity ABI][solidity-abi]. [solidity-abi]: https://docs.soliditylang.org/en/v0.8.16/abi-spec.html -All data in a frame is fixed-size, except the `frame_data`. The fixed overhead is `32 + 8 + 2 + 4 + 1 = 47 bytes`. +All data in a frame is fixed-size, except the `frame_data`. The fixed overhead is `16 + 2 + 4 + 1 = 23 bytes`. Fixed-size frame metadata avoids a circular dependency with the target total data length, to simplify packing of frames with varying content length. where: -- `channel_id` uniquely identifies a channel as the concatenation of a random value and a timestamp - - `random` is a random value such that two channels with different batches should have a different random value - - `timestamp` is the time at which the channel was created (UNIX time in seconds) - - The ID includes both the random value and the timestamp, in order to prevent a malicious sequencer from reusing the - random value after the channel has [timed out][g-channel-timeout] (refer to the [batcher - specification][batcher-spec] to learn more about channel timeouts). This will also allow us substitute `random` by a - hash commitment to the batches, should we want to do so in the future. - - Frames with a channel ID whose timestamp are higher than that of the L1 block on which the frame appears must be - ignored. Note that L1 nodes cannot easily manipulate the L1 block timestamp: L1 nodes have a soft constraint to - ignore blocks whose timestamps that are ahead of the wallclock time by a certain margin. (A soft constraint is not a - consensus rule — nodes will accept such blocks in the canonical chain but will not attempt to build directly on - them.) This issue goes away with Proof of Stake, where timestamps are determined by [L1 time slots][g-time-slot]. +- `channel_id` is an opaque identifier for the channel. It should not be reused and is suggested to be random; however, +outside of timeout rules, it is not checked for validity - `frame_number` identifies the index of the frame within the channel - `frame_data_length` is the length of `frame_data` in bytes. It is capped to 1,000,000 bytes. - `frame_data` is a sequence of bytes belonging to the channel, logically after the bytes from the previous frames @@ -505,7 +493,8 @@ However, our current implementation doesn't support streaming decompression, so - We have received all frames in the channel: i.e. we received the last frame in the channel (`is_last == 1`) and every frame with a lower number. - The channel has timed out (in which we case we read all contiguous sequential frames from the start of the channel). - - A channel is considered to be *timed out* if `currentL1Block.timestamp > channeld_id.timestamp + CHANNEL_TIMEOUT`. + - A channel is considered to be *timed out* if +`currentL1Block.number > channeld_id.starting_l1_number + CHANNEL_TIMEOUT`. - where `currentL1Block` is the L1 block maintained by this stage, which is the most recent L1 block whose frames have been added to the channel bank. - The channel is pruned out of the channel bank (see below), in which case it isn't passed to the further stages. @@ -945,12 +934,12 @@ epoch sequencing window, assuming it is in the same epoch as `safeL2Head`). > could post a batch for the L2 block `safeL2Head + 1` on L1 block `safeL2Head.1Origin`. Keeping things worst case, `safeL2Head.l1Origin` would also be the last allowable block for the frame to land. The -allowed time range for frames within a channel to land on L1 is `[channel_id.timestamp, channel_id.timestamp + -CHANNEL_TIMEOUT]`. The allowed L1 block range for these frames are any L1 block whose timestamp falls inside this time +allowed time range for frames within a channel to land on L1 is `[channel_id.number, channel_id.number + +CHANNEL_TIMEOUT]`. The allowed L1 block range for these frames are any L1 block whose number falls inside this block range. -Therefore, to be safe, we can reset the L1 head of Channel Buffering to the oldest L1 block whose timestamp is higher -than `safeL2Head.l1Origin.timestamp - CHANNEL_TIMEOUT`. +Therefore, to be safe, we can reset the L1 head of Channel Buffering to the L1 block whose number is +`safeL2Head.l1Origin.number - CHANNEL_TIMEOUT`. > **Note** The above is what the implementation currently does. @@ -958,7 +947,7 @@ In reality it's only strictly necessary to reset the oldest L1 block whose times `channel_id.timestamp` found in the batcher transaction that is not older than `safeL2Head.l1Origin.timestamp - CHANNEL_TIMEOUT`. -We define `CHANNEL_TIMEOUT = 600`, i.e. 10 hours. +We define `CHANNEL_TIMEOUT = 50`, i.e. 10mins > **TODO** does `CHANNEL_TIMEOUT` have a relationship with `SWS`? > diff --git a/specs/meta/linting.md b/specs/meta/linting.md index 606d765c8d41b..d247bb87f9bc7 100644 --- a/specs/meta/linting.md +++ b/specs/meta/linting.md @@ -64,5 +64,5 @@ Justification for linting rules: # Install linter globally (should not affect go.mod) go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.48.0 # run linter, add --fix option to fix problems (where supported) -golangci-lint run -E asciicheck,goimports,misspell +golangci-lint run -E goimports,sqlclosecheck,bodyclose,asciicheck,misspell ``` diff --git a/yarn.lock b/yarn.lock index bc21e89a69603..d7a6c188ad019 100644 --- a/yarn.lock +++ b/yarn.lock @@ -981,6 +981,21 @@ "@ethersproject/properties" "^5.4.0" "@ethersproject/strings" "^5.4.0" +"@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" @@ -1007,6 +1022,19 @@ "@ethersproject/transactions" "^5.6.2" "@ethersproject/web" "^5.6.1" +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + "@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" @@ -1029,6 +1057,17 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/address@5.4.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" @@ -1051,6 +1090,17 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.1" +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" @@ -1065,6 +1115,13 @@ dependencies: "@ethersproject/bytes" "^5.6.1" +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" @@ -1099,6 +1156,15 @@ "@ethersproject/logger" "^5.6.0" bn.js "^5.2.1" +"@ethersproject/bignumber@^5.6.1", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + "@ethersproject/bytes@5.4.0", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" @@ -1113,6 +1179,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/constants@5.4.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" @@ -1127,6 +1200,13 @@ dependencies: "@ethersproject/bignumber" "^5.6.2" +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/contracts@5.4.1": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" @@ -1159,6 +1239,22 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.2" +"@ethersproject/contracts@^5.6.2": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/hardware-wallets@^5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/hardware-wallets/-/hardware-wallets-5.6.1.tgz#d99ee1c6169bd9f3423c386e3b11e0ab09f34964" @@ -1199,6 +1295,21 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" @@ -1289,6 +1400,14 @@ "@ethersproject/bytes" "^5.6.1" js-sha3 "0.8.0" +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + "@ethersproject/logger@5.4.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9" @@ -1299,6 +1418,11 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + "@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0": version "5.4.2" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" @@ -1320,6 +1444,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/networks@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" + integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" @@ -1350,6 +1481,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/providers@5.4.4": version "5.4.4" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.4.tgz#6729120317942fc0ab0ecdb35e944ec6bbedb795" @@ -1433,6 +1571,14 @@ "@ethersproject/bytes" "^5.6.1" "@ethersproject/logger" "^5.6.0" +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" @@ -1475,6 +1621,18 @@ elliptic "6.5.4" hash.js "1.1.7" +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + "@ethersproject/solidity@5.4.0", "@ethersproject/solidity@^5.0.9": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" @@ -1516,6 +1674,15 @@ "@ethersproject/constants" "^5.6.1" "@ethersproject/logger" "^5.6.0" +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" @@ -1546,6 +1713,21 @@ "@ethersproject/rlp" "^5.6.1" "@ethersproject/signing-key" "^5.6.2" +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/units@5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" @@ -1628,6 +1810,17 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.1" +"@ethersproject/web@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" + integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7"