From df08f60183f7264802d24406ad3c58093632aacf Mon Sep 17 00:00:00 2001 From: colin <102356659+colinlyguo@users.noreply.github.com> Date: Sat, 13 Jul 2024 00:37:31 +0800 Subject: [PATCH] fix(rollup-verifier): decode commitBatchWithBlobProof calldata (#896) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(rollup-verifier): decode commitBatchWithBlobProof Co-authored-by: Péter Garamvölgyi --- params/version.go | 2 +- rollup/rollup_sync_service/abi.go | 2 +- rollup/rollup_sync_service/l1client_test.go | 4 +- .../rollup_sync_service.go | 40 ++- .../rollup_sync_service_test.go | 265 ++++++++++++++++-- .../commitBatchWithBlobProof_codecv3.rlp | Bin 0 -> 4693 bytes ...ommitBatchWithBlobProof_input_codecv3.json | 31 ++ 7 files changed, 304 insertions(+), 40 deletions(-) create mode 100644 rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_codecv3.rlp create mode 100644 rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_input_codecv3.json diff --git a/params/version.go b/params/version.go index 4cec56bd8771..153d78b8dd26 100644 --- a/params/version.go +++ b/params/version.go @@ -24,7 +24,7 @@ import ( const ( VersionMajor = 5 // Major version component of the current release VersionMinor = 5 // Minor version component of the current release - VersionPatch = 10 // Patch version component of the current release + VersionPatch = 11 // Patch version component of the current release VersionMeta = "mainnet" // Version metadata to append to the version string ) diff --git a/rollup/rollup_sync_service/abi.go b/rollup/rollup_sync_service/abi.go index 0252ecd02fdb..6975001f1870 100644 --- a/rollup/rollup_sync_service/abi.go +++ b/rollup/rollup_sync_service/abi.go @@ -12,7 +12,7 @@ import ( // scrollChainMetaData contains ABI of the ScrollChain contract. var scrollChainMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxNumTxInChunk\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxNumTxInChunk\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateProver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addProver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"_chunks\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"_skippedL1MessageBitmap\",\"type\":\"bytes\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_aggrProof\",\"type\":\"bytes\"}],\"name\":\"finalizeBatchWithProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isProver\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isSequencer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"layer2ChainId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeProver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"updateMaxNumTxInChunk\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"},{\"indexed\": true,\"internalType\": \"bytes32\",\"name\": \"batchHash\",\"type\": \"bytes32\"}],\"name\": \"CommitBatch\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"},{\"indexed\": true,\"internalType\": \"bytes32\",\"name\": \"batchHash\",\"type\": \"bytes32\"},{\"indexed\": false,\"internalType\": \"bytes32\",\"name\": \"stateRoot\",\"type\": \"bytes32\"},{\"indexed\": false,\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"}],\"name\": \"FinalizeBatch\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"},{\"indexed\": true,\"internalType\": \"bytes32\",\"name\": \"batchHash\",\"type\": \"bytes32\"}],\"name\": \"RevertBatch\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": false,\"internalType\": \"uint256\",\"name\": \"oldMaxNumTxInChunk\",\"type\": \"uint256\"},{\"indexed\": false,\"internalType\": \"uint256\",\"name\": \"newMaxNumTxInChunk\",\"type\": \"uint256\"}],\"name\": \"UpdateMaxNumTxInChunk\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"address\",\"name\": \"account\",\"type\": \"address\"},{\"indexed\": false,\"internalType\": \"bool\",\"name\": \"status\",\"type\": \"bool\"}],\"name\": \"UpdateProver\",\"type\": \"event\"},{\"anonymous\": false,\"inputs\": [{\"indexed\": true,\"internalType\": \"address\",\"name\": \"account\",\"type\": \"address\"},{\"indexed\": false,\"internalType\": \"bool\",\"name\": \"status\",\"type\": \"bool\"}],\"name\": \"UpdateSequencer\",\"type\": \"event\"},{\"inputs\": [{\"internalType\": \"uint8\",\"name\": \"version\",\"type\": \"uint8\"},{\"internalType\": \"bytes\",\"name\": \"parentBatchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes[]\",\"name\": \"chunks\",\"type\": \"bytes[]\"},{\"internalType\": \"bytes\",\"name\": \"skippedL1MessageBitmap\",\"type\": \"bytes\"}],\"name\": \"commitBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint8\",\"name\": \"version\",\"type\": \"uint8\"},{\"internalType\": \"bytes\",\"name\": \"parentBatchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes[]\",\"name\": \"chunks\",\"type\": \"bytes[]\"},{\"internalType\": \"bytes\",\"name\": \"skippedL1MessageBitmap\",\"type\": \"bytes\"},{\"internalType\": \"bytes\",\"name\": \"blobDataProof\",\"type\": \"bytes\"}],\"name\": \"commitBatchWithBlobProof\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"committedBatches\",\"outputs\": [{\"internalType\": \"bytes32\",\"name\": \"\",\"type\": \"bytes32\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"}],\"name\": \"finalizeBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"blobDataProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBatch4844\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"aggrProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBatchWithProof\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"prevStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"blobDataProof\",\"type\": \"bytes\"},{\"internalType\": \"bytes\",\"name\": \"aggrProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBatchWithProof4844\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"}],\"name\": \"finalizeBundle\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"postStateRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes32\",\"name\": \"withdrawRoot\",\"type\": \"bytes32\"},{\"internalType\": \"bytes\",\"name\": \"aggrProof\",\"type\": \"bytes\"}],\"name\": \"finalizeBundleWithProof\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"finalizedStateRoots\",\"outputs\": [{\"internalType\": \"bytes32\",\"name\": \"\",\"type\": \"bytes32\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"_batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"bytes32\",\"name\": \"_stateRoot\",\"type\": \"bytes32\"}],\"name\": \"importGenesisBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"isBatchFinalized\",\"outputs\": [{\"internalType\": \"bool\",\"name\": \"\",\"type\": \"bool\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [],\"name\": \"lastFinalizedBatchIndex\",\"outputs\": [{\"internalType\": \"uint256\",\"name\": \"\",\"type\": \"uint256\"}],\"stateMutability\": \"view\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"bytes\",\"name\": \"batchHeader\",\"type\": \"bytes\"},{\"internalType\": \"uint256\",\"name\": \"count\",\"type\": \"uint256\"}],\"name\": \"revertBatch\",\"outputs\": [],\"stateMutability\": \"nonpayable\",\"type\": \"function\"},{\"inputs\": [{\"internalType\": \"uint256\",\"name\": \"batchIndex\",\"type\": \"uint256\"}],\"name\": \"withdrawRoots\",\"outputs\": [{\"internalType\": \"bytes32\",\"name\": \"\",\"type\": \"bytes32\"}],\"stateMutability\": \"view\",\"type\": \"function\"}]", } // L1CommitBatchEvent represents a CommitBatch event raised by the ScrollChain contract. diff --git a/rollup/rollup_sync_service/l1client_test.go b/rollup/rollup_sync_service/l1client_test.go index 5b9de1274300..8c7bd92f8b11 100644 --- a/rollup/rollup_sync_service/l1client_test.go +++ b/rollup/rollup_sync_service/l1client_test.go @@ -36,7 +36,7 @@ func TestL1Client(t *testing.T) { } type mockEthClient struct { - commitBatchRLP []byte + txRLP []byte } func (m *mockEthClient) BlockNumber(ctx context.Context) (uint64, error) { @@ -63,7 +63,7 @@ func (m *mockEthClient) SubscribeFilterLogs(ctx context.Context, query ethereum. func (m *mockEthClient) TransactionByHash(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) { var tx types.Transaction - if err := rlp.DecodeBytes(m.commitBatchRLP, &tx); err != nil { + if err := rlp.DecodeBytes(m.txRLP, &tx); err != nil { return nil, false, err } return &tx, false, nil diff --git a/rollup/rollup_sync_service/rollup_sync_service.go b/rollup/rollup_sync_service/rollup_sync_service.go index f9efe189b4bf..c94e55d0b703 100644 --- a/rollup/rollup_sync_service/rollup_sync_service.go +++ b/rollup/rollup_sync_service/rollup_sync_service.go @@ -388,18 +388,38 @@ func (s *RollupSyncService) decodeChunkBlockRanges(txData []byte) ([]*rawdb.Chun return nil, fmt.Errorf("failed to unpack transaction data using ABI, tx data: %v, err: %w", txData, err) } - type commitBatchArgs struct { - Version uint8 - ParentBatchHeader []byte - Chunks [][]byte - SkippedL1MessageBitmap []byte - } - var args commitBatchArgs - if err = method.Inputs.Copy(&args, values); err != nil { - return nil, fmt.Errorf("failed to decode calldata into commitBatch args, values: %+v, err: %w", values, err) + if method.Name == "commitBatch" { + type commitBatchArgs struct { + Version uint8 + ParentBatchHeader []byte + Chunks [][]byte + SkippedL1MessageBitmap []byte + } + + var args commitBatchArgs + if err = method.Inputs.Copy(&args, values); err != nil { + return nil, fmt.Errorf("failed to decode calldata into commitBatch args, values: %+v, err: %w", values, err) + } + + return decodeBlockRangesFromEncodedChunks(encoding.CodecVersion(args.Version), args.Chunks) + } else if method.Name == "commitBatchWithBlobProof" { + type commitBatchWithBlobProofArgs struct { + Version uint8 + ParentBatchHeader []byte + Chunks [][]byte + SkippedL1MessageBitmap []byte + BlobDataProof []byte + } + + var args commitBatchWithBlobProofArgs + if err = method.Inputs.Copy(&args, values); err != nil { + return nil, fmt.Errorf("failed to decode calldata into commitBatchWithBlobProofArgs args, values: %+v, err: %w", values, err) + } + + return decodeBlockRangesFromEncodedChunks(encoding.CodecVersion(args.Version), args.Chunks) } - return decodeBlockRangesFromEncodedChunks(encoding.CodecVersion(args.Version), args.Chunks) + return nil, fmt.Errorf("unexpected method name: %v", method.Name) } // validateBatch verifies the consistency between the L1 contract and L2 node data. diff --git a/rollup/rollup_sync_service/rollup_sync_service_test.go b/rollup/rollup_sync_service/rollup_sync_service_test.go index 470ab783aece..1ed258780f35 100644 --- a/rollup/rollup_sync_service/rollup_sync_service_test.go +++ b/rollup/rollup_sync_service/rollup_sync_service_test.go @@ -209,6 +209,70 @@ func TestDecodeChunkRangesCodecv2(t *testing.T) { } } +func TestDecodeChunkRangesCodecv3(t *testing.T) { + scrollChainABI, err := scrollChainMetaData.GetAbi() + require.NoError(t, err) + + service := &RollupSyncService{ + scrollChainABI: scrollChainABI, + } + + data, err := os.ReadFile("./testdata/commitBatchWithBlobProof_input_codecv3.json") + require.NoError(t, err, "Failed to read json file") + + type tx struct { + Input string `json:"input"` + } + var commitBatch tx + err = json.Unmarshal(data, &commitBatch) + require.NoError(t, err, "Failed to unmarshal transaction json") + + testTxData, err := hex.DecodeString(commitBatch.Input[2:]) + if err != nil { + t.Fatalf("Failed to decode string: %v", err) + } + + ranges, err := service.decodeChunkBlockRanges(testTxData) + if err != nil { + t.Fatalf("Failed to decode chunk ranges: %v", err) + } + + expectedRanges := []*rawdb.ChunkBlockRange{ + {StartBlockNumber: 1, EndBlockNumber: 9}, + {StartBlockNumber: 10, EndBlockNumber: 20}, + {StartBlockNumber: 21, EndBlockNumber: 21}, + {StartBlockNumber: 22, EndBlockNumber: 22}, + {StartBlockNumber: 23, EndBlockNumber: 23}, + {StartBlockNumber: 24, EndBlockNumber: 24}, + {StartBlockNumber: 25, EndBlockNumber: 25}, + {StartBlockNumber: 26, EndBlockNumber: 26}, + {StartBlockNumber: 27, EndBlockNumber: 27}, + {StartBlockNumber: 28, EndBlockNumber: 28}, + {StartBlockNumber: 29, EndBlockNumber: 29}, + {StartBlockNumber: 30, EndBlockNumber: 30}, + {StartBlockNumber: 31, EndBlockNumber: 31}, + {StartBlockNumber: 32, EndBlockNumber: 32}, + {StartBlockNumber: 33, EndBlockNumber: 33}, + {StartBlockNumber: 34, EndBlockNumber: 34}, + {StartBlockNumber: 35, EndBlockNumber: 35}, + {StartBlockNumber: 36, EndBlockNumber: 36}, + {StartBlockNumber: 37, EndBlockNumber: 37}, + {StartBlockNumber: 38, EndBlockNumber: 38}, + {StartBlockNumber: 39, EndBlockNumber: 39}, + {StartBlockNumber: 40, EndBlockNumber: 40}, + } + + if len(expectedRanges) != len(ranges) { + t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) + } + + for i := range ranges { + if *expectedRanges[i] != *ranges[i] { + t.Errorf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) + } + } +} + func TestGetChunkRangesCodecv0(t *testing.T) { genesisConfig := ¶ms.ChainConfig{ Scroll: params.ScrollConfig{ @@ -225,7 +289,7 @@ func TestGetChunkRangesCodecv0(t *testing.T) { t.Fatalf("Failed to read RLP data: %v", err) } l1Client := &mockEthClient{ - commitBatchRLP: rlpData, + txRLP: rlpData, } bc := &core.BlockChain{} stack, err := node.New(&node.DefaultConfig) @@ -277,7 +341,7 @@ func TestGetChunkRangesCodecv1(t *testing.T) { t.Fatalf("Failed to read RLP data: %v", err) } l1Client := &mockEthClient{ - commitBatchRLP: rlpData, + txRLP: rlpData, } bc := &core.BlockChain{} stack, err := node.New(&node.DefaultConfig) @@ -327,7 +391,7 @@ func TestGetChunkRangesCodecv2(t *testing.T) { t.Fatalf("Failed to read RLP data: %v", err) } l1Client := &mockEthClient{ - commitBatchRLP: rlpData, + txRLP: rlpData, } bc := &core.BlockChain{} stack, err := node.New(&node.DefaultConfig) @@ -389,6 +453,85 @@ func TestGetChunkRangesCodecv2(t *testing.T) { } } +func TestGetChunkRangesCodecv3(t *testing.T) { + genesisConfig := ¶ms.ChainConfig{ + Scroll: params.ScrollConfig{ + L1Config: ¶ms.L1Config{ + L1ChainId: 11155111, + ScrollChainAddress: common.HexToAddress("0x2D567EcE699Eabe5afCd141eDB7A4f2D0D6ce8a0"), + }, + }, + } + db := rawdb.NewDatabase(memorydb.New()) + + rlpData, err := os.ReadFile("./testdata/commitBatchWithBlobProof_codecv3.rlp") + if err != nil { + t.Fatalf("Failed to read RLP data: %v", err) + } + l1Client := &mockEthClient{ + txRLP: rlpData, + } + bc := &core.BlockChain{} + stack, err := node.New(&node.DefaultConfig) + if err != nil { + t.Fatalf("Failed to new P2P node: %v", err) + } + defer stack.Close() + service, err := NewRollupSyncService(context.Background(), genesisConfig, db, l1Client, bc, stack) + if err != nil { + t.Fatalf("Failed to new rollup sync service: %v", err) + } + + vLog := &types.Log{ + TxHash: common.HexToHash("0x3"), + } + ranges, err := service.getChunkRanges(1, vLog) + require.NoError(t, err) + + expectedRanges := []*rawdb.ChunkBlockRange{ + {StartBlockNumber: 41, EndBlockNumber: 41}, + {StartBlockNumber: 42, EndBlockNumber: 42}, + {StartBlockNumber: 43, EndBlockNumber: 43}, + {StartBlockNumber: 44, EndBlockNumber: 44}, + {StartBlockNumber: 45, EndBlockNumber: 45}, + {StartBlockNumber: 46, EndBlockNumber: 46}, + {StartBlockNumber: 47, EndBlockNumber: 47}, + {StartBlockNumber: 48, EndBlockNumber: 48}, + {StartBlockNumber: 49, EndBlockNumber: 49}, + {StartBlockNumber: 50, EndBlockNumber: 50}, + {StartBlockNumber: 51, EndBlockNumber: 51}, + {StartBlockNumber: 52, EndBlockNumber: 52}, + {StartBlockNumber: 53, EndBlockNumber: 53}, + {StartBlockNumber: 54, EndBlockNumber: 54}, + {StartBlockNumber: 55, EndBlockNumber: 55}, + {StartBlockNumber: 56, EndBlockNumber: 56}, + {StartBlockNumber: 57, EndBlockNumber: 57}, + {StartBlockNumber: 58, EndBlockNumber: 58}, + {StartBlockNumber: 59, EndBlockNumber: 59}, + {StartBlockNumber: 60, EndBlockNumber: 60}, + {StartBlockNumber: 61, EndBlockNumber: 61}, + {StartBlockNumber: 62, EndBlockNumber: 62}, + {StartBlockNumber: 63, EndBlockNumber: 63}, + {StartBlockNumber: 64, EndBlockNumber: 64}, + {StartBlockNumber: 65, EndBlockNumber: 65}, + {StartBlockNumber: 66, EndBlockNumber: 66}, + {StartBlockNumber: 67, EndBlockNumber: 67}, + {StartBlockNumber: 68, EndBlockNumber: 68}, + {StartBlockNumber: 69, EndBlockNumber: 69}, + {StartBlockNumber: 70, EndBlockNumber: 70}, + } + + if len(expectedRanges) != len(ranges) { + t.Fatalf("Expected range length %v, got %v", len(expectedRanges), len(ranges)) + } + + for i := range ranges { + if *expectedRanges[i] != *ranges[i] { + t.Fatalf("Mismatch at index %d: expected %v, got %v", i, *expectedRanges[i], *ranges[i]) + } + } +} + func TestValidateBatchCodecv0(t *testing.T) { chainConfig := ¶ms.ChainConfig{} @@ -548,8 +691,8 @@ func TestValidateBatchCodecv2(t *testing.T) { assert.Equal(t, parentBatchMeta3, finalizedBatchMeta2) } -func TestValidateBatchUpgrades(t *testing.T) { - chainConfig := ¶ms.ChainConfig{BernoulliBlock: big.NewInt(14), CurieBlock: big.NewInt(16)} +func TestValidateBatchCodecv3(t *testing.T) { + chainConfig := ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0), CurieBlock: big.NewInt(0), DarwinTime: new(uint64)} block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} @@ -557,20 +700,70 @@ func TestValidateBatchUpgrades(t *testing.T) { block2 := readBlockFromJSON(t, "./testdata/blockTrace_03.json") chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} + block3 := readBlockFromJSON(t, "./testdata/blockTrace_04.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} + parentBatchMeta1 := &rawdb.FinalizedBatchMeta{} event1 := &L1FinalizeBatchEvent{ BatchIndex: big.NewInt(0), - BatchHash: common.HexToHash("0xb501030a30bf3936aaf7d50ae175035ecfa04c8ce0031de3936300cf2718c427"), - StateRoot: chunk2.Blocks[len(chunk2.Blocks)-1].Header.Root, - WithdrawRoot: chunk2.Blocks[len(chunk2.Blocks)-1].WithdrawRoot, + BatchHash: common.HexToHash("0x015eb56fb95bf9a06157cfb8389ba7c2b6b08373e22581ac2ba387003708265d"), + StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, } - endBlock1, finalizedBatchMeta1, err := validateBatch(event1, parentBatchMeta1, []*encoding.Chunk{chunk1, chunk2}, chainConfig, nil) + endBlock1, finalizedBatchMeta1, err := validateBatch(event1, parentBatchMeta1, []*encoding.Chunk{chunk1, chunk2, chunk3}, chainConfig, nil) assert.NoError(t, err) - assert.Equal(t, uint64(3), endBlock1) + assert.Equal(t, uint64(13), endBlock1) - block3 := readBlockFromJSON(t, "./testdata/blockTrace_04.json") - chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} + block4 := readBlockFromJSON(t, "./testdata/blockTrace_05.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} + + parentBatchMeta2 := &rawdb.FinalizedBatchMeta{ + BatchHash: event1.BatchHash, + TotalL1MessagePopped: 11, + StateRoot: event1.StateRoot, + WithdrawRoot: event1.WithdrawRoot, + } + assert.Equal(t, parentBatchMeta2, finalizedBatchMeta1) + event2 := &L1FinalizeBatchEvent{ + BatchIndex: big.NewInt(1), + BatchHash: common.HexToHash("0x382cb0d507e3d7507f556c52e05f76b05e364ad26205e7f62c95967a19c2f35d"), + StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + } + endBlock2, finalizedBatchMeta2, err := validateBatch(event2, parentBatchMeta2, []*encoding.Chunk{chunk4}, chainConfig, nil) + assert.NoError(t, err) + assert.Equal(t, uint64(17), endBlock2) + + parentBatchMeta3 := &rawdb.FinalizedBatchMeta{ + BatchHash: event2.BatchHash, + TotalL1MessagePopped: 42, + StateRoot: event2.StateRoot, + WithdrawRoot: event2.WithdrawRoot, + } + assert.Equal(t, parentBatchMeta3, finalizedBatchMeta2) +} + +func TestValidateBatchUpgrades(t *testing.T) { + chainConfig := ¶ms.ChainConfig{BernoulliBlock: big.NewInt(3), CurieBlock: big.NewInt(14), DarwinTime: func() *uint64 { t := uint64(1684762320); return &t }()} + + block1 := readBlockFromJSON(t, "./testdata/blockTrace_02.json") + chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} + + parentBatchMeta1 := &rawdb.FinalizedBatchMeta{} + event1 := &L1FinalizeBatchEvent{ + BatchIndex: big.NewInt(0), + BatchHash: common.HexToHash("0x4605465b7470c8565b123330d7186805caf9a7f2656d8e9e744b62e14ca22c3d"), + StateRoot: chunk1.Blocks[len(chunk1.Blocks)-1].Header.Root, + WithdrawRoot: chunk1.Blocks[len(chunk1.Blocks)-1].WithdrawRoot, + } + + endBlock1, finalizedBatchMeta1, err := validateBatch(event1, parentBatchMeta1, []*encoding.Chunk{chunk1}, chainConfig, nil) + assert.NoError(t, err) + assert.Equal(t, uint64(2), endBlock1) + + block2 := readBlockFromJSON(t, "./testdata/blockTrace_03.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} parentBatchMeta2 := &rawdb.FinalizedBatchMeta{ BatchHash: event1.BatchHash, @@ -581,41 +774,61 @@ func TestValidateBatchUpgrades(t *testing.T) { assert.Equal(t, parentBatchMeta2, finalizedBatchMeta1) event2 := &L1FinalizeBatchEvent{ BatchIndex: big.NewInt(1), - BatchHash: common.HexToHash("0x1879659b3cdc1039a9db62f4ac5a6d0d8f2aaa13ff484917d603fe04eaf2d7c1"), - StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, - WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, + BatchHash: common.HexToHash("0xc4af33bce87aa702edc3ad4b7d34730d25719427704e250787f99e0f55049252"), + StateRoot: chunk2.Blocks[len(chunk2.Blocks)-1].Header.Root, + WithdrawRoot: chunk2.Blocks[len(chunk2.Blocks)-1].WithdrawRoot, } - endBlock2, finalizedBatchMeta2, err := validateBatch(event2, parentBatchMeta2, []*encoding.Chunk{chunk3}, chainConfig, nil) + endBlock2, finalizedBatchMeta2, err := validateBatch(event2, parentBatchMeta2, []*encoding.Chunk{chunk2}, chainConfig, nil) assert.NoError(t, err) - assert.Equal(t, uint64(13), endBlock2) + assert.Equal(t, uint64(3), endBlock2) - block4 := readBlockFromJSON(t, "./testdata/blockTrace_05.json") - chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} + block3 := readBlockFromJSON(t, "./testdata/blockTrace_04.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{block3}} parentBatchMeta3 := &rawdb.FinalizedBatchMeta{ BatchHash: event2.BatchHash, - TotalL1MessagePopped: 11, + TotalL1MessagePopped: 0, StateRoot: event2.StateRoot, WithdrawRoot: event2.WithdrawRoot, } assert.Equal(t, parentBatchMeta3, finalizedBatchMeta2) event3 := &L1FinalizeBatchEvent{ BatchIndex: big.NewInt(2), - BatchHash: common.HexToHash("0x871ba3c4ed8821ffc438c5468f1e996a6c4325fd8b53066c2783e54b3b7e9e24"), - StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, - WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + BatchHash: common.HexToHash("0x9f87f2de2019ed635f867b1e61be6a607c3174ced096f370fd18556c38833c62"), + StateRoot: chunk3.Blocks[len(chunk3.Blocks)-1].Header.Root, + WithdrawRoot: chunk3.Blocks[len(chunk3.Blocks)-1].WithdrawRoot, } - endBlock3, finalizedBatchMeta3, err := validateBatch(event3, parentBatchMeta3, []*encoding.Chunk{chunk4}, chainConfig, nil) + endBlock3, finalizedBatchMeta3, err := validateBatch(event3, parentBatchMeta3, []*encoding.Chunk{chunk3}, chainConfig, nil) assert.NoError(t, err) - assert.Equal(t, uint64(17), endBlock3) + assert.Equal(t, uint64(13), endBlock3) + + block4 := readBlockFromJSON(t, "./testdata/blockTrace_05.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{block4}} parentBatchMeta4 := &rawdb.FinalizedBatchMeta{ BatchHash: event3.BatchHash, - TotalL1MessagePopped: 42, + TotalL1MessagePopped: 11, StateRoot: event3.StateRoot, WithdrawRoot: event3.WithdrawRoot, } assert.Equal(t, parentBatchMeta4, finalizedBatchMeta3) + event4 := &L1FinalizeBatchEvent{ + BatchIndex: big.NewInt(3), + BatchHash: common.HexToHash("0xd33332aef8efbc9a0be4c4694088ac0dd052d2d3ad3ffda5e4c2010825e476bc"), + StateRoot: chunk4.Blocks[len(chunk4.Blocks)-1].Header.Root, + WithdrawRoot: chunk4.Blocks[len(chunk4.Blocks)-1].WithdrawRoot, + } + endBlock4, finalizedBatchMeta4, err := validateBatch(event4, parentBatchMeta4, []*encoding.Chunk{chunk4}, chainConfig, nil) + assert.NoError(t, err) + assert.Equal(t, uint64(17), endBlock4) + + parentBatchMeta5 := &rawdb.FinalizedBatchMeta{ + BatchHash: event4.BatchHash, + TotalL1MessagePopped: 42, + StateRoot: event4.StateRoot, + WithdrawRoot: event4.WithdrawRoot, + } + assert.Equal(t, parentBatchMeta5, finalizedBatchMeta4) } func readBlockFromJSON(t *testing.T, filename string) *encoding.Block { diff --git a/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_codecv3.rlp b/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_codecv3.rlp new file mode 100644 index 0000000000000000000000000000000000000000..4640f84687416f77ecd3e0d0207f1bc46d75edbb GIT binary patch literal 4693 zcmcJSe@qi+7{{;eC|00Qx@ct66`003eu!+A7GcM*5(cRWC1q@qbWWKV2aXNm9Dxql z+}OZhT@?_$i38e-#WEHM8|kXf%waN+A<1y*7BgfzwL7}$H4yUX3>c#lgn{@{Jz z=kx7{hd0k%(t*f4*~3U*szjj>~3^ zm%ol^pLlmy&DP?=i+^<4Jl~8sXWwr1Cw+zgz2YX{DH;?Aq! zahVs+AJYhMs{r@Ic@QeVF*ujQF(S9X19C5%2WtelRe<~9d$y(mndKMv{voCr^nZZqk)AOH#Q{ZplOHnnJ zUtIshv;lu3<>Ffd@au6O@E_vyQndj5siglX<>Fge{tUhZw?^MT@w9;c?c4ce zF_ZG`X+JRyz~9W5qG~Mv3se=h(tctZfd2$6&GL(zPof*(KecGTxcfnIFYupUv|n8R z#54f^7ypz0MY4bB_c7M}i+g@ENxy5+{iCoX#pwCjj90+@oTCWe8bJRB(tn=MOVwC@ z;)$ooLMz?>7CZs^|8k)uUT66i^?bo>IKx(#uZZnG`Pt~QlcPQB4Z5i{-E$4ty z4hSn8M9AbX*<+1kJfbr4Gk68Z#Fw`%y};4 zs$#IlUc=t_C1^st@y@-?Im1ZCtK~iOrkWk{n)XYcw;J3tir$}ckC+Vg+io|mNi*in zAe$!C-Y9gs`gl>*quu{Zm)a&({gK1VO3m7z^P8`a+tOOr-Y5!GUmWO@3@*uWVx!Z9@(jGS`omW;ro-|RJIJn&Y{r$doPMsZ# I*)@{*A9z%^Qvd(} literal 0 HcmV?d00001 diff --git a/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_input_codecv3.json b/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_input_codecv3.json new file mode 100644 index 000000000000..ca13d9a749fc --- /dev/null +++ b/rollup/rollup_sync_service/testdata/commitBatchWithBlobProof_input_codecv3.json @@ -0,0 +1,31 @@ +{ + "blockHash": "0xb7f00b3235ef6066d61e5e5be5472cdd1edc0a64537b84f110f860e6614a4759", + "blockNumber": "0x187", + "from": "0xf472086186382fca55cd182de196520abd76f69d", + "gas": "0x3e052", + "gasPrice": "0x3b9aca07", + "maxFeePerGas": "0x3b9aca0e", + "maxPriorityFeePerGas": "0x3b9aca00", + "maxFeePerBlobGas": "0x2", + "hash": "0x8de0573f1f72ced727838df60088d9084333d27384a77bf331d520cac0e6a298", + "input": "0x86b053a9000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000108000000000000000000000000000000000000000000000000000000000000010a0000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000e5a938b077b60c939e58eeede33d4385228b532cf73e54aca76731a27acc86b7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000ee0000000000000000000000000000000000000000000000000000000000000021d09000000000000000100000000668ebf810000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000200000000668ec0650000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000300000000668ec0680000000000000000000000000000000000000000000000000000000002e71a60000000000098968000070000000000000000000400000000668ec06b0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000500000000668ec08e0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000600000000668ec0910000000000000000000000000000000000000000000000000000000002e71a60000000000098968000080000000000000000000700000000668ec0940000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000800000000668ec0970000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000900000000668ec0b50000000000000000000000000000000000000000000000000000000002e71a6000000000009896800001000000000000000000000000000000000000000000000000000000000000000000000002950b000000000000000a00000000668ec0b80000000000000000000000000000000000000000000000000000000002e71a60000000000098968000020000000000000000000b00000000668ec0bb0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000c00000000668ec1630000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000d00000000668ec1660000000000000000000000000000000000000000000000000000000002e71a60000000000098968000120000000000000000000e00000000668ec1690000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000000f00000000668ec16e0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001000000000668ec1710000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001100000000668ec1740000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001200000000668ec17c0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001300000000668ec21b0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000010000000000000000001400000000668ec21e0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003400000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001500000000668ec2210000000000000000000000000000000000000000000000000000000002e71a60000000000098968000400000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001600000000668ec2240000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001700000000668ec2270000000000000000000000000000000000000000000000000000000002e71a600000000000989680003f0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001800000000668ec22a0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000400000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001900000000668ec22d0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001a00000000668ec2300000000000000000000000000000000000000000000000000000000002e71a600000000000989680003e0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001b00000000668ec2330000000000000000000000000000000000000000000000000000000002e71a60000000000098968000400000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001c00000000668ec2360000000000000000000000000000000000000000000000000000000002e71a600000000000989680003f0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001d00000000668ec2390000000000000000000000000000000000000000000000000000000002e71a60000000000098968000410000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001e00000000668ec23c0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003e0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000001f00000000668ec23f0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003f0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002000000000668ec2420000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002100000000668ec2450000000000000000000000000000000000000000000000000000000002e71a600000000000989680003a0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002200000000668ec2480000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002300000000668ec24b0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003e0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002400000000668ec24e0000000000000000000000000000000000000000000000000000000002e71a600000000000989680003c0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002500000000668ec2510000000000000000000000000000000000000000000000000000000002e71a600000000000989680003b0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002600000000668ec2540000000000000000000000000000000000000000000000000000000002e71a600000000000989680003d0000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002700000000668ec2570000000000000000000000000000000000000000000000000000000002e71a60000000000098968000370000000000000000000000000000000000000000000000000000000000000000000000003d01000000000000002800000000668ec25a0000000000000000000000000000000000000000000000000000000002e71a60000000000098968000390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00b3a20d1a749d0917ef837a9973e549be83321ecafc3b8388f25c5c247078e383e4b062167826f53032aa9bb0fc2a8ef610e1c4e5d0f70ee133a76b5020224a8b2428ba7ec725c61950716b2758aa21f1b0cc3f0bf1551474537093924829c170e3d74228be4c07acf24b5c1adb1adac92d25a32f79ba51731343fc0f52cb11e32bbcedb1969853cf854f61862e915744fb5fbc3d4ec8701fc0f626f5c97211b", + "nonce": "0x1", + "to": "0x475652655309fa7cb1397537bee9a7fbafdc11ca", + "transactionIndex": "0x0", + "value": "0x0", + "type": "0x3", + "accessList": [ + { + "address": "0x3d9a28f7692cb94740bb64f08cb5cd19aa5cd3dd", + "storageKeys": [] + } + ], + "chainId": "0x1b207", + "blobVersionedHashes": [ + "0x0132d1238782d359051322a61d997a57f5b2f86d6f36c2aad4eda0118e3a213a" + ], + "v": "0x0", + "r": "0xe8f6ca4ef76a295dc6aa0099e0e9c4a2902cb0ffaeff0c4bae258575d00cae94", + "s": "0x20682493a94948fb97b8cb67e8ae86f444a96e39c5945f10d1008cf1a0508851", + "yParity": "0x0" +}