diff --git a/go.mod b/go.mod index 84347bc086458..bd2cf4e1a58ee 100644 --- a/go.mod +++ b/go.mod @@ -274,7 +274,7 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101503.1-rc.1 +replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101503.2-rc.1 //replace github.com/ethereum/go-ethereum => ../op-geth diff --git a/go.sum b/go.sum index dba49dbacc9c9..b8b476114fb79 100644 --- a/go.sum +++ b/go.sum @@ -204,10 +204,8 @@ github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/u github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3 h1:RWHKLhCrQThMfch+QJ1Z8veEq5ZO3DfIhZ7xgRP9WTc= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.3/go.mod h1:QziizLAiF0KqyLdNJYD7O5cpDlaFMNZzlxYNcWsJUxs= -github.com/ethereum-optimism/op-geth v1.101503.1-rc.1 h1:jKZUJb/oFgwT/z/d+vlBsKSgrDfkblawT3WYasfiQV8= -github.com/ethereum-optimism/op-geth v1.101503.1-rc.1/go.mod h1:QUo3fn+45vWqJWzJW+rIzRHUV7NmhhHLPdI87mAn1M8= -github.com/ethereum-optimism/superchain-registry/validation v0.0.0-20250307201638-7c3999db14c6 h1:EBEaI3oygl1npFpvdHghcWbKnhj2alEe4KqM2jG2XS8= -github.com/ethereum-optimism/superchain-registry/validation v0.0.0-20250307201638-7c3999db14c6/go.mod h1:NZ816PzLU1TLv1RdAvYAb6KWOj4Zm5aInT0YpDVml2Y= +github.com/ethereum-optimism/op-geth v1.101503.2-rc.1 h1:a//Sc0necznugHkwS4gey4uS9qDoSk8g3TazLDVnQ/8= +github.com/ethereum-optimism/op-geth v1.101503.2-rc.1/go.mod h1:QUo3fn+45vWqJWzJW+rIzRHUV7NmhhHLPdI87mAn1M8= github.com/ethereum-optimism/superchain-registry/validation v0.0.0-20250314162817-2c60e5723c64 h1:teDhU4h4ryaE8rSBl+vJJiwKHjxdnnHPkKZ9iNr2R8k= github.com/ethereum-optimism/superchain-registry/validation v0.0.0-20250314162817-2c60e5723c64/go.mod h1:NZ816PzLU1TLv1RdAvYAb6KWOj4Zm5aInT0YpDVml2Y= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= diff --git a/op-e2e/actions/interop/dsl/inbox.go b/op-e2e/actions/interop/dsl/inbox.go index 17a10596f1ad4..0a75ce7239cc8 100644 --- a/op-e2e/actions/interop/dsl/inbox.go +++ b/op-e2e/actions/interop/dsl/inbox.go @@ -3,11 +3,16 @@ package dsl import ( "math/big" + "github.com/stretchr/testify/require" + + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox" + "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/predeploys" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" + stypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" ) type InboxContract struct { @@ -84,7 +89,21 @@ func (i *InboxContract) Execute(user *DSLUser, initTx *GeneratedTransaction, arg txOpts, from := user.TransactOpts(chain.ChainID.ToBig()) contract, err := inbox.NewInbox(predeploys.CrossL2InboxAddr, chain.SequencerEngine.EthClient()) require.NoError(i.t, err) - tx, err := contract.ValidateMessage(txOpts, ident, crypto.Keccak256Hash(payload)) + id := stypes.Identifier{ + Origin: ident.Origin, + BlockNumber: ident.BlockNumber.Uint64(), + LogIndex: uint32(ident.LogIndex.Uint64()), + Timestamp: ident.Timestamp.Uint64(), + ChainID: eth.ChainIDFromBig(ident.ChainId), + } + msgHash := crypto.Keccak256Hash(payload) + access := id.ChecksumArgs(msgHash).Access() + inboxAccessList := stypes.EncodeAccessList([]stypes.Access{access}) + txOpts.AccessList = types.AccessList{types.AccessTuple{ + Address: predeploys.CrossL2InboxAddr, + StorageKeys: inboxAccessList, + }} + tx, err := contract.ValidateMessage(txOpts, ident, msgHash) require.NoError(i.t, err) genTx := NewGeneratedTransaction(i.t, chain, tx, from) i.Transactions = append(i.Transactions, genTx) diff --git a/op-e2e/actions/interop/dsl/message.go b/op-e2e/actions/interop/dsl/message.go index 0edaa0c483357..9ed433c2755d4 100644 --- a/op-e2e/actions/interop/dsl/message.go +++ b/op-e2e/actions/interop/dsl/message.go @@ -3,6 +3,8 @@ package dsl import ( "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox" + "github.com/ethereum-optimism/optimism/op-service/predeploys" + "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" ) @@ -54,10 +56,22 @@ func (m *Message) ActEmitDeposit(l1User *DSLUser) helpers.Action { } } +func sanityCheckAccessList(t helpers.Testing, li types.AccessList) { + for _, e := range li { + if e.Address == predeploys.CrossL2InboxAddr { + if len(e.StorageKeys) > 0 { + return + } + } + } + t.Fatal("expected executing-message entries in access-list") +} + func (m *Message) ExecuteOn(target *Chain, execOpts ...func(*ExecuteOpts)) *Message { require.NotNil(m.t, m.initTx, "message must be emitted before it can be executed") execAction := m.inbox.Execute(m.user, m.initTx, execOpts...) m.execTx = execAction(target) + sanityCheckAccessList(m.t, m.execTx.tx.AccessList()) m.execTx.IncludeOK() return m } @@ -69,6 +83,7 @@ func (m *Message) ExecutePendingOn(target *Chain, pendingMessageBlockNumber uint opts = append(opts, execOpts...) execAction := m.inbox.Execute(m.user, nil, opts...) m.execTx = execAction(target) + sanityCheckAccessList(m.t, m.execTx.tx.AccessList()) m.execTx.IncludeOK() return m } diff --git a/op-e2e/actions/interop/emitter_contract_test.go b/op-e2e/actions/interop/emitter_contract_test.go index 4471e40fea249..cf2d742cf6a1b 100644 --- a/op-e2e/actions/interop/emitter_contract_test.go +++ b/op-e2e/actions/interop/emitter_contract_test.go @@ -5,21 +5,23 @@ import ( "math/big" "testing" - "github.com/ethereum-optimism/optimism/op-e2e/actions/interop/dsl" + "github.com/stretchr/testify/require" + "github.com/ethereum/go-ethereum" "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/crypto" "github.com/ethereum/go-ethereum/params" - "github.com/stretchr/testify/require" "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" + "github.com/ethereum-optimism/optimism/op-e2e/actions/interop/dsl" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/emit" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-node/rollup/event" + "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/predeploys" stypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" ) @@ -31,7 +33,6 @@ type userWithKeys struct { } func TestEmitterContract(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") var ( is *dsl.InteropSetup actors *dsl.InteropActors @@ -72,7 +73,14 @@ func TestEmitterContract(gt *testing.T) { id := idForTx(t, emitTx, actors.ChainA) contract, err := inbox.NewInbox(predeploys.CrossL2InboxAddr, actors.ChainB.SequencerEngine.EthClient()) require.NoError(t, err) - tx, err := contract.ValidateMessage(auth, id, crypto.Keccak256Hash(fakeMessage)) + msgHash := crypto.Keccak256Hash(fakeMessage) + access := id.ChecksumArgs(msgHash).Access() + inboxAccessList := stypes.EncodeAccessList([]stypes.Access{access}) + auth.AccessList = types.AccessList{types.AccessTuple{ + Address: predeploys.CrossL2InboxAddr, + StorageKeys: inboxAccessList, + }} + tx, err := contract.ValidateMessage(auth, identifierForBindings(id), msgHash) require.NoError(t, err) // Process the invalid message attempt and verify that only the local unsafe head progresses @@ -128,27 +136,43 @@ func newExecuteMessageTx(t helpers.Testing, destChain *dsl.Chain, executor *user } // newExecuteMessageTxFromIDAndHash creates a new executing message tx for the given id and hash. -func newExecuteMessageTxFromIDAndHash(t helpers.Testing, executor *userWithKeys, destChain *dsl.Chain, id inbox.Identifier, hash common.Hash) *types.Transaction { +func newExecuteMessageTxFromIDAndHash(t helpers.Testing, executor *userWithKeys, destChain *dsl.Chain, id stypes.Identifier, msgHash common.Hash) *types.Transaction { inboxContract, err := inbox.NewInbox(predeploys.CrossL2InboxAddr, destChain.SequencerEngine.EthClient()) require.NoError(t, err) auth := newL2TxOpts(t, executor.secret, destChain) - tx, err := inboxContract.ValidateMessage(auth, id, hash) + access := id.ChecksumArgs(msgHash).Access() + inboxAccessList := stypes.EncodeAccessList([]stypes.Access{access}) + auth.AccessList = types.AccessList{types.AccessTuple{ + Address: predeploys.CrossL2InboxAddr, + StorageKeys: inboxAccessList, + }} + tx, err := inboxContract.ValidateMessage(auth, identifierForBindings(id), msgHash) require.NoError(t, err) return tx } -func idForTx(t helpers.Testing, tx *types.Transaction, srcChain *dsl.Chain) inbox.Identifier { +func idForTx(t helpers.Testing, tx *types.Transaction, srcChain *dsl.Chain) stypes.Identifier { receipt, err := srcChain.SequencerEngine.EthClient().TransactionReceipt(t.Ctx(), tx.Hash()) require.NoError(t, err) block, err := srcChain.SequencerEngine.EthClient().BlockByNumber(t.Ctx(), receipt.BlockNumber) require.NoError(t, err) - return inbox.Identifier{ + return stypes.Identifier{ Origin: *tx.To(), - BlockNumber: receipt.BlockNumber, - LogIndex: common.Big0, - Timestamp: big.NewInt(int64(block.Time())), - ChainId: srcChain.RollupCfg.L2ChainID, + BlockNumber: receipt.BlockNumber.Uint64(), + LogIndex: 0, + Timestamp: block.Time(), + ChainID: eth.ChainIDFromBig(srcChain.RollupCfg.L2ChainID), + } +} + +func identifierForBindings(id stypes.Identifier) inbox.Identifier { + return inbox.Identifier{ + Origin: id.Origin, + BlockNumber: new(big.Int).SetUint64(id.BlockNumber), + LogIndex: new(big.Int).SetUint64(uint64(id.LogIndex)), + Timestamp: new(big.Int).SetUint64(id.Timestamp), + ChainId: id.ChainID.ToBig(), } } diff --git a/op-e2e/actions/interop/interop_test.go b/op-e2e/actions/interop/interop_test.go index ebf5f67ce00a0..c466dbe5e007b 100644 --- a/op-e2e/actions/interop/interop_test.go +++ b/op-e2e/actions/interop/interop_test.go @@ -1,7 +1,6 @@ package interop import ( - "math/big" "testing" "github.com/stretchr/testify/require" @@ -12,12 +11,11 @@ import ( "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers" "github.com/ethereum-optimism/optimism/op-e2e/actions/interop/dsl" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/emit" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-node/rollup/event" "github.com/ethereum-optimism/optimism/op-node/rollup/interop/managed" "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/predeploys" + stypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types" ) func TestFullInterop(gt *testing.T) { @@ -240,7 +238,6 @@ func TestFinality(gt *testing.T) { } func TestInteropLocalSafeInvalidation(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) is := dsl.SetupInterop(t) @@ -252,21 +249,18 @@ func TestInteropLocalSafeInvalidation(gt *testing.T) { // build L2 block on chain B with invalid executing message pointing to A. fakeMessage := []byte("this message was never emitted") aliceB := setupUser(t, is, actors.ChainB, 0) - auth := newL2TxOpts(t, aliceB.secret, actors.ChainB) - id := inbox.Identifier{ + id := stypes.Identifier{ Origin: common.Address{0x42}, - BlockNumber: new(big.Int).SetUint64(genesisB.UnsafeL2.Number), - LogIndex: common.Big0, - Timestamp: new(big.Int).SetUint64(genesisB.UnsafeL2.Time), - ChainId: actors.ChainA.RollupCfg.L2ChainID, + BlockNumber: genesisB.UnsafeL2.Number, + LogIndex: 0, + Timestamp: genesisB.UnsafeL2.Time, + ChainID: eth.ChainIDFromBig(actors.ChainA.RollupCfg.L2ChainID), } - contract, err := inbox.NewInbox(predeploys.CrossL2InboxAddr, actors.ChainB.SequencerEngine.EthClient()) - require.NoError(t, err) - tx, err := contract.ValidateMessage(auth, id, crypto.Keccak256Hash(fakeMessage)) - require.NoError(t, err) + msgHash := crypto.Keccak256Hash(fakeMessage) + tx := newExecuteMessageTxFromIDAndHash(t, aliceB, actors.ChainB, id, msgHash) actors.ChainB.Sequencer.ActL2StartBlock(t) - _, err = actors.ChainB.SequencerEngine.EngineApi.IncludeTx(tx, aliceB.address) + _, err := actors.ChainB.SequencerEngine.EngineApi.IncludeTx(tx, aliceB.address) require.NoError(t, err) actors.ChainB.Sequencer.ActL2EndBlock(t) actors.ChainB.Sequencer.ActL2PipelineFull(t) @@ -359,7 +353,6 @@ func TestInteropLocalSafeInvalidation(gt *testing.T) { } func TestInteropCrossSafeDependencyDelay(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) is := dsl.SetupInterop(t) @@ -443,7 +436,6 @@ func TestInteropCrossSafeDependencyDelay(gt *testing.T) { } func TestInteropExecutingMessageOutOfRangeLogIndex(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) is := dsl.SetupInterop(t) actors := is.CreateActors() @@ -452,12 +444,12 @@ func TestInteropExecutingMessageOutOfRangeLogIndex(gt *testing.T) { // Execute a fake log on chain A chainBHead := actors.ChainB.Sequencer.SyncStatus().UnsafeL2 - nonExistentID := inbox.Identifier{ + nonExistentID := stypes.Identifier{ Origin: aliceA.address, - BlockNumber: big.NewInt(int64(chainBHead.Number)), - LogIndex: common.Big0, - Timestamp: big.NewInt(int64(chainBHead.Time)), - ChainId: actors.ChainB.RollupCfg.L2ChainID, + BlockNumber: chainBHead.Number, + LogIndex: 0, + Timestamp: chainBHead.Time, + ChainID: eth.ChainIDFromBig(actors.ChainB.RollupCfg.L2ChainID), } nonExistentHash := crypto.Keccak256Hash([]byte("fake message")) tx := newExecuteMessageTxFromIDAndHash(t, aliceA, actors.ChainA, nonExistentID, nonExistentHash) diff --git a/op-e2e/actions/interop/proofs_test.go b/op-e2e/actions/interop/proofs_test.go index fdbd5f02f598b..f60656b682055 100644 --- a/op-e2e/actions/interop/proofs_test.go +++ b/op-e2e/actions/interop/proofs_test.go @@ -87,7 +87,6 @@ func TestInteropFaultProofs_TraceExtensionActivation(gt *testing.T) { } func TestInteropFaultProofs_ConsolidateValidCrossChainMessage(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) system := dsl.NewInteropDSL(t) actors := system.Actors @@ -367,7 +366,6 @@ func TestInteropFaultProofs(gt *testing.T) { } func TestInteropFaultProofs_IntraBlock(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") cases := []intraBlockTestCase{ new(cascadeInvalidBlockCase), new(swapCascadeInvalidBlockCase), @@ -447,7 +445,6 @@ func TestInteropFaultProofs_IntraBlock(gt *testing.T) { } func TestInteropFaultProofs_MessageExpiry(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) system := dsl.NewInteropDSL(t) @@ -517,7 +514,6 @@ func TestInteropFaultProofs_MessageExpiry(gt *testing.T) { } func TestInteropFaultProofsInvalidBlock(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) system := dsl.NewInteropDSL(t) @@ -1137,7 +1133,6 @@ func TestInteropFaultProofs_VariedBlockTimes_FasterChainB(gt *testing.T) { } func TestInteropFaultProofs_DepositMessage(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) system := dsl.NewInteropDSL(t) @@ -1198,7 +1193,6 @@ func TestInteropFaultProofs_DepositMessage(gt *testing.T) { } func TestInteropFaultProofs_DepositMessage_InvalidExecution(gt *testing.T) { - gt.Skip("temporarily broken by access-list change") t := helpers.NewDefaultTesting(gt) system := dsl.NewInteropDSL(t) @@ -1389,7 +1383,7 @@ func assertTime(t helpers.Testing, chain *dsl.Chain, unsafe, crossUnsafe, localS func assertUserDepositEmitted(t helpers.Testing, chain *dsl.Chain, number *big.Int, emitter *dsl.EmitterContract) { block, err := chain.SequencerEngine.EthClient().BlockByNumber(t.Ctx(), number) require.NoError(t, err) - require.GreaterOrEqual(t, len(block.Transactions()), 3) // l1-attrs + user-deposit + l1-attrs (end deposit contxt) + [txs] + require.GreaterOrEqual(t, len(block.Transactions()), 2) // l1-attrs + user-deposit + [txs] userDepositTx := block.Transactions()[1] require.NotNil(t, userDepositTx.To()) require.Equal(t, emitter.Address(chain), *userDepositTx.To()) diff --git a/op-e2e/e2eutils/interop/contracts/bindings/emit/emit.go b/op-e2e/e2eutils/interop/contracts/bindings/emit/emit.go index 7755ef5fd18fd..ceae2412659bc 100644 --- a/op-e2e/e2eutils/interop/contracts/bindings/emit/emit.go +++ b/op-e2e/e2eutils/interop/contracts/bindings/emit/emit.go @@ -26,6 +26,7 @@ var ( _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription + _ = abi.ConvertType ) // EmitMetaData contains all meta data concerning the Emit contract. @@ -156,11 +157,11 @@ func NewEmitFilterer(address common.Address, filterer bind.ContractFilterer) (*E // bindEmit binds a generic wrapper to an already deployed contract. func bindEmit(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(EmitABI)) + parsed, err := EmitMetaData.GetAbi() if err != nil { return nil, err } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and diff --git a/op-e2e/e2eutils/interop/contracts/bindings/inbox/inbox.go b/op-e2e/e2eutils/interop/contracts/bindings/inbox/inbox.go index e9381f631dffd..e41399ef1844d 100644 --- a/op-e2e/e2eutils/interop/contracts/bindings/inbox/inbox.go +++ b/op-e2e/e2eutils/interop/contracts/bindings/inbox/inbox.go @@ -26,6 +26,7 @@ var ( _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription + _ = abi.ConvertType ) // Identifier is an auto generated low-level Go binding around an user-defined struct. @@ -39,7 +40,7 @@ type Identifier struct { // InboxMetaData contains all meta data concerning the Inbox contract. var InboxMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"executeMessage\",\"inputs\":[{\"name\":\"_id\",\"type\":\"tuple\",\"internalType\":\"structIdentifier\",\"components\":[{\"name\":\"origin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"logIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_message\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"validateMessage\",\"inputs\":[{\"name\":\"_id\",\"type\":\"tuple\",\"internalType\":\"structIdentifier\",\"components\":[{\"name\":\"origin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"logIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", + ABI: "[{\"type\":\"function\",\"name\":\"validateMessage\",\"inputs\":[{\"name\":\"_id\",\"type\":\"tuple\",\"internalType\":\"structIdentifier\",\"components\":[{\"name\":\"origin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"logIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ExecutingMessage\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"id\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIdentifier\",\"components\":[{\"name\":\"origin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"logIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BlockNumberTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LogIndexTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoExecutingDeposits\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInAccessList\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampTooHigh\",\"inputs\":[]}]", } // InboxABI is the input ABI used to generate the binding from. @@ -143,11 +144,11 @@ func NewInboxFilterer(address common.Address, filterer bind.ContractFilterer) (* // bindInbox binds a generic wrapper to an already deployed contract. func bindInbox(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(InboxABI)) + parsed, err := InboxMetaData.GetAbi() if err != nil { return nil, err } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and @@ -188,6 +189,37 @@ func (_Inbox *InboxTransactorRaw) Transact(opts *bind.TransactOpts, method strin return _Inbox.Contract.contract.Transact(opts, method, params...) } +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_Inbox *InboxCaller) Version(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Inbox.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 (_Inbox *InboxSession) Version() (string, error) { + return _Inbox.Contract.Version(&_Inbox.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_Inbox *InboxCallerSession) Version() (string, error) { + return _Inbox.Contract.Version(&_Inbox.CallOpts) +} + // ValidateMessage is a paid mutator transaction binding the contract method 0xab4d6f75. // // Solidity: function validateMessage((address,uint256,uint256,uint256,uint256) _id, bytes32 _msgHash) returns() @@ -208,3 +240,148 @@ func (_Inbox *InboxSession) ValidateMessage(_id Identifier, _msgHash [32]byte) ( func (_Inbox *InboxTransactorSession) ValidateMessage(_id Identifier, _msgHash [32]byte) (*types.Transaction, error) { return _Inbox.Contract.ValidateMessage(&_Inbox.TransactOpts, _id, _msgHash) } + +// InboxExecutingMessageIterator is returned from FilterExecutingMessage and is used to iterate over the raw logs and unpacked data for ExecutingMessage events raised by the Inbox contract. +type InboxExecutingMessageIterator struct { + Event *InboxExecutingMessage // 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 *InboxExecutingMessageIterator) 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(InboxExecutingMessage) + 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(InboxExecutingMessage) + 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 *InboxExecutingMessageIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *InboxExecutingMessageIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// InboxExecutingMessage represents a ExecutingMessage event raised by the Inbox contract. +type InboxExecutingMessage struct { + MsgHash [32]byte + Id Identifier + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutingMessage is a free log retrieval operation binding the contract event 0x5c37832d2e8d10e346e55ad62071a6a2f9fa5130614ef2ec6617555c6f467ba7. +// +// Solidity: event ExecutingMessage(bytes32 indexed msgHash, (address,uint256,uint256,uint256,uint256) id) +func (_Inbox *InboxFilterer) FilterExecutingMessage(opts *bind.FilterOpts, msgHash [][32]byte) (*InboxExecutingMessageIterator, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _Inbox.contract.FilterLogs(opts, "ExecutingMessage", msgHashRule) + if err != nil { + return nil, err + } + return &InboxExecutingMessageIterator{contract: _Inbox.contract, event: "ExecutingMessage", logs: logs, sub: sub}, nil +} + +// WatchExecutingMessage is a free log subscription operation binding the contract event 0x5c37832d2e8d10e346e55ad62071a6a2f9fa5130614ef2ec6617555c6f467ba7. +// +// Solidity: event ExecutingMessage(bytes32 indexed msgHash, (address,uint256,uint256,uint256,uint256) id) +func (_Inbox *InboxFilterer) WatchExecutingMessage(opts *bind.WatchOpts, sink chan<- *InboxExecutingMessage, msgHash [][32]byte) (event.Subscription, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _Inbox.contract.WatchLogs(opts, "ExecutingMessage", 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(InboxExecutingMessage) + if err := _Inbox.contract.UnpackLog(event, "ExecutingMessage", 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 +} + +// ParseExecutingMessage is a log parse operation binding the contract event 0x5c37832d2e8d10e346e55ad62071a6a2f9fa5130614ef2ec6617555c6f467ba7. +// +// Solidity: event ExecutingMessage(bytes32 indexed msgHash, (address,uint256,uint256,uint256,uint256) id) +func (_Inbox *InboxFilterer) ParseExecutingMessage(log types.Log) (*InboxExecutingMessage, error) { + event := new(InboxExecutingMessage) + if err := _Inbox.contract.UnpackLog(event, "ExecutingMessage", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/op-e2e/e2eutils/interop/contracts/bindings/systemconfig/systemconfig.go b/op-e2e/e2eutils/interop/contracts/bindings/systemconfig/systemconfig.go deleted file mode 100644 index 9e29cc4700e59..0000000000000 --- a/op-e2e/e2eutils/interop/contracts/bindings/systemconfig/systemconfig.go +++ /dev/null @@ -1,201 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package systemconfig - -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 -) - -// SystemconfigMetaData contains all meta data concerning the Systemconfig contract. -var SystemconfigMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addDependency\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", -} - -// SystemconfigABI is the input ABI used to generate the binding from. -// Deprecated: Use SystemconfigMetaData.ABI instead. -var SystemconfigABI = SystemconfigMetaData.ABI - -// Systemconfig is an auto generated Go binding around an Ethereum contract. -type Systemconfig struct { - SystemconfigCaller // Read-only binding to the contract - SystemconfigTransactor // Write-only binding to the contract - SystemconfigFilterer // Log filterer for contract events -} - -// SystemconfigCaller is an auto generated read-only Go binding around an Ethereum contract. -type SystemconfigCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SystemconfigTransactor is an auto generated write-only Go binding around an Ethereum contract. -type SystemconfigTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SystemconfigFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type SystemconfigFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// SystemconfigSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type SystemconfigSession struct { - Contract *Systemconfig // 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 -} - -// SystemconfigCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type SystemconfigCallerSession struct { - Contract *SystemconfigCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// SystemconfigTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type SystemconfigTransactorSession struct { - Contract *SystemconfigTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// SystemconfigRaw is an auto generated low-level Go binding around an Ethereum contract. -type SystemconfigRaw struct { - Contract *Systemconfig // Generic contract binding to access the raw methods on -} - -// SystemconfigCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type SystemconfigCallerRaw struct { - Contract *SystemconfigCaller // Generic read-only contract binding to access the raw methods on -} - -// SystemconfigTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type SystemconfigTransactorRaw struct { - Contract *SystemconfigTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewSystemconfig creates a new instance of Systemconfig, bound to a specific deployed contract. -func NewSystemconfig(address common.Address, backend bind.ContractBackend) (*Systemconfig, error) { - contract, err := bindSystemconfig(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &Systemconfig{SystemconfigCaller: SystemconfigCaller{contract: contract}, SystemconfigTransactor: SystemconfigTransactor{contract: contract}, SystemconfigFilterer: SystemconfigFilterer{contract: contract}}, nil -} - -// NewSystemconfigCaller creates a new read-only instance of Systemconfig, bound to a specific deployed contract. -func NewSystemconfigCaller(address common.Address, caller bind.ContractCaller) (*SystemconfigCaller, error) { - contract, err := bindSystemconfig(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &SystemconfigCaller{contract: contract}, nil -} - -// NewSystemconfigTransactor creates a new write-only instance of Systemconfig, bound to a specific deployed contract. -func NewSystemconfigTransactor(address common.Address, transactor bind.ContractTransactor) (*SystemconfigTransactor, error) { - contract, err := bindSystemconfig(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &SystemconfigTransactor{contract: contract}, nil -} - -// NewSystemconfigFilterer creates a new log filterer instance of Systemconfig, bound to a specific deployed contract. -func NewSystemconfigFilterer(address common.Address, filterer bind.ContractFilterer) (*SystemconfigFilterer, error) { - contract, err := bindSystemconfig(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &SystemconfigFilterer{contract: contract}, nil -} - -// bindSystemconfig binds a generic wrapper to an already deployed contract. -func bindSystemconfig(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(SystemconfigABI)) - 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 (_Systemconfig *SystemconfigRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _Systemconfig.Contract.SystemconfigCaller.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 (_Systemconfig *SystemconfigRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Systemconfig.Contract.SystemconfigTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Systemconfig *SystemconfigRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Systemconfig.Contract.SystemconfigTransactor.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 (_Systemconfig *SystemconfigCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _Systemconfig.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 (_Systemconfig *SystemconfigTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Systemconfig.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Systemconfig *SystemconfigTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Systemconfig.Contract.contract.Transact(opts, method, params...) -} - -// AddDependency is a paid mutator transaction binding the contract method 0xa89c793c. -// -// Solidity: function addDependency(uint256 _chainId) returns() -func (_Systemconfig *SystemconfigTransactor) AddDependency(opts *bind.TransactOpts, _chainId *big.Int) (*types.Transaction, error) { - return _Systemconfig.contract.Transact(opts, "addDependency", _chainId) -} - -// AddDependency is a paid mutator transaction binding the contract method 0xa89c793c. -// -// Solidity: function addDependency(uint256 _chainId) returns() -func (_Systemconfig *SystemconfigSession) AddDependency(_chainId *big.Int) (*types.Transaction, error) { - return _Systemconfig.Contract.AddDependency(&_Systemconfig.TransactOpts, _chainId) -} - -// AddDependency is a paid mutator transaction binding the contract method 0xa89c793c. -// -// Solidity: function addDependency(uint256 _chainId) returns() -func (_Systemconfig *SystemconfigTransactorSession) AddDependency(_chainId *big.Int) (*types.Transaction, error) { - return _Systemconfig.Contract.AddDependency(&_Systemconfig.TransactOpts, _chainId) -} diff --git a/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.abi b/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.abi index b724169ec6fa4..e007a8ed48afc 100644 --- a/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.abi +++ b/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.abi @@ -1,7 +1,7 @@ [ { "type": "function", - "name": "executeMessage", + "name": "validateMessage", "inputs": [ { "name": "_id", @@ -36,26 +36,41 @@ ] }, { - "name": "_target", - "type": "address", - "internalType": "address" - }, - { - "name": "_message", - "type": "bytes", - "internalType": "bytes" + "name": "_msgHash", + "type": "bytes32", + "internalType": "bytes32" } ], "outputs": [], - "stateMutability": "payable" + "stateMutability": "nonpayable" }, { "type": "function", - "name": "validateMessage", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "ExecutingMessage", "inputs": [ { - "name": "_id", + "name": "msgHash", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "id", "type": "tuple", + "indexed": false, "internalType": "struct Identifier", "components": [ { @@ -84,14 +99,33 @@ "internalType": "uint256" } ] - }, - { - "name": "_msgHash", - "type": "bytes32", - "internalType": "bytes32" } ], - "outputs": [], - "stateMutability": "nonpayable" + "anonymous": false + }, + { + "type": "error", + "name": "BlockNumberTooHigh", + "inputs": [] + }, + { + "type": "error", + "name": "LogIndexTooHigh", + "inputs": [] + }, + { + "type": "error", + "name": "NoExecutingDeposits", + "inputs": [] + }, + { + "type": "error", + "name": "NotInAccessList", + "inputs": [] + }, + { + "type": "error", + "name": "TimestampTooHigh", + "inputs": [] } ] diff --git a/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.json b/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.json index 96c8d6ddb036c..00d0c90cbda26 100644 --- a/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.json +++ b/op-e2e/e2eutils/interop/contracts/build/ICrossL2Inbox.sol/ICrossL2Inbox.json @@ -1 +1 @@ -{"abi":[{"type":"function","name":"executeMessage","inputs":[{"name":"_id","type":"tuple","internalType":"struct Identifier","components":[{"name":"origin","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"logIndex","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"chainId","type":"uint256","internalType":"uint256"}]},{"name":"_target","type":"address","internalType":"address"},{"name":"_message","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"validateMessage","inputs":[{"name":"_id","type":"tuple","internalType":"struct Identifier","components":[{"name":"origin","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"logIndex","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"chainId","type":"uint256","internalType":"uint256"}]},{"name":"_msgHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"executeMessage((address,uint256,uint256,uint256,uint256),address,bytes)":"5984c53e","validateMessage((address,uint256,uint256,uint256,uint256),bytes32)":"ab4d6f75"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"origin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"internalType\":\"struct Identifier\",\"name\":\"_id\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"executeMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"origin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"internalType\":\"struct Identifier\",\"name\":\"_id\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_msgHash\",\"type\":\"bytes32\"}],\"name\":\"validateMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"executeMessage((address,uint256,uint256,uint256,uint256),address,bytes)\":{\"params\":{\"_id\":\"An Identifier pointing to the initiating message.\",\"_message\":\"The message payload, matching the initiating message.\",\"_target\":\"Account that is called with _msg.\"}},\"validateMessage((address,uint256,uint256,uint256,uint256),bytes32)\":{\"params\":{\"_id\":\"Identifier of the message.\",\"_msgHash\":\"Hash of the message payload to call target with.\"}}},\"title\":\"ICrossL2Inbox\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"executeMessage((address,uint256,uint256,uint256,uint256),address,bytes)\":{\"notice\":\"Executes a cross chain message on the destination chain.\"},\"validateMessage((address,uint256,uint256,uint256,uint256),bytes32)\":{\"notice\":\"Validates a cross chain message on the destination chain and emits an ExecutingMessage event. This function is useful for applications that understand the schema of the _message payload and want to process it in a custom way.\"}},\"notice\":\"Interface for the CrossL2Inbox contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ICrossL2Inbox.sol\":\"ICrossL2Inbox\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/ICrossL2Inbox.sol\":{\"keccak256\":\"0x97daf76e4a10b96d8062e71df352cbfa7577593fa96676fd43b40f4a0aca9b7f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://74518c974318070da4e118cd28aa86d7f0702ed8cccc39d60906b93197687248\",\"dweb:/ipfs/QmWimBXYsDWDtNgzhjaLUx4xEiTMvbx5635E2TfNBKoV1E\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"struct Identifier","name":"_id","type":"tuple","components":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"}]},{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"}],"stateMutability":"payable","type":"function","name":"executeMessage"},{"inputs":[{"internalType":"struct Identifier","name":"_id","type":"tuple","components":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"}]},{"internalType":"bytes32","name":"_msgHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"validateMessage"}],"devdoc":{"kind":"dev","methods":{"executeMessage((address,uint256,uint256,uint256,uint256),address,bytes)":{"params":{"_id":"An Identifier pointing to the initiating message.","_message":"The message payload, matching the initiating message.","_target":"Account that is called with _msg."}},"validateMessage((address,uint256,uint256,uint256,uint256),bytes32)":{"params":{"_id":"Identifier of the message.","_msgHash":"Hash of the message payload to call target with."}}},"version":1},"userdoc":{"kind":"user","methods":{"executeMessage((address,uint256,uint256,uint256,uint256),address,bytes)":{"notice":"Executes a cross chain message on the destination chain."},"validateMessage((address,uint256,uint256,uint256,uint256),bytes32)":{"notice":"Validates a cross chain message on the destination chain and emits an ExecutingMessage event. This function is useful for applications that understand the schema of the _message payload and want to process it in a custom way."}},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/ICrossL2Inbox.sol":"ICrossL2Inbox"},"evmVersion":"cancun","libraries":{}},"sources":{"src/ICrossL2Inbox.sol":{"keccak256":"0x97daf76e4a10b96d8062e71df352cbfa7577593fa96676fd43b40f4a0aca9b7f","urls":["bzz-raw://74518c974318070da4e118cd28aa86d7f0702ed8cccc39d60906b93197687248","dweb:/ipfs/QmWimBXYsDWDtNgzhjaLUx4xEiTMvbx5635E2TfNBKoV1E"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user","methods":{"executeMessage((address,uint256,uint256,uint256,uint256),address,bytes)":{"notice":"Executes a cross chain message on the destination chain."},"validateMessage((address,uint256,uint256,uint256,uint256),bytes32)":{"notice":"Validates a cross chain message on the destination chain and emits an ExecutingMessage event. This function is useful for applications that understand the schema of the _message payload and want to process it in a custom way."}},"notice":"Interface for the CrossL2Inbox contract."},"devdoc":{"version":1,"kind":"dev","methods":{"executeMessage((address,uint256,uint256,uint256,uint256),address,bytes)":{"params":{"_id":"An Identifier pointing to the initiating message.","_message":"The message payload, matching the initiating message.","_target":"Account that is called with _msg."}},"validateMessage((address,uint256,uint256,uint256,uint256),bytes32)":{"params":{"_id":"Identifier of the message.","_msgHash":"Hash of the message payload to call target with."}}},"title":"ICrossL2Inbox"},"ast":{"absolutePath":"src/ICrossL2Inbox.sol","id":35,"exportedSymbols":{"ICrossL2Inbox":[34],"Identifier":[12]},"nodeType":"SourceUnit","src":"32:1153:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","^","0.8",".0"]},{"id":12,"nodeType":"StructDefinition","src":"57:132:0","nodes":[],"canonicalName":"Identifier","members":[{"constant":false,"id":3,"mutability":"mutable","name":"origin","nameLocation":"89:6:0","nodeType":"VariableDeclaration","scope":12,"src":"81:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":2,"name":"address","nodeType":"ElementaryTypeName","src":"81:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":5,"mutability":"mutable","name":"blockNumber","nameLocation":"109:11:0","nodeType":"VariableDeclaration","scope":12,"src":"101:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":4,"name":"uint256","nodeType":"ElementaryTypeName","src":"101:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":7,"mutability":"mutable","name":"logIndex","nameLocation":"134:8:0","nodeType":"VariableDeclaration","scope":12,"src":"126:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":6,"name":"uint256","nodeType":"ElementaryTypeName","src":"126:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":9,"mutability":"mutable","name":"timestamp","nameLocation":"156:9:0","nodeType":"VariableDeclaration","scope":12,"src":"148:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":8,"name":"uint256","nodeType":"ElementaryTypeName","src":"148:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":11,"mutability":"mutable","name":"chainId","nameLocation":"179:7:0","nodeType":"VariableDeclaration","scope":12,"src":"171:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":10,"name":"uint256","nodeType":"ElementaryTypeName","src":"171:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"Identifier","nameLocation":"64:10:0","scope":35,"visibility":"public"},{"id":34,"nodeType":"ContractDefinition","src":"269:915:0","nodes":[{"id":24,"nodeType":"FunctionDefinition","src":"577:108:0","nodes":[],"documentation":{"id":14,"nodeType":"StructuredDocumentation","src":"300:272:0","text":"@notice Executes a cross chain message on the destination chain.\n @param _id An Identifier pointing to the initiating message.\n @param _target Account that is called with _msg.\n @param _message The message payload, matching the initiating message."},"functionSelector":"5984c53e","implemented":false,"kind":"function","modifiers":[],"name":"executeMessage","nameLocation":"586:14:0","parameters":{"id":22,"nodeType":"ParameterList","parameters":[{"constant":false,"id":17,"mutability":"mutable","name":"_id","nameLocation":"621:3:0","nodeType":"VariableDeclaration","scope":24,"src":"601:23:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$12_calldata_ptr","typeString":"struct Identifier"},"typeName":{"id":16,"nodeType":"UserDefinedTypeName","pathNode":{"id":15,"name":"Identifier","nameLocations":["601:10:0"],"nodeType":"IdentifierPath","referencedDeclaration":12,"src":"601:10:0"},"referencedDeclaration":12,"src":"601:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$12_storage_ptr","typeString":"struct Identifier"}},"visibility":"internal"},{"constant":false,"id":19,"mutability":"mutable","name":"_target","nameLocation":"634:7:0","nodeType":"VariableDeclaration","scope":24,"src":"626:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":18,"name":"address","nodeType":"ElementaryTypeName","src":"626:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":21,"mutability":"mutable","name":"_message","nameLocation":"658:8:0","nodeType":"VariableDeclaration","scope":24,"src":"643:23:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":20,"name":"bytes","nodeType":"ElementaryTypeName","src":"643:5:0","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"600:67:0"},"returnParameters":{"id":23,"nodeType":"ParameterList","parameters":[],"src":"684:0:0"},"scope":34,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":33,"nodeType":"FunctionDefinition","src":"1105:77:0","nodes":[],"documentation":{"id":25,"nodeType":"StructuredDocumentation","src":"691:409:0","text":"@notice Validates a cross chain message on the destination chain\n and emits an ExecutingMessage event. This function is useful\n for applications that understand the schema of the _message payload and want to\n process it in a custom way.\n @param _id Identifier of the message.\n @param _msgHash Hash of the message payload to call target with."},"functionSelector":"ab4d6f75","implemented":false,"kind":"function","modifiers":[],"name":"validateMessage","nameLocation":"1114:15:0","parameters":{"id":31,"nodeType":"ParameterList","parameters":[{"constant":false,"id":28,"mutability":"mutable","name":"_id","nameLocation":"1150:3:0","nodeType":"VariableDeclaration","scope":33,"src":"1130:23:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$12_calldata_ptr","typeString":"struct Identifier"},"typeName":{"id":27,"nodeType":"UserDefinedTypeName","pathNode":{"id":26,"name":"Identifier","nameLocations":["1130:10:0"],"nodeType":"IdentifierPath","referencedDeclaration":12,"src":"1130:10:0"},"referencedDeclaration":12,"src":"1130:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$12_storage_ptr","typeString":"struct Identifier"}},"visibility":"internal"},{"constant":false,"id":30,"mutability":"mutable","name":"_msgHash","nameLocation":"1163:8:0","nodeType":"VariableDeclaration","scope":33,"src":"1155:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":29,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1155:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"1129:43:0"},"returnParameters":{"id":32,"nodeType":"ParameterList","parameters":[],"src":"1181:0:0"},"scope":34,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"ICrossL2Inbox","contractDependencies":[],"contractKind":"interface","documentation":{"id":13,"nodeType":"StructuredDocumentation","src":"191:78:0","text":"@title ICrossL2Inbox\n @notice Interface for the CrossL2Inbox contract."},"fullyImplemented":false,"linearizedBaseContracts":[34],"name":"ICrossL2Inbox","nameLocation":"279:13:0","scope":35,"usedErrors":[],"usedEvents":[]}],"license":"MIT"},"id":0} \ No newline at end of file +{"abi":[{"type":"function","name":"validateMessage","inputs":[{"name":"_id","type":"tuple","internalType":"struct Identifier","components":[{"name":"origin","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"logIndex","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"chainId","type":"uint256","internalType":"uint256"}]},{"name":"_msgHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"event","name":"ExecutingMessage","inputs":[{"name":"msgHash","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"id","type":"tuple","indexed":false,"internalType":"struct Identifier","components":[{"name":"origin","type":"address","internalType":"address"},{"name":"blockNumber","type":"uint256","internalType":"uint256"},{"name":"logIndex","type":"uint256","internalType":"uint256"},{"name":"timestamp","type":"uint256","internalType":"uint256"},{"name":"chainId","type":"uint256","internalType":"uint256"}]}],"anonymous":false},{"type":"error","name":"BlockNumberTooHigh","inputs":[]},{"type":"error","name":"LogIndexTooHigh","inputs":[]},{"type":"error","name":"NoExecutingDeposits","inputs":[]},{"type":"error","name":"NotInAccessList","inputs":[]},{"type":"error","name":"TimestampTooHigh","inputs":[]}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"validateMessage((address,uint256,uint256,uint256,uint256),bytes32)":"ab4d6f75","version()":"54fd4d50"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"BlockNumberTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LogIndexTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoExecutingDeposits\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInAccessList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimestampTooHigh\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"origin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"struct Identifier\",\"name\":\"id\",\"type\":\"tuple\"}],\"name\":\"ExecutingMessage\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"origin\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"}],\"internalType\":\"struct Identifier\",\"name\":\"_id\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_msgHash\",\"type\":\"bytes32\"}],\"name\":\"validateMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ICrossL2Inbox.sol\":\"ICrossL2Inbox\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/ICrossL2Inbox.sol\":{\"keccak256\":\"0x9d31923d67c620293adcc180d6f6219f196dcca4d81425b932113537801749de\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://10456b2586608b6336f58ba78fa481c70ca0da48a459b9be42b2b52da738adfe\",\"dweb:/ipfs/QmVNkgm9YFv2HCYNEipCUbP3jdkC3Ma1XWLvWKVnb3xi8t\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"BlockNumberTooHigh"},{"inputs":[],"type":"error","name":"LogIndexTooHigh"},{"inputs":[],"type":"error","name":"NoExecutingDeposits"},{"inputs":[],"type":"error","name":"NotInAccessList"},{"inputs":[],"type":"error","name":"TimestampTooHigh"},{"inputs":[{"internalType":"bytes32","name":"msgHash","type":"bytes32","indexed":true},{"internalType":"struct Identifier","name":"id","type":"tuple","components":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"indexed":false}],"type":"event","name":"ExecutingMessage","anonymous":false},{"inputs":[{"internalType":"struct Identifier","name":"_id","type":"tuple","components":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"chainId","type":"uint256"}]},{"internalType":"bytes32","name":"_msgHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"validateMessage"},{"inputs":[],"stateMutability":"view","type":"function","name":"version","outputs":[{"internalType":"string","name":"","type":"string"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/ICrossL2Inbox.sol":"ICrossL2Inbox"},"evmVersion":"cancun","libraries":{}},"sources":{"src/ICrossL2Inbox.sol":{"keccak256":"0x9d31923d67c620293adcc180d6f6219f196dcca4d81425b932113537801749de","urls":["bzz-raw://10456b2586608b6336f58ba78fa481c70ca0da48a459b9be42b2b52da738adfe","dweb:/ipfs/QmVNkgm9YFv2HCYNEipCUbP3jdkC3Ma1XWLvWKVnb3xi8t"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"src/ICrossL2Inbox.sol","id":45,"exportedSymbols":{"ICrossL2Inbox":[44],"Identifier":[13]},"nodeType":"SourceUnit","src":"32:604:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","^","0.8",".0"]},{"id":13,"nodeType":"StructDefinition","src":"106:132:0","nodes":[],"canonicalName":"Identifier","documentation":{"id":2,"nodeType":"StructuredDocumentation","src":"57:49:0","text":"@notice Identifier of a cross chain message."},"members":[{"constant":false,"id":4,"mutability":"mutable","name":"origin","nameLocation":"138:6:0","nodeType":"VariableDeclaration","scope":13,"src":"130:14:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":3,"name":"address","nodeType":"ElementaryTypeName","src":"130:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":6,"mutability":"mutable","name":"blockNumber","nameLocation":"158:11:0","nodeType":"VariableDeclaration","scope":13,"src":"150:19:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":5,"name":"uint256","nodeType":"ElementaryTypeName","src":"150:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":8,"mutability":"mutable","name":"logIndex","nameLocation":"183:8:0","nodeType":"VariableDeclaration","scope":13,"src":"175:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":7,"name":"uint256","nodeType":"ElementaryTypeName","src":"175:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":10,"mutability":"mutable","name":"timestamp","nameLocation":"205:9:0","nodeType":"VariableDeclaration","scope":13,"src":"197:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":9,"name":"uint256","nodeType":"ElementaryTypeName","src":"197:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":12,"mutability":"mutable","name":"chainId","nameLocation":"228:7:0","nodeType":"VariableDeclaration","scope":13,"src":"220:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":11,"name":"uint256","nodeType":"ElementaryTypeName","src":"220:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"Identifier","nameLocation":"113:10:0","scope":45,"visibility":"public"},{"id":44,"nodeType":"ContractDefinition","src":"240:395:0","nodes":[{"id":15,"nodeType":"ErrorDefinition","src":"270:28:0","nodes":[],"errorSelector":"753f1072","name":"NoExecutingDeposits","nameLocation":"276:19:0","parameters":{"id":14,"nodeType":"ParameterList","parameters":[],"src":"295:2:0"}},{"id":17,"nodeType":"ErrorDefinition","src":"303:24:0","nodes":[],"errorSelector":"e3c00816","name":"NotInAccessList","nameLocation":"309:15:0","parameters":{"id":16,"nodeType":"ParameterList","parameters":[],"src":"324:2:0"}},{"id":19,"nodeType":"ErrorDefinition","src":"332:27:0","nodes":[],"errorSelector":"d1f79e82","name":"BlockNumberTooHigh","nameLocation":"338:18:0","parameters":{"id":18,"nodeType":"ParameterList","parameters":[],"src":"356:2:0"}},{"id":21,"nodeType":"ErrorDefinition","src":"364:25:0","nodes":[],"errorSelector":"596a19a9","name":"TimestampTooHigh","nameLocation":"370:16:0","parameters":{"id":20,"nodeType":"ParameterList","parameters":[],"src":"386:2:0"}},{"id":23,"nodeType":"ErrorDefinition","src":"394:24:0","nodes":[],"errorSelector":"94338eba","name":"LogIndexTooHigh","nameLocation":"400:15:0","parameters":{"id":22,"nodeType":"ParameterList","parameters":[],"src":"415:2:0"}},{"id":30,"nodeType":"EventDefinition","src":"424:63:0","nodes":[],"anonymous":false,"eventSelector":"5c37832d2e8d10e346e55ad62071a6a2f9fa5130614ef2ec6617555c6f467ba7","name":"ExecutingMessage","nameLocation":"430:16:0","parameters":{"id":29,"nodeType":"ParameterList","parameters":[{"constant":false,"id":25,"indexed":true,"mutability":"mutable","name":"msgHash","nameLocation":"463:7:0","nodeType":"VariableDeclaration","scope":30,"src":"447:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":24,"name":"bytes32","nodeType":"ElementaryTypeName","src":"447:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":28,"indexed":false,"mutability":"mutable","name":"id","nameLocation":"483:2:0","nodeType":"VariableDeclaration","scope":30,"src":"472:13:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$13_memory_ptr","typeString":"struct Identifier"},"typeName":{"id":27,"nodeType":"UserDefinedTypeName","pathNode":{"id":26,"name":"Identifier","nameLocations":["472:10:0"],"nodeType":"IdentifierPath","referencedDeclaration":13,"src":"472:10:0"},"referencedDeclaration":13,"src":"472:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$13_storage_ptr","typeString":"struct Identifier"}},"visibility":"internal"}],"src":"446:40:0"}},{"id":35,"nodeType":"FunctionDefinition","src":"493:57:0","nodes":[],"functionSelector":"54fd4d50","implemented":false,"kind":"function","modifiers":[],"name":"version","nameLocation":"502:7:0","parameters":{"id":31,"nodeType":"ParameterList","parameters":[],"src":"509:2:0"},"returnParameters":{"id":34,"nodeType":"ParameterList","parameters":[{"constant":false,"id":33,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":35,"src":"535:13:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_string_memory_ptr","typeString":"string"},"typeName":{"id":32,"name":"string","nodeType":"ElementaryTypeName","src":"535:6:0","typeDescriptions":{"typeIdentifier":"t_string_storage_ptr","typeString":"string"}},"visibility":"internal"}],"src":"534:15:0"},"scope":44,"stateMutability":"view","virtual":false,"visibility":"external"},{"id":43,"nodeType":"FunctionDefinition","src":"556:77:0","nodes":[],"functionSelector":"ab4d6f75","implemented":false,"kind":"function","modifiers":[],"name":"validateMessage","nameLocation":"565:15:0","parameters":{"id":41,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38,"mutability":"mutable","name":"_id","nameLocation":"601:3:0","nodeType":"VariableDeclaration","scope":43,"src":"581:23:0","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$13_calldata_ptr","typeString":"struct Identifier"},"typeName":{"id":37,"nodeType":"UserDefinedTypeName","pathNode":{"id":36,"name":"Identifier","nameLocations":["581:10:0"],"nodeType":"IdentifierPath","referencedDeclaration":13,"src":"581:10:0"},"referencedDeclaration":13,"src":"581:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_Identifier_$13_storage_ptr","typeString":"struct Identifier"}},"visibility":"internal"},{"constant":false,"id":40,"mutability":"mutable","name":"_msgHash","nameLocation":"614:8:0","nodeType":"VariableDeclaration","scope":43,"src":"606:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":39,"name":"bytes32","nodeType":"ElementaryTypeName","src":"606:7:0","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"580:43:0"},"returnParameters":{"id":42,"nodeType":"ParameterList","parameters":[],"src":"632:0:0"},"scope":44,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"ICrossL2Inbox","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"linearizedBaseContracts":[44],"name":"ICrossL2Inbox","nameLocation":"250:13:0","scope":45,"usedErrors":[15,17,19,21,23],"usedEvents":[30]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.abi b/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.abi deleted file mode 100644 index 7a7bffc2ca656..0000000000000 --- a/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.abi +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "type": "function", - "name": "addDependency", - "inputs": [ - { - "name": "_chainId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - } -] diff --git a/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.bin b/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.bin deleted file mode 100644 index ec687260b8517..0000000000000 --- a/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.bin +++ /dev/null @@ -1 +0,0 @@ -0x diff --git a/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.json b/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.json deleted file mode 100644 index fef67d0a40fd0..0000000000000 --- a/op-e2e/e2eutils/interop/contracts/build/ISystemConfig.sol/ISystemConfig.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"type":"function","name":"addDependency","inputs":[{"name":"_chainId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"addDependency(uint256)":"a89c793c"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"}],\"name\":\"addDependency\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addDependency(uint256)\":{\"params\":{\"_chainId\":\"Chain ID of chain to add.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addDependency(uint256)\":{\"notice\":\"Adds a chain to the interop dependency set. Can only be called by the dependency manager.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ISystemConfig.sol\":\"ISystemConfig\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/ISystemConfig.sol\":{\"keccak256\":\"0x764ea7e528e9e5ab907515b4da22738a49a3d5d8ffb948def86d0cbb9e7765be\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9307f5fd1e826f8d059f4aa9141c360aef54612ba8562ec996e7f078ef1d1cf2\",\"dweb:/ipfs/QmbzFSWWLoQUyeuD6U7detgjPy36L3DHJp9BPpaUZqVs68\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"addDependency"}],"devdoc":{"kind":"dev","methods":{"addDependency(uint256)":{"params":{"_chainId":"Chain ID of chain to add."}}},"version":1},"userdoc":{"kind":"user","methods":{"addDependency(uint256)":{"notice":"Adds a chain to the interop dependency set. Can only be called by the dependency manager."}},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/ISystemConfig.sol":"ISystemConfig"},"evmVersion":"cancun","libraries":{}},"sources":{"src/ISystemConfig.sol":{"keccak256":"0x764ea7e528e9e5ab907515b4da22738a49a3d5d8ffb948def86d0cbb9e7765be","urls":["bzz-raw://9307f5fd1e826f8d059f4aa9141c360aef54612ba8562ec996e7f078ef1d1cf2","dweb:/ipfs/QmbzFSWWLoQUyeuD6U7detgjPy36L3DHJp9BPpaUZqVs68"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user","methods":{"addDependency(uint256)":{"notice":"Adds a chain to the interop dependency set. Can only be called by the dependency manager."}}},"devdoc":{"version":1,"kind":"dev","methods":{"addDependency(uint256)":{"params":{"_chainId":"Chain ID of chain to add."}}}},"ast":{"absolutePath":"src/ISystemConfig.sol","id":9,"exportedSymbols":{"ISystemConfig":[8]},"nodeType":"SourceUnit","src":"32:264:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"32:23:0","nodes":[],"literals":["solidity","^","0.8",".0"]},{"id":8,"nodeType":"ContractDefinition","src":"57:238:0","nodes":[{"id":7,"nodeType":"FunctionDefinition","src":"243:50:0","nodes":[],"documentation":{"id":2,"nodeType":"StructuredDocumentation","src":"87:151:0","text":"@notice Adds a chain to the interop dependency set. Can only be called by the dependency manager.\n @param _chainId Chain ID of chain to add."},"functionSelector":"a89c793c","implemented":false,"kind":"function","modifiers":[],"name":"addDependency","nameLocation":"252:13:0","parameters":{"id":5,"nodeType":"ParameterList","parameters":[{"constant":false,"id":4,"mutability":"mutable","name":"_chainId","nameLocation":"274:8:0","nodeType":"VariableDeclaration","scope":7,"src":"266:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":3,"name":"uint256","nodeType":"ElementaryTypeName","src":"266:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"265:18:0"},"returnParameters":{"id":6,"nodeType":"ParameterList","parameters":[],"src":"292:0:0"},"scope":8,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"ISystemConfig","contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"linearizedBaseContracts":[8],"name":"ISystemConfig","nameLocation":"67:13:0","scope":9,"usedErrors":[],"usedEvents":[]}],"license":"MIT"},"id":0} \ No newline at end of file diff --git a/op-e2e/e2eutils/interop/contracts/build/emit.sol/EmitEvent.json b/op-e2e/e2eutils/interop/contracts/build/emit.sol/EmitEvent.json index 465823afa3309..2c4e3a26dab8b 100644 --- a/op-e2e/e2eutils/interop/contracts/build/emit.sol/EmitEvent.json +++ b/op-e2e/e2eutils/interop/contracts/build/emit.sol/EmitEvent.json @@ -1 +1 @@ -{"abi":[{"type":"function","name":"emitData","inputs":[{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DataEmitted","inputs":[{"name":"_data","type":"bytes","indexed":true,"internalType":"bytes"}],"anonymous":false}],"bytecode":{"object":"0x6080604052348015600e575f80fd5b5060ff8061001b5f395ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a","sourceMap":"58:278:1:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a","sourceMap":"58:278:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;245:89;;;;;;:::i;:::-;;:::i;:::-;;;321:5;;309:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;245:89;;:::o;14:591:2:-;84:6;92;145:2;133:9;124:7;120:23;116:32;113:52;;;161:1;158;151:12;113:52;201:9;188:23;230:18;271:2;263:6;260:14;257:34;;;287:1;284;277:12;257:34;325:6;314:9;310:22;300:32;;370:7;363:4;359:2;355:13;351:27;341:55;;392:1;389;382:12;341:55;432:2;419:16;458:2;450:6;447:14;444:34;;;474:1;471;464:12;444:34;519:7;514:2;505:6;501:2;497:15;493:24;490:37;487:57;;;540:1;537;530:12;487:57;571:2;563:11;;;;;593:6;;-1:-1:-1;14:591:2;;-1:-1:-1;;;;14:591:2:o;610:271::-;793:6;785;780:3;767:33;749:3;819:16;;844:13;;;819:16;610:271;-1:-1:-1;610:271:2:o","linkReferences":{}},"methodIdentifiers":{"emitData(bytes)":"d836083e"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"DataEmitted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"emitData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/emit.sol\":\"EmitEvent\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/emit.sol\":{\"keccak256\":\"0xe078378fd445ed0cbbf1087c5013110412ab6a44850af24a15bcde945467accc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66c218de0059688c75903c2ba6d4066661dc6f5fa17a329dd7c385d151f3993a\",\"dweb:/ipfs/Qmby4S4N44naZ2miw3Tgdpq5Qbj4DwzJbcGapgqtd7qd26\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes","indexed":true}],"type":"event","name":"DataEmitted","anonymous":false},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"emitData"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/emit.sol":"EmitEvent"},"evmVersion":"cancun","libraries":{}},"sources":{"src/emit.sol":{"keccak256":"0xe078378fd445ed0cbbf1087c5013110412ab6a44850af24a15bcde945467accc","urls":["bzz-raw://66c218de0059688c75903c2ba6d4066661dc6f5fa17a329dd7c385d151f3993a","dweb:/ipfs/Qmby4S4N44naZ2miw3Tgdpq5Qbj4DwzJbcGapgqtd7qd26"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"src/emit.sol","id":52,"exportedSymbols":{"EmitEvent":[51]},"nodeType":"SourceUnit","src":"32:305:1","nodes":[{"id":36,"nodeType":"PragmaDirective","src":"32:24:1","nodes":[],"literals":["solidity","^","0.8",".15"]},{"id":51,"nodeType":"ContractDefinition","src":"58:278:1","nodes":[{"id":40,"nodeType":"EventDefinition","src":"133:39:1","nodes":[],"anonymous":false,"eventSelector":"e00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c","name":"DataEmitted","nameLocation":"139:11:1","parameters":{"id":39,"nodeType":"ParameterList","parameters":[{"constant":false,"id":38,"indexed":true,"mutability":"mutable","name":"_data","nameLocation":"165:5:1","nodeType":"VariableDeclaration","scope":40,"src":"151:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":37,"name":"bytes","nodeType":"ElementaryTypeName","src":"151:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"150:21:1"}},{"id":50,"nodeType":"FunctionDefinition","src":"245:89:1","nodes":[],"body":{"id":49,"nodeType":"Block","src":"294:40:1","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":46,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":42,"src":"321:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":45,"name":"DataEmitted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":40,"src":"309:11:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":47,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"309:18:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":48,"nodeType":"EmitStatement","src":"304:23:1"}]},"functionSelector":"d836083e","implemented":true,"kind":"function","modifiers":[],"name":"emitData","nameLocation":"254:8:1","parameters":{"id":43,"nodeType":"ParameterList","parameters":[{"constant":false,"id":42,"mutability":"mutable","name":"_data","nameLocation":"278:5:1","nodeType":"VariableDeclaration","scope":50,"src":"263:20:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":41,"name":"bytes","nodeType":"ElementaryTypeName","src":"263:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"262:22:1"},"returnParameters":{"id":44,"nodeType":"ParameterList","parameters":[],"src":"294:0:1"},"scope":51,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"EmitEvent","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[51],"name":"EmitEvent","nameLocation":"67:9:1","scope":52,"usedErrors":[],"usedEvents":[40]}],"license":"MIT"},"id":1} \ No newline at end of file +{"abi":[{"type":"function","name":"emitData","inputs":[{"name":"_data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DataEmitted","inputs":[{"name":"_data","type":"bytes","indexed":true,"internalType":"bytes"}],"anonymous":false}],"bytecode":{"object":"0x6080604052348015600e575f80fd5b5060ff8061001b5f395ff3fe6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a","sourceMap":"58:278:1:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052348015600e575f80fd5b50600436106026575f3560e01c8063d836083e14602a575b5f80fd5b60396035366004607c565b603b565b005b8181604051604992919060e3565b604051908190038120907fe00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c905f90a25050565b5f8060208385031215608c575f80fd5b823567ffffffffffffffff8082111560a2575f80fd5b818501915085601f83011260b4575f80fd5b81358181111560c1575f80fd5b86602082850101111560d1575f80fd5b60209290920196919550909350505050565b818382375f910190815291905056fea164736f6c6343000819000a","sourceMap":"58:278:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;245:89;;;;;;:::i;:::-;;:::i;:::-;;;321:5;;309:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;245:89;;:::o;14:591:2:-;84:6;92;145:2;133:9;124:7;120:23;116:32;113:52;;;161:1;158;151:12;113:52;201:9;188:23;230:18;271:2;263:6;260:14;257:34;;;287:1;284;277:12;257:34;325:6;314:9;310:22;300:32;;370:7;363:4;359:2;355:13;351:27;341:55;;392:1;389;382:12;341:55;432:2;419:16;458:2;450:6;447:14;444:34;;;474:1;471;464:12;444:34;519:7;514:2;505:6;501:2;497:15;493:24;490:37;487:57;;;540:1;537;530:12;487:57;571:2;563:11;;;;;593:6;;-1:-1:-1;14:591:2;;-1:-1:-1;;;;14:591:2:o;610:271::-;793:6;785;780:3;767:33;749:3;819:16;;844:13;;;819:16;610:271;-1:-1:-1;610:271:2:o","linkReferences":{}},"methodIdentifiers":{"emitData(bytes)":"d836083e"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"DataEmitted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"emitData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/emit.sol\":\"EmitEvent\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"src/emit.sol\":{\"keccak256\":\"0xe078378fd445ed0cbbf1087c5013110412ab6a44850af24a15bcde945467accc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://66c218de0059688c75903c2ba6d4066661dc6f5fa17a329dd7c385d151f3993a\",\"dweb:/ipfs/Qmby4S4N44naZ2miw3Tgdpq5Qbj4DwzJbcGapgqtd7qd26\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes","indexed":true}],"type":"event","name":"DataEmitted","anonymous":false},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"emitData"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":[],"optimizer":{"enabled":true,"runs":999999},"metadata":{"bytecodeHash":"none"},"compilationTarget":{"src/emit.sol":"EmitEvent"},"evmVersion":"cancun","libraries":{}},"sources":{"src/emit.sol":{"keccak256":"0xe078378fd445ed0cbbf1087c5013110412ab6a44850af24a15bcde945467accc","urls":["bzz-raw://66c218de0059688c75903c2ba6d4066661dc6f5fa17a329dd7c385d151f3993a","dweb:/ipfs/Qmby4S4N44naZ2miw3Tgdpq5Qbj4DwzJbcGapgqtd7qd26"],"license":"MIT"}},"version":1},"storageLayout":{"storage":[],"types":{}},"userdoc":{"version":1,"kind":"user"},"devdoc":{"version":1,"kind":"dev"},"ast":{"absolutePath":"src/emit.sol","id":62,"exportedSymbols":{"EmitEvent":[61]},"nodeType":"SourceUnit","src":"32:305:1","nodes":[{"id":46,"nodeType":"PragmaDirective","src":"32:24:1","nodes":[],"literals":["solidity","^","0.8",".15"]},{"id":61,"nodeType":"ContractDefinition","src":"58:278:1","nodes":[{"id":50,"nodeType":"EventDefinition","src":"133:39:1","nodes":[],"anonymous":false,"eventSelector":"e00bbfe6f6f8f1bbed2da38e3f5a139c6f9da594ab248a3cf8b44fc73627772c","name":"DataEmitted","nameLocation":"139:11:1","parameters":{"id":49,"nodeType":"ParameterList","parameters":[{"constant":false,"id":48,"indexed":true,"mutability":"mutable","name":"_data","nameLocation":"165:5:1","nodeType":"VariableDeclaration","scope":50,"src":"151:19:1","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":47,"name":"bytes","nodeType":"ElementaryTypeName","src":"151:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"150:21:1"}},{"id":60,"nodeType":"FunctionDefinition","src":"245:89:1","nodes":[],"body":{"id":59,"nodeType":"Block","src":"294:40:1","nodes":[],"statements":[{"eventCall":{"arguments":[{"id":56,"name":"_data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":52,"src":"321:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":55,"name":"DataEmitted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":50,"src":"309:11:1","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_bytes_memory_ptr_$returns$__$","typeString":"function (bytes memory)"}},"id":57,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"309:18:1","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":58,"nodeType":"EmitStatement","src":"304:23:1"}]},"functionSelector":"d836083e","implemented":true,"kind":"function","modifiers":[],"name":"emitData","nameLocation":"254:8:1","parameters":{"id":53,"nodeType":"ParameterList","parameters":[{"constant":false,"id":52,"mutability":"mutable","name":"_data","nameLocation":"278:5:1","nodeType":"VariableDeclaration","scope":60,"src":"263:20:1","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":51,"name":"bytes","nodeType":"ElementaryTypeName","src":"263:5:1","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"262:22:1"},"returnParameters":{"id":54,"nodeType":"ParameterList","parameters":[],"src":"294:0:1"},"scope":61,"stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"abstract":false,"baseContracts":[],"canonicalName":"EmitEvent","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[61],"name":"EmitEvent","nameLocation":"67:9:1","scope":62,"usedErrors":[],"usedEvents":[50]}],"license":"MIT"},"id":1} \ No newline at end of file diff --git a/op-e2e/e2eutils/interop/contracts/generate.sh b/op-e2e/e2eutils/interop/contracts/generate.sh index d6107df9cc867..124deb1913166 100755 --- a/op-e2e/e2eutils/interop/contracts/generate.sh +++ b/op-e2e/e2eutils/interop/contracts/generate.sh @@ -19,11 +19,3 @@ cd ../.. mkdir -p bindings/inbox abigen --abi ./build/ICrossL2Inbox.sol/ICrossL2Inbox.abi --bin ./build/ICrossL2Inbox.sol/ICrossL2Inbox.bin --pkg inbox --out ./bindings/inbox/inbox.go - -cd build/ISystemConfig.sol -cat ISystemConfig.json | jq -r '.bytecode.object' > ISystemConfig.bin -cat ISystemConfig.json | jq '.abi' > ISystemConfig.abi -cd ../.. - -mkdir -p bindings/systemconfig -abigen --abi ./build/ISystemConfig.sol/ISystemConfig.abi --bin ./build/ISystemConfig.sol/ISystemConfig.bin --pkg systemconfig --out ./bindings/systemconfig/systemconfig.go diff --git a/op-e2e/e2eutils/interop/contracts/src/ICrossL2Inbox.sol b/op-e2e/e2eutils/interop/contracts/src/ICrossL2Inbox.sol index 900b01b09e7cc..6fbd2bfedd61b 100644 --- a/op-e2e/e2eutils/interop/contracts/src/ICrossL2Inbox.sol +++ b/op-e2e/e2eutils/interop/contracts/src/ICrossL2Inbox.sol @@ -1,12 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -/// @notice The struct for a pointer to a message payload in a remote (or local) chain. -/// @custom:field origin The origin address of the message. -/// @custom:field blockNumber The block number of the message. -/// @custom:field logIndex The log index of the message. -/// @custom:field timestamp The timestamp of the message. -/// @custom:field chainId The origin chain ID of the message. +/// @notice Identifier of a cross chain message. struct Identifier { address origin; uint256 blockNumber; @@ -16,42 +11,15 @@ struct Identifier { } interface ICrossL2Inbox { - /// @notice Thrown when trying to execute a cross chain message on a deposit transaction. error NoExecutingDeposits(); - - /// @notice Thrown when trying to validate a cross chain message with an identifier checksum that is - /// invalid or was not provided in the transaction's access list to set the slot as warm. error NotInAccessList(); - - /// @notice Thrown when trying to validate a cross chain message with a block number that is - /// greater than 2^64. error BlockNumberTooHigh(); - - /// @notice Thrown when trying to validate a cross chain message with a timestamp that is - /// greater than 2^64. error TimestampTooHigh(); - - /// @notice Thrown when trying to validate a cross chain message with a log index that is - /// greater than 2^32. error LogIndexTooHigh(); - /// @notice Emitted when a message is being executed. event ExecutingMessage(bytes32 indexed msgHash, Identifier id); - /// @notice Returns the semantic version of the contract. - /// @return version_ The semantic version. - function version() external view returns (string memory version_); + function version() external view returns (string memory); - /// @notice Validates a message by checking that the identifier checksum slot is warm. - /// @dev To process the message, the tx must include the checksum composed by the message's - /// identifier and msgHash in the access list. - /// @param _id The identifier of the message. - /// @param _msgHash The hash of the message. function validateMessage(Identifier calldata _id, bytes32 _msgHash) external; - - /// @notice Calculates the checksum of an identifier and message hash. - /// @param _id The identifier of the message. - /// @param _msgHash The hash of the message. - /// @return checksum_ The checksum of the identifier and message hash. - function calculateChecksum(Identifier memory _id, bytes32 _msgHash) external pure returns (bytes32 checksum_); } diff --git a/op-e2e/e2eutils/interop/contracts/src/ISystemConfig.sol b/op-e2e/e2eutils/interop/contracts/src/ISystemConfig.sol deleted file mode 100644 index fd14f919b2d0d..0000000000000 --- a/op-e2e/e2eutils/interop/contracts/src/ISystemConfig.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface ISystemConfig { - /// @notice Adds a chain to the interop dependency set. Can only be called by the dependency manager. - /// @param _chainId Chain ID of chain to add. - function addDependency(uint256 _chainId) external; -} diff --git a/op-e2e/interop/interop_test.go b/op-e2e/interop/interop_test.go index 5a670fcedae03..ccff619e86543 100644 --- a/op-e2e/interop/interop_test.go +++ b/op-e2e/interop/interop_test.go @@ -139,7 +139,6 @@ func TestInterop_SupervisorFinality(t *testing.T) { // Chains A and B exist, but no messages are sent between them. // A contract is deployed on each chain, and logs are emitted repeatedly. func TestInterop_EmitLogs(t *testing.T) { - t.Skip("temporarily broken by access-list change") t.Parallel() test := func(t *testing.T, s2 SuperSystem) { ids := s2.L2IDs() @@ -253,15 +252,10 @@ func TestInterop_EmitLogs(t *testing.T) { } func TestInteropBlockBuilding(t *testing.T) { - t.Skip("access-list change breaks tx-pool / block-build checks") t.Parallel() logger := testlog.Logger(t, log.LevelInfo) oplog.SetGlobalLogHandler(logger.Handler()) - // TODO(14697): re-enable once op-geth block-building uses access-lists. - // When re-enabling, the txs that execute other messages will need access-lists. - t.Skip("blocked by issue #14697") - test := func(t *testing.T, s2 SuperSystem) { ids := s2.L2IDs() chainA := ids[0] @@ -314,6 +308,14 @@ func TestInteropBlockBuilding(t *testing.T) { t.Logf("invalid payload hash: %s", invalidPayloadHash) t.Logf("invalid log hash: %s", invalidLogHash) + // hack: geth ingress validates using head timestamp, but should be checking with head+blocktime timestamp, + // Until we fix that, we need an additional block to be built, otherwise we get hit by the aggressive ingress filter. + require.Eventually(t, func() bool { + status, err := rollupClA.SyncStatus(context.Background()) + require.NoError(t, err) + return status.CrossUnsafeL2.Time > identifier.Timestamp + }, time.Second*60, time.Second, "wait for emitted data to become cross-unsafe") + // submit executing txs on B t.Log("Testing invalid message") diff --git a/op-e2e/interop/supersystem.go b/op-e2e/interop/supersystem.go index 163829da5516b..840eb1c2b482f 100644 --- a/op-e2e/interop/supersystem.go +++ b/op-e2e/interop/supersystem.go @@ -34,7 +34,6 @@ import ( "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/emit" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/systemconfig" "github.com/ethereum-optimism/optimism/op-e2e/system/helpers" l2os "github.com/ethereum-optimism/optimism/op-proposer/proposer" "github.com/ethereum-optimism/optimism/op-service/client" @@ -421,18 +420,12 @@ func (s *interopE2ESystem) prepareL2s() map[string]l2Net { // prepareContracts prepares contract-bindings for the L2s func (s *interopE2ESystem) prepareContracts() { // Add bindings to common contracts for each L2 - l1GethClient := s.L1GethClient() - for id, l2Dep := range s.worldDeployment.L2s { + for id := range s.worldDeployment.L2s { { contract, err := inbox.NewInbox(predeploys.CrossL2InboxAddr, s.L2GethClient(id, "sequencer")) require.NoError(s.t, err) s.l2s[id].contracts["inbox"] = contract } - { - contract, err := systemconfig.NewSystemconfig(l2Dep.SystemConfigProxy, l1GethClient) - require.NoError(s.t, err) - s.l2s[id].contracts["systemconfig"] = contract - } } } @@ -512,13 +505,14 @@ func (s *interopE2ESystem) ValidateMessage( ) (*types.Receipt, error) { secret := s.UserKey(id, sender) auth, err := bind.NewKeyedTransactorWithChainID(&secret, s.l2s[id].chainID) + contract := s.Contract(id, "inbox").(*inbox.Inbox) require.NoError(s.t, err) auth.GasLimit = uint64(3000_000) - auth.GasPrice = big.NewInt(20_000_000_000) + auth.GasFeeCap = big.NewInt(21_000_000_000) + auth.GasTipCap = big.NewInt(1_000_000_000) - contract := s.Contract(id, "inbox").(*inbox.Inbox) identifier := inbox.Identifier{ Origin: msgIdentifier.Origin, BlockNumber: new(big.Int).SetUint64(msgIdentifier.BlockNumber), @@ -526,6 +520,14 @@ func (s *interopE2ESystem) ValidateMessage( Timestamp: new(big.Int).SetUint64(msgIdentifier.Timestamp), ChainId: msgIdentifier.ChainID.ToBig(), } + access := msgIdentifier.ChecksumArgs(msgHash).Access() + auth.AccessList = []types.AccessTuple{ + { + Address: predeploys.CrossL2InboxAddr, + StorageKeys: supervisortypes.EncodeAccessList([]supervisortypes.Access{access}), + }, + } + tx, err := contract.InboxTransactor.ValidateMessage(auth, identifier, msgHash) if expectedError != nil { require.ErrorContains(s.t, err, expectedError.Error()) diff --git a/op-supervisor/supervisor/types/types.go b/op-supervisor/supervisor/types/types.go index 46908ecce2e35..d26b58cb9a841 100644 --- a/op-supervisor/supervisor/types/types.go +++ b/op-supervisor/supervisor/types/types.go @@ -158,6 +158,16 @@ func (id *Identifier) UnmarshalJSON(input []byte) error { return nil } +func (id Identifier) ChecksumArgs(msgHash common.Hash) ChecksumArgs { + return ChecksumArgs{ + BlockNumber: id.BlockNumber, + Timestamp: id.Timestamp, + LogIndex: id.LogIndex, + ChainID: id.ChainID, + LogHash: PayloadHashToLogHash(msgHash, id.Origin), + } +} + type SafetyLevel string func (lvl SafetyLevel) String() string {