diff --git a/packages/eventindexer/TaikoL1.json b/packages/eventindexer/TaikoL1.json index a1d23d03cb..0e657737d9 100644 --- a/packages/eventindexer/TaikoL1.json +++ b/packages/eventindexer/TaikoL1.json @@ -208,26 +208,6 @@ "type": "uint32", "internalType": "uint32" }, - { - "name": "blockMaxTxListBytes", - "type": "uint24", - "internalType": "uint24" - }, - { - "name": "blobExpiry", - "type": "uint24", - "internalType": "uint24" - }, - { - "name": "blobAllowedForDA", - "type": "bool", - "internalType": "bool" - }, - { - "name": "blobReuseEnabled", - "type": "bool", - "internalType": "bool" - }, { "name": "livenessBond", "type": "uint96", @@ -454,25 +434,6 @@ "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "isBlobReusable", - "inputs": [ - { - "name": "_blobHash", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "owner", @@ -603,16 +564,6 @@ "type": "uint64", "internalType": "uint64" }, - { - "name": "txListByteOffset", - "type": "uint24", - "internalType": "uint24" - }, - { - "name": "txListByteSize", - "type": "uint24", - "internalType": "uint24" - }, { "name": "minTier", "type": "uint16", @@ -627,6 +578,11 @@ "name": "parentMetaHash", "type": "bytes32", "internalType": "bytes32" + }, + { + "name": "sender", + "type": "address", + "internalType": "address" } ] }, @@ -919,32 +875,6 @@ ], "anonymous": false }, - { - "type": "event", - "name": "BlobCached", - "inputs": [ - { - "name": "blobHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BlobCached", - "inputs": [ - { - "name": "blobHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, { "type": "event", "name": "BlockProposed", @@ -1023,16 +953,6 @@ "type": "uint64", "internalType": "uint64" }, - { - "name": "txListByteOffset", - "type": "uint24", - "internalType": "uint24" - }, - { - "name": "txListByteSize", - "type": "uint24", - "internalType": "uint24" - }, { "name": "minTier", "type": "uint16", @@ -1047,6 +967,11 @@ "name": "parentMetaHash", "type": "bytes32", "internalType": "bytes32" + }, + { + "name": "sender", + "type": "address", + "internalType": "address" } ] }, @@ -1154,16 +1079,6 @@ "type": "uint64", "internalType": "uint64" }, - { - "name": "txListByteOffset", - "type": "uint24", - "internalType": "uint24" - }, - { - "name": "txListByteSize", - "type": "uint24", - "internalType": "uint24" - }, { "name": "minTier", "type": "uint16", @@ -1178,6 +1093,11 @@ "name": "parentMetaHash", "type": "bytes32", "internalType": "bytes32" + }, + { + "name": "sender", + "type": "address", + "internalType": "address" } ] }, @@ -1746,12 +1666,12 @@ }, { "type": "error", - "name": "L1_BLOB_FOR_DA_DISABLED", + "name": "L1_BLOB_NOT_AVAILABLE", "inputs": [] }, { "type": "error", - "name": "L1_BLOB_FOR_DA_DISABLED", + "name": "L1_BLOB_NOT_AVAILABLE", "inputs": [] }, { @@ -1764,26 +1684,6 @@ "name": "L1_BLOB_NOT_FOUND", "inputs": [] }, - { - "type": "error", - "name": "L1_BLOB_NOT_REUSABLE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_NOT_REUSABLE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_REUSE_DISABLED", - "inputs": [] - }, - { - "type": "error", - "name": "L1_BLOB_REUSE_DISABLED", - "inputs": [] - }, { "type": "error", "name": "L1_BLOCK_MISMATCH", @@ -1839,11 +1739,6 @@ "name": "L1_INVALID_PARAM", "inputs": [] }, - { - "type": "error", - "name": "L1_INVALID_PARAM", - "inputs": [] - }, { "type": "error", "name": "L1_INVALID_PAUSE_STATUS", @@ -1959,21 +1854,6 @@ "name": "L1_TRANSITION_NOT_FOUND", "inputs": [] }, - { - "type": "error", - "name": "L1_TXLIST_OFFSET", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TXLIST_SIZE", - "inputs": [] - }, - { - "type": "error", - "name": "L1_TXLIST_SIZE", - "inputs": [] - }, { "type": "error", "name": "L1_UNAUTHORIZED", diff --git a/packages/eventindexer/block.go b/packages/eventindexer/block.go deleted file mode 100644 index 30bad3d803..0000000000 --- a/packages/eventindexer/block.go +++ /dev/null @@ -1,44 +0,0 @@ -package eventindexer - -import ( - "context" - "math/big" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" -) - -// ProcessedBlock is a database model representing simple header types -// to keep track of our most recently processed block number and hash. -type ProcessedBlock struct { - ID int `json:"id"` - Height uint64 `json:"blockHeight" gorm:"column:block_height"` - Hash string `json:"hash"` - ChainID int64 `json:"chainID"` -} - -// SaveProcessedBlockOpts is required to store a new block -type SaveProcessedBlockOpts struct { - Height uint64 - Hash common.Hash - ChainID *big.Int -} - -// ProcessedBlockRepository defines methods necessary for interacting with -// the block store. -type ProcessedBlockRepository interface { - Save(opts SaveProcessedBlockOpts) error - GetLatestBlockProcessed(chainID *big.Int) (*ProcessedBlock, error) -} - -type Block struct { - ID int `json:"id"` - ChainID int64 `json:"chainID"` - BlockID int64 `json:"blockID"` - TransactedAt time.Time `json:"transactedAt"` -} - -type BlockRepository interface { - Save(ctx context.Context, tx *types.Block, chainID *big.Int) error -} diff --git a/packages/eventindexer/cmd/flags/indexer.go b/packages/eventindexer/cmd/flags/indexer.go index 57c2152bc4..bceefd0ee2 100644 --- a/packages/eventindexer/cmd/flags/indexer.go +++ b/packages/eventindexer/cmd/flags/indexer.go @@ -74,17 +74,6 @@ var ( Category: indexerCategory, EnvVars: []string{"SYNC_MODE"}, } - WatchMode = &cli.StringFlag{ - Name: "watchMode", - Usage: `Mode of watching the chain. Options are: - filter: only filter the chain, when caught up, exit - subscribe: do not filter the chain, only subscribe to new events - filter-and-subscribe: the default behavior, filter the chain and subscribe when caught up - `, - Value: "filter-and-subscribe", - Category: indexerCategory, - EnvVars: []string{"SYNC_MODE"}, - } IndexNFTs = &cli.BoolFlag{ Name: "indexNfts", Usage: "Whether to index nft transfer events orn ot", @@ -105,6 +94,5 @@ var IndexerFlags = MergeFlags(CommonFlags, []cli.Flag{ BlockBatchSize, SubscriptionBackoff, SyncMode, - WatchMode, IndexNFTs, }) diff --git a/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go b/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go index 0f6d4cf713..6adc65e8f7 100644 --- a/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go +++ b/packages/eventindexer/contracts/assignmenthook/AssignmentHook.go @@ -55,21 +55,20 @@ type TaikoDataBlock struct { // TaikoDataBlockMetadata is an auto generated low-level Go binding around an user-defined struct. type TaikoDataBlockMetadata struct { - L1Hash [32]byte - Difficulty [32]byte - BlobHash [32]byte - ExtraData [32]byte - DepositsHash [32]byte - Coinbase common.Address - Id uint64 - GasLimit uint32 - Timestamp uint64 - L1Height uint64 - TxListByteOffset *big.Int - TxListByteSize *big.Int - MinTier uint16 - BlobUsed bool - ParentMetaHash [32]byte + L1Hash [32]byte + Difficulty [32]byte + BlobHash [32]byte + ExtraData [32]byte + DepositsHash [32]byte + Coinbase common.Address + Id uint64 + GasLimit uint32 + Timestamp uint64 + L1Height uint64 + MinTier uint16 + BlobUsed bool + ParentMetaHash [32]byte + Sender common.Address } // TaikoDataTierFee is an auto generated low-level Go binding around an user-defined struct. @@ -80,7 +79,7 @@ type TaikoDataTierFee struct { // AssignmentHookMetaData contains all meta data concerning the AssignmentHook contract. var AssignmentHookMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashAssignment\",\"inputs\":[{\"name\":\"_assignment\",\"type\":\"tuple\",\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_taikoL1Address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"inputs\":[{\"name\":\"_blk\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"txListByteOffset\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"txListByteSize\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockAssigned\",\"inputs\":[{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"txListByteOffset\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"txListByteSize\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"assignment\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"MAX_GAS_PAYING_PROVER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashAssignment\",\"inputs\":[{\"name\":\"_assignment\",\"type\":\"tuple\",\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"_taikoL1Address\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onBlockProposed\",\"inputs\":[{\"name\":\"_blk\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_meta\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockAssigned\",\"inputs\":[{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"assignment\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structAssignmentHook.ProverAssignment\",\"components\":[{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxProposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tierFees\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.TierFee[]\",\"components\":[{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"fee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EtherPaymentFailed\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"maxGas\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_EXPIRED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_ASSIGNMENT_INVALID_SIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"HOOK_TIER_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", } // AssignmentHookABI is the input ABI used to generate the binding from. @@ -550,23 +549,23 @@ func (_AssignmentHook *AssignmentHookTransactorSession) Init(_owner common.Addre return _AssignmentHook.Contract.Init(&_AssignmentHook.TransactOpts, _owner, _addressManager) } -// OnBlockProposed is a paid mutator transaction binding the contract method 0x4a697ba4. +// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. // -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) _meta, bytes _data) payable returns() +// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() func (_AssignmentHook *AssignmentHookTransactor) OnBlockProposed(opts *bind.TransactOpts, _blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { return _AssignmentHook.contract.Transact(opts, "onBlockProposed", _blk, _meta, _data) } -// OnBlockProposed is a paid mutator transaction binding the contract method 0x4a697ba4. +// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. // -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) _meta, bytes _data) payable returns() +// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() func (_AssignmentHook *AssignmentHookSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) } -// OnBlockProposed is a paid mutator transaction binding the contract method 0x4a697ba4. +// OnBlockProposed is a paid mutator transaction binding the contract method 0x36b6ea4e. // -// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) _meta, bytes _data) payable returns() +// Solidity: function onBlockProposed((bytes32,address,uint96,uint64,uint64,uint64,uint32,uint32) _blk, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) _meta, bytes _data) payable returns() func (_AssignmentHook *AssignmentHookTransactorSession) OnBlockProposed(_blk TaikoDataBlock, _meta TaikoDataBlockMetadata, _data []byte) (*types.Transaction, error) { return _AssignmentHook.Contract.OnBlockProposed(&_AssignmentHook.TransactOpts, _blk, _meta, _data) } @@ -1051,9 +1050,9 @@ type AssignmentHookBlockAssigned struct { Raw types.Log // Blockchain specific contextual infos } -// FilterBlockAssigned is a free log retrieval operation binding the contract event 0xde277ba69c45b6cbbca46ad05227230e568794cf370fe431a0a02966b7ecf35a. +// FilterBlockAssigned is a free log retrieval operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. // -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) +// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) func (_AssignmentHook *AssignmentHookFilterer) FilterBlockAssigned(opts *bind.FilterOpts, assignedProver []common.Address) (*AssignmentHookBlockAssignedIterator, error) { var assignedProverRule []interface{} @@ -1068,9 +1067,9 @@ func (_AssignmentHook *AssignmentHookFilterer) FilterBlockAssigned(opts *bind.Fi return &AssignmentHookBlockAssignedIterator{contract: _AssignmentHook.contract, event: "BlockAssigned", logs: logs, sub: sub}, nil } -// WatchBlockAssigned is a free log subscription operation binding the contract event 0xde277ba69c45b6cbbca46ad05227230e568794cf370fe431a0a02966b7ecf35a. +// WatchBlockAssigned is a free log subscription operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. // -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) +// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) func (_AssignmentHook *AssignmentHookFilterer) WatchBlockAssigned(opts *bind.WatchOpts, sink chan<- *AssignmentHookBlockAssigned, assignedProver []common.Address) (event.Subscription, error) { var assignedProverRule []interface{} @@ -1110,9 +1109,9 @@ func (_AssignmentHook *AssignmentHookFilterer) WatchBlockAssigned(opts *bind.Wat }), nil } -// ParseBlockAssigned is a log parse operation binding the contract event 0xde277ba69c45b6cbbca46ad05227230e568794cf370fe431a0a02966b7ecf35a. +// ParseBlockAssigned is a log parse operation binding the contract event 0x983b2c64d5e49fdb74b580110b1c64f6f6572b114331e9fee6b7531627eaf0b1. // -// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) +// Solidity: event BlockAssigned(address indexed assignedProver, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint64,uint64,uint64,bytes32,bytes32,(uint16,uint128)[],bytes) assignment) func (_AssignmentHook *AssignmentHookFilterer) ParseBlockAssigned(log types.Log) (*AssignmentHookBlockAssigned, error) { event := new(AssignmentHookBlockAssigned) if err := _AssignmentHook.contract.UnpackLog(event, "BlockAssigned", log); err != nil { @@ -1122,6 +1121,141 @@ func (_AssignmentHook *AssignmentHookFilterer) ParseBlockAssigned(log types.Log) return event, nil } +// AssignmentHookEtherPaymentFailedIterator is returned from FilterEtherPaymentFailed and is used to iterate over the raw logs and unpacked data for EtherPaymentFailed events raised by the AssignmentHook contract. +type AssignmentHookEtherPaymentFailedIterator struct { + Event *AssignmentHookEtherPaymentFailed // 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 *AssignmentHookEtherPaymentFailedIterator) 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(AssignmentHookEtherPaymentFailed) + 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(AssignmentHookEtherPaymentFailed) + 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 *AssignmentHookEtherPaymentFailedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssignmentHookEtherPaymentFailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssignmentHookEtherPaymentFailed represents a EtherPaymentFailed event raised by the AssignmentHook contract. +type AssignmentHookEtherPaymentFailed struct { + To common.Address + MaxGas *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEtherPaymentFailed is a free log retrieval operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. +// +// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) +func (_AssignmentHook *AssignmentHookFilterer) FilterEtherPaymentFailed(opts *bind.FilterOpts) (*AssignmentHookEtherPaymentFailedIterator, error) { + + logs, sub, err := _AssignmentHook.contract.FilterLogs(opts, "EtherPaymentFailed") + if err != nil { + return nil, err + } + return &AssignmentHookEtherPaymentFailedIterator{contract: _AssignmentHook.contract, event: "EtherPaymentFailed", logs: logs, sub: sub}, nil +} + +// WatchEtherPaymentFailed is a free log subscription operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. +// +// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) +func (_AssignmentHook *AssignmentHookFilterer) WatchEtherPaymentFailed(opts *bind.WatchOpts, sink chan<- *AssignmentHookEtherPaymentFailed) (event.Subscription, error) { + + logs, sub, err := _AssignmentHook.contract.WatchLogs(opts, "EtherPaymentFailed") + 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(AssignmentHookEtherPaymentFailed) + if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", 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 +} + +// ParseEtherPaymentFailed is a log parse operation binding the contract event 0x193fbe934858a5b7669033de55612da355d11604360d59535b5bfaa25c42209e. +// +// Solidity: event EtherPaymentFailed(address to, uint256 maxGas) +func (_AssignmentHook *AssignmentHookFilterer) ParseEtherPaymentFailed(log types.Log) (*AssignmentHookEtherPaymentFailed, error) { + event := new(AssignmentHookEtherPaymentFailed) + if err := _AssignmentHook.contract.UnpackLog(event, "EtherPaymentFailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // AssignmentHookInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AssignmentHook contract. type AssignmentHookInitializedIterator struct { Event *AssignmentHookInitialized // Event containing the contract specifics and raw log diff --git a/packages/eventindexer/contracts/bridge/Bridge.go b/packages/eventindexer/contracts/bridge/Bridge.go index 30e3f6c0a0..babc57dc82 100644 --- a/packages/eventindexer/contracts/bridge/Bridge.go +++ b/packages/eventindexer/contracts/bridge/Bridge.go @@ -55,7 +55,7 @@ type IBridgeMessage struct { // BridgeMetaData contains all meta data concerning the Bridge contract. var BridgeMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressBanned\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"banned\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"banAddress\",\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_ban\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInvocationDelays\",\"inputs\":[],\"outputs\":[{\"name\":\"invocationDelay_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"invocationExtraDelay_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proofReceipt\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"receivedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"preferredExecutor\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"suspendMessages\",\"inputs\":[{\"name\":\"_msgHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_suspend\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AddressBanned\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"banned\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageExecuted\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageRecalled\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"isRecall\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageRetried\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSuspended\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"suspended\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_USER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVOCATION_TOO_EARLY\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_NON_RETRIABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_NOT_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_STATUS_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", + ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressBanned\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"banned\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"banAddress\",\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_ban\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"context\",\"inputs\":[],\"outputs\":[{\"name\":\"ctx_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Context\",\"components\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInvocationDelays\",\"inputs\":[],\"outputs\":[{\"name\":\"invocationDelay_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"invocationExtraDelay_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hashMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDestChainEnabled\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"enabled_\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"destBridge_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isMessageSent\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"messageStatus\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIBridge.Status\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextMessageId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proofReceipt\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"receivedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"preferredExecutor\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveMessageFailed\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proveMessageReceived\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recallMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"retryMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"_isLastAttempt\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendMessage\",\"inputs\":[{\"name\":\"_message\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"msgHash_\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"message_\",\"type\":\"tuple\",\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"signalForFailedMessage\",\"inputs\":[{\"name\":\"_msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"suspendMessages\",\"inputs\":[{\"name\":\"_msgHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"_suspend\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AddressBanned\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"banned\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageExecuted\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageRecalled\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageReceived\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"isRecall\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageRetried\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSent\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIBridge.Message\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"srcChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"srcOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"refundTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageStatusChanged\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIBridge.Status\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MessageSuspended\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"suspended\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"B_INVALID_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_CONTEXT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_GAS_LIMIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_USER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVALID_VALUE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_INVOCATION_TOO_EARLY\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_MESSAGE_NOT_SENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_NON_RETRIABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_NOT_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_PERMISSION_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"B_STATUS_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", } // BridgeABI is the input ABI used to generate the binding from. @@ -649,68 +649,6 @@ func (_Bridge *BridgeCallerSession) ProofReceipt(msgHash [32]byte) (struct { return _Bridge.Contract.ProofReceipt(&_Bridge.CallOpts, msgHash) } -// ProveMessageFailed is a free data retrieval call binding the contract method 0x324c058e. -// -// Solidity: function proveMessageFailed((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) view returns(bool) -func (_Bridge *BridgeCaller) ProveMessageFailed(opts *bind.CallOpts, _message IBridgeMessage, _proof []byte) (bool, error) { - var out []interface{} - err := _Bridge.contract.Call(opts, &out, "proveMessageFailed", _message, _proof) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// ProveMessageFailed is a free data retrieval call binding the contract method 0x324c058e. -// -// Solidity: function proveMessageFailed((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) view returns(bool) -func (_Bridge *BridgeSession) ProveMessageFailed(_message IBridgeMessage, _proof []byte) (bool, error) { - return _Bridge.Contract.ProveMessageFailed(&_Bridge.CallOpts, _message, _proof) -} - -// ProveMessageFailed is a free data retrieval call binding the contract method 0x324c058e. -// -// Solidity: function proveMessageFailed((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) view returns(bool) -func (_Bridge *BridgeCallerSession) ProveMessageFailed(_message IBridgeMessage, _proof []byte) (bool, error) { - return _Bridge.Contract.ProveMessageFailed(&_Bridge.CallOpts, _message, _proof) -} - -// ProveMessageReceived is a free data retrieval call binding the contract method 0x6be4eb55. -// -// Solidity: function proveMessageReceived((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) view returns(bool) -func (_Bridge *BridgeCaller) ProveMessageReceived(opts *bind.CallOpts, _message IBridgeMessage, _proof []byte) (bool, error) { - var out []interface{} - err := _Bridge.contract.Call(opts, &out, "proveMessageReceived", _message, _proof) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// ProveMessageReceived is a free data retrieval call binding the contract method 0x6be4eb55. -// -// Solidity: function proveMessageReceived((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) view returns(bool) -func (_Bridge *BridgeSession) ProveMessageReceived(_message IBridgeMessage, _proof []byte) (bool, error) { - return _Bridge.Contract.ProveMessageReceived(&_Bridge.CallOpts, _message, _proof) -} - -// ProveMessageReceived is a free data retrieval call binding the contract method 0x6be4eb55. -// -// Solidity: function proveMessageReceived((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) view returns(bool) -func (_Bridge *BridgeCallerSession) ProveMessageReceived(_message IBridgeMessage, _proof []byte) (bool, error) { - return _Bridge.Contract.ProveMessageReceived(&_Bridge.CallOpts, _message, _proof) -} - // ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. // // Solidity: function proxiableUUID() view returns(bytes32) @@ -940,6 +878,48 @@ func (_Bridge *BridgeTransactorSession) ProcessMessage(_message IBridgeMessage, return _Bridge.Contract.ProcessMessage(&_Bridge.TransactOpts, _message, _proof) } +// ProveMessageFailed is a paid mutator transaction binding the contract method 0x324c058e. +// +// Solidity: function proveMessageFailed((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) returns(bool) +func (_Bridge *BridgeTransactor) ProveMessageFailed(opts *bind.TransactOpts, _message IBridgeMessage, _proof []byte) (*types.Transaction, error) { + return _Bridge.contract.Transact(opts, "proveMessageFailed", _message, _proof) +} + +// ProveMessageFailed is a paid mutator transaction binding the contract method 0x324c058e. +// +// Solidity: function proveMessageFailed((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) returns(bool) +func (_Bridge *BridgeSession) ProveMessageFailed(_message IBridgeMessage, _proof []byte) (*types.Transaction, error) { + return _Bridge.Contract.ProveMessageFailed(&_Bridge.TransactOpts, _message, _proof) +} + +// ProveMessageFailed is a paid mutator transaction binding the contract method 0x324c058e. +// +// Solidity: function proveMessageFailed((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) returns(bool) +func (_Bridge *BridgeTransactorSession) ProveMessageFailed(_message IBridgeMessage, _proof []byte) (*types.Transaction, error) { + return _Bridge.Contract.ProveMessageFailed(&_Bridge.TransactOpts, _message, _proof) +} + +// ProveMessageReceived is a paid mutator transaction binding the contract method 0x6be4eb55. +// +// Solidity: function proveMessageReceived((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) returns(bool) +func (_Bridge *BridgeTransactor) ProveMessageReceived(opts *bind.TransactOpts, _message IBridgeMessage, _proof []byte) (*types.Transaction, error) { + return _Bridge.contract.Transact(opts, "proveMessageReceived", _message, _proof) +} + +// ProveMessageReceived is a paid mutator transaction binding the contract method 0x6be4eb55. +// +// Solidity: function proveMessageReceived((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) returns(bool) +func (_Bridge *BridgeSession) ProveMessageReceived(_message IBridgeMessage, _proof []byte) (*types.Transaction, error) { + return _Bridge.Contract.ProveMessageReceived(&_Bridge.TransactOpts, _message, _proof) +} + +// ProveMessageReceived is a paid mutator transaction binding the contract method 0x6be4eb55. +// +// Solidity: function proveMessageReceived((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) returns(bool) +func (_Bridge *BridgeTransactorSession) ProveMessageReceived(_message IBridgeMessage, _proof []byte) (*types.Transaction, error) { + return _Bridge.Contract.ProveMessageReceived(&_Bridge.TransactOpts, _message, _proof) +} + // RecallMessage is a paid mutator transaction binding the contract method 0xd6ba38b2. // // Solidity: function recallMessage((uint128,address,uint64,uint64,address,address,address,address,uint256,uint256,uint256,bytes,string) _message, bytes _proof) returns() diff --git a/packages/eventindexer/contracts/taikol1/TaikoL1.go b/packages/eventindexer/contracts/taikol1/TaikoL1.go index ea759d1827..9e2e67da2e 100644 --- a/packages/eventindexer/contracts/taikol1/TaikoL1.go +++ b/packages/eventindexer/contracts/taikol1/TaikoL1.go @@ -43,21 +43,20 @@ type TaikoDataBlock struct { // TaikoDataBlockMetadata is an auto generated low-level Go binding around an user-defined struct. type TaikoDataBlockMetadata struct { - L1Hash [32]byte - Difficulty [32]byte - BlobHash [32]byte - ExtraData [32]byte - DepositsHash [32]byte - Coinbase common.Address - Id uint64 - GasLimit uint32 - Timestamp uint64 - L1Height uint64 - TxListByteOffset *big.Int - TxListByteSize *big.Int - MinTier uint16 - BlobUsed bool - ParentMetaHash [32]byte + L1Hash [32]byte + Difficulty [32]byte + BlobHash [32]byte + ExtraData [32]byte + DepositsHash [32]byte + Coinbase common.Address + Id uint64 + GasLimit uint32 + Timestamp uint64 + L1Height uint64 + MinTier uint16 + BlobUsed bool + ParentMetaHash [32]byte + Sender common.Address } // TaikoDataConfig is an auto generated low-level Go binding around an user-defined struct. @@ -67,10 +66,6 @@ type TaikoDataConfig struct { BlockRingBufferSize uint64 MaxBlocksToVerifyPerProposal uint64 BlockMaxGasLimit uint32 - BlockMaxTxListBytes *big.Int - BlobExpiry *big.Int - BlobAllowedForDA bool - BlobReuseEnabled bool LivenessBond *big.Int EthDepositRingBufferSize *big.Int EthDepositMinCountPerBlock uint64 @@ -132,7 +127,7 @@ type TaikoDataTransitionState struct { // TaikoL1MetaData contains all meta data concerning the TaikoL1 contract. var TaikoL1MetaData = &bind.MetaData{ - ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canDepositEthToL2\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositEtherToL2\",\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ts_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"blockMaxTxListBytes\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"blobExpiry\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"blobAllowedForDA\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blobReuseEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositRingBufferSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ethDepositMinCountPerBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"ethDepositMaxCountPerBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"ethDepositMinAmount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositMaxAmount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositGas\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ethDepositMaxFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"a_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numEthDeposits\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextEthDepositToProcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"b_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlobReusable\",\"inputs\":[{\"name\":\"_blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"txListByteOffset\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"txListByteSize\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numEthDeposits\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextEthDepositToProcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlobCached\",\"inputs\":[{\"name\":\"blobHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlobCached\",\"inputs\":[{\"name\":\"blobHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"txListByteOffset\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"txListByteSize\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"txListByteOffset\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"txListByteSize\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_FOR_DA_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_FOR_DA_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_REUSABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_REUSABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_REUSE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_REUSE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_TIERS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TXLIST_OFFSET\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TXLIST_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TXLIST_SIZE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", + ABI: "[{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addressManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canDepositEthToL2\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositEtherToL2\",\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"blk_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Block\",\"components\":[{\"name\":\"metaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"proposedIn\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"verifiedTransitionId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"ts_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.Config\",\"components\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxProposals\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRingBufferSize\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxBlocksToVerifyPerProposal\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositRingBufferSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ethDepositMinCountPerBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"ethDepositMaxCountPerBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"ethDepositMinAmount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositMaxAmount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"ethDepositGas\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"ethDepositMaxFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blockSyncThreshold\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStateVariables\",\"inputs\":[],\"outputs\":[{\"name\":\"a_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numEthDeposits\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextEthDepositToProcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"b_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTransition\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.TransitionState\",\"components\":[{\"name\":\"key\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"prover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"contester\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"init\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_addressManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseProving\",\"inputs\":[{\"name\":\"_pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeBlock\",\"inputs\":[{\"name\":\"_params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_txList\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"meta_\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"deposits_\",\"type\":\"tuple[]\",\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"proveBlock\",\"inputs\":[{\"name\":\"_blockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_input\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[{\"name\":\"_name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_allowZeroAddress\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"addresspayable\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state\",\"inputs\":[],\"outputs\":[{\"name\":\"slotA\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotA\",\"components\":[{\"name\":\"genesisHeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"genesisTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numEthDeposits\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextEthDepositToProcess\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"slotB\",\"type\":\"tuple\",\"internalType\":\"structTaikoData.SlotB\",\"components\":[{\"name\":\"numBlocks\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"provingPaused\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"__reserved1\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"__reserved2\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"__reserved3\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"lastUnpausedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeTo\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyBlocks\",\"inputs\":[{\"name\":\"_maxBlocksToVerify\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconUpgraded\",\"inputs\":[{\"name\":\"beacon\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockProposed\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"livenessBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"meta\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"components\":[{\"name\":\"l1Hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"difficulty\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blobHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extraData\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"depositsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"coinbase\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"l1Height\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minTier\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"blobUsed\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"parentMetaHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"depositsProcessed\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit[]\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BlockVerified\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"assignedProver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"contestations\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EthDeposited\",\"inputs\":[{\"name\":\"deposit\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.EthDeposit\",\"components\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"id\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProvingPaused\",\"inputs\":[{\"name\":\"paused\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionContested\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"contester\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"contestBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransitionProved\",\"inputs\":[{\"name\":\"blockId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"tran\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structTaikoData.Transition\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"graffiti\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"prover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"validityBond\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"tier\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ETH_TRANSFER_FAILED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_CONTESTED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ALREADY_PROVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_AVAILABLE\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOB_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_BLOCK_MISMATCH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_BLOCK_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_CONFIG\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_HOOK\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PARAM\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PAUSE_STATUS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_INVALID_TRANSITION\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_MISSING_VERIFIER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROPOSER_NOT_EOA\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_PROVING_PAUSED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_RECEIVE_DISABLED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_BLOCKS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TOO_MANY_TIERS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_ID_ZERO\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_TRANSITION_NOT_FOUND\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNAUTHORIZED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_PARENT\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"REENTRANT_CALL\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_DENIED\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_INVALID_MANAGER\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RESOLVER_ZERO_ADDR\",\"inputs\":[{\"name\":\"chainId\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"name\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZERO_ADDR_MANAGER\",\"inputs\":[]}]", } // TaikoL1ABI is the input ABI used to generate the binding from. @@ -390,7 +385,7 @@ func (_TaikoL1 *TaikoL1CallerSession) GetBlock(_blockId uint64) (struct { // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint24,uint24,bool,bool,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) +// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, error) { var out []interface{} err := _TaikoL1.contract.Call(opts, &out, "getConfig") @@ -407,14 +402,14 @@ func (_TaikoL1 *TaikoL1Caller) GetConfig(opts *bind.CallOpts) (TaikoDataConfig, // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint24,uint24,bool,bool,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) +// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) func (_TaikoL1 *TaikoL1Session) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } // GetConfig is a free data retrieval call binding the contract method 0xc3f909d4. // -// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint24,uint24,bool,bool,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) +// Solidity: function getConfig() view returns((uint64,uint64,uint64,uint64,uint32,uint96,uint256,uint64,uint64,uint96,uint96,uint256,uint256,uint8)) func (_TaikoL1 *TaikoL1CallerSession) GetConfig() (TaikoDataConfig, error) { return _TaikoL1.Contract.GetConfig(&_TaikoL1.CallOpts) } @@ -495,37 +490,6 @@ func (_TaikoL1 *TaikoL1CallerSession) GetTransition(_blockId uint64, _parentHash return _TaikoL1.Contract.GetTransition(&_TaikoL1.CallOpts, _blockId, _parentHash) } -// IsBlobReusable is a free data retrieval call binding the contract method 0xb67d7638. -// -// Solidity: function isBlobReusable(bytes32 _blobHash) view returns(bool) -func (_TaikoL1 *TaikoL1Caller) IsBlobReusable(opts *bind.CallOpts, _blobHash [32]byte) (bool, error) { - var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "isBlobReusable", _blobHash) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsBlobReusable is a free data retrieval call binding the contract method 0xb67d7638. -// -// Solidity: function isBlobReusable(bytes32 _blobHash) view returns(bool) -func (_TaikoL1 *TaikoL1Session) IsBlobReusable(_blobHash [32]byte) (bool, error) { - return _TaikoL1.Contract.IsBlobReusable(&_TaikoL1.CallOpts, _blobHash) -} - -// IsBlobReusable is a free data retrieval call binding the contract method 0xb67d7638. -// -// Solidity: function isBlobReusable(bytes32 _blobHash) view returns(bool) -func (_TaikoL1 *TaikoL1CallerSession) IsBlobReusable(_blobHash [32]byte) (bool, error) { - return _TaikoL1.Contract.IsBlobReusable(&_TaikoL1.CallOpts, _blobHash) -} - // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) @@ -864,21 +828,21 @@ func (_TaikoL1 *TaikoL1TransactorSession) PauseProving(_pause bool) (*types.Tran // ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta_, (address,uint96,uint64)[] deposits_) +// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) func (_TaikoL1 *TaikoL1Transactor) ProposeBlock(opts *bind.TransactOpts, _params []byte, _txList []byte) (*types.Transaction, error) { return _TaikoL1.contract.Transact(opts, "proposeBlock", _params, _txList) } // ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta_, (address,uint96,uint64)[] deposits_) +// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) func (_TaikoL1 *TaikoL1Session) ProposeBlock(_params []byte, _txList []byte) (*types.Transaction, error) { return _TaikoL1.Contract.ProposeBlock(&_TaikoL1.TransactOpts, _params, _txList) } // ProposeBlock is a paid mutator transaction binding the contract method 0xef16e845. // -// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta_, (address,uint96,uint64)[] deposits_) +// Solidity: function proposeBlock(bytes _params, bytes _txList) payable returns((bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta_, (address,uint96,uint64)[] deposits_) func (_TaikoL1 *TaikoL1TransactorSession) ProposeBlock(_params []byte, _txList []byte) (*types.Transaction, error) { return _TaikoL1.Contract.ProposeBlock(&_TaikoL1.TransactOpts, _params, _txList) } @@ -1330,274 +1294,6 @@ func (_TaikoL1 *TaikoL1Filterer) ParseBeaconUpgraded(log types.Log) (*TaikoL1Bea return event, nil } -// TaikoL1BlobCachedIterator is returned from FilterBlobCached and is used to iterate over the raw logs and unpacked data for BlobCached events raised by the TaikoL1 contract. -type TaikoL1BlobCachedIterator struct { - Event *TaikoL1BlobCached // 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 *TaikoL1BlobCachedIterator) 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(TaikoL1BlobCached) - 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(TaikoL1BlobCached) - 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 *TaikoL1BlobCachedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1BlobCachedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1BlobCached represents a BlobCached event raised by the TaikoL1 contract. -type TaikoL1BlobCached struct { - BlobHash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlobCached is a free log retrieval operation binding the contract event 0xb303828b7c63a3e480df6d8239eb7be1d4a1eb1c8878d6fa461103b94f4ce852. -// -// Solidity: event BlobCached(bytes32 blobHash) -func (_TaikoL1 *TaikoL1Filterer) FilterBlobCached(opts *bind.FilterOpts) (*TaikoL1BlobCachedIterator, error) { - - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlobCached") - if err != nil { - return nil, err - } - return &TaikoL1BlobCachedIterator{contract: _TaikoL1.contract, event: "BlobCached", logs: logs, sub: sub}, nil -} - -// WatchBlobCached is a free log subscription operation binding the contract event 0xb303828b7c63a3e480df6d8239eb7be1d4a1eb1c8878d6fa461103b94f4ce852. -// -// Solidity: event BlobCached(bytes32 blobHash) -func (_TaikoL1 *TaikoL1Filterer) WatchBlobCached(opts *bind.WatchOpts, sink chan<- *TaikoL1BlobCached) (event.Subscription, error) { - - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlobCached") - 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(TaikoL1BlobCached) - if err := _TaikoL1.contract.UnpackLog(event, "BlobCached", 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 -} - -// ParseBlobCached is a log parse operation binding the contract event 0xb303828b7c63a3e480df6d8239eb7be1d4a1eb1c8878d6fa461103b94f4ce852. -// -// Solidity: event BlobCached(bytes32 blobHash) -func (_TaikoL1 *TaikoL1Filterer) ParseBlobCached(log types.Log) (*TaikoL1BlobCached, error) { - event := new(TaikoL1BlobCached) - if err := _TaikoL1.contract.UnpackLog(event, "BlobCached", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// TaikoL1BlobCached0Iterator is returned from FilterBlobCached0 and is used to iterate over the raw logs and unpacked data for BlobCached0 events raised by the TaikoL1 contract. -type TaikoL1BlobCached0Iterator struct { - Event *TaikoL1BlobCached0 // 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 *TaikoL1BlobCached0Iterator) 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(TaikoL1BlobCached0) - 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(TaikoL1BlobCached0) - 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 *TaikoL1BlobCached0Iterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *TaikoL1BlobCached0Iterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// TaikoL1BlobCached0 represents a BlobCached0 event raised by the TaikoL1 contract. -type TaikoL1BlobCached0 struct { - BlobHash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBlobCached0 is a free log retrieval operation binding the contract event 0xb303828b7c63a3e480df6d8239eb7be1d4a1eb1c8878d6fa461103b94f4ce852. -// -// Solidity: event BlobCached(bytes32 blobHash) -func (_TaikoL1 *TaikoL1Filterer) FilterBlobCached0(opts *bind.FilterOpts) (*TaikoL1BlobCached0Iterator, error) { - - logs, sub, err := _TaikoL1.contract.FilterLogs(opts, "BlobCached0") - if err != nil { - return nil, err - } - return &TaikoL1BlobCached0Iterator{contract: _TaikoL1.contract, event: "BlobCached0", logs: logs, sub: sub}, nil -} - -// WatchBlobCached0 is a free log subscription operation binding the contract event 0xb303828b7c63a3e480df6d8239eb7be1d4a1eb1c8878d6fa461103b94f4ce852. -// -// Solidity: event BlobCached(bytes32 blobHash) -func (_TaikoL1 *TaikoL1Filterer) WatchBlobCached0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlobCached0) (event.Subscription, error) { - - logs, sub, err := _TaikoL1.contract.WatchLogs(opts, "BlobCached0") - 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(TaikoL1BlobCached0) - if err := _TaikoL1.contract.UnpackLog(event, "BlobCached0", 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 -} - -// ParseBlobCached0 is a log parse operation binding the contract event 0xb303828b7c63a3e480df6d8239eb7be1d4a1eb1c8878d6fa461103b94f4ce852. -// -// Solidity: event BlobCached(bytes32 blobHash) -func (_TaikoL1 *TaikoL1Filterer) ParseBlobCached0(log types.Log) (*TaikoL1BlobCached0, error) { - event := new(TaikoL1BlobCached0) - if err := _TaikoL1.contract.UnpackLog(event, "BlobCached0", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // TaikoL1BlockProposedIterator is returned from FilterBlockProposed and is used to iterate over the raw logs and unpacked data for BlockProposed events raised by the TaikoL1 contract. type TaikoL1BlockProposedIterator struct { Event *TaikoL1BlockProposed // Event containing the contract specifics and raw log @@ -1675,9 +1371,9 @@ type TaikoL1BlockProposed struct { Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed is a free log retrieval operation binding the contract event 0xa62cea5af360b010ef0d23472a2a7493b54175fd9fd2f9c2aa2bb427d2f4d3ca. +// FilterBlockProposed is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint96,uint64)[] depositsProcessed) +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposedIterator, error) { var blockIdRule []interface{} @@ -1696,9 +1392,9 @@ func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed(opts *bind.FilterOpts, bloc return &TaikoL1BlockProposedIterator{contract: _TaikoL1.contract, event: "BlockProposed", logs: logs, sub: sub}, nil } -// WatchBlockProposed is a free log subscription operation binding the contract event 0xa62cea5af360b010ef0d23472a2a7493b54175fd9fd2f9c2aa2bb427d2f4d3ca. +// WatchBlockProposed is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint96,uint64)[] depositsProcessed) +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { var blockIdRule []interface{} @@ -1742,9 +1438,9 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed(opts *bind.WatchOpts, sink c }), nil } -// ParseBlockProposed is a log parse operation binding the contract event 0xa62cea5af360b010ef0d23472a2a7493b54175fd9fd2f9c2aa2bb427d2f4d3ca. +// ParseBlockProposed is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint96,uint64)[] depositsProcessed) +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed(log types.Log) (*TaikoL1BlockProposed, error) { event := new(TaikoL1BlockProposed) if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed", log); err != nil { @@ -1831,9 +1527,9 @@ type TaikoL1BlockProposed0 struct { Raw types.Log // Blockchain specific contextual infos } -// FilterBlockProposed0 is a free log retrieval operation binding the contract event 0xa62cea5af360b010ef0d23472a2a7493b54175fd9fd2f9c2aa2bb427d2f4d3ca. +// FilterBlockProposed0 is a free log retrieval operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint96,uint64)[] depositsProcessed) +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed0(opts *bind.FilterOpts, blockId []*big.Int, assignedProver []common.Address) (*TaikoL1BlockProposed0Iterator, error) { var blockIdRule []interface{} @@ -1852,9 +1548,9 @@ func (_TaikoL1 *TaikoL1Filterer) FilterBlockProposed0(opts *bind.FilterOpts, blo return &TaikoL1BlockProposed0Iterator{contract: _TaikoL1.contract, event: "BlockProposed0", logs: logs, sub: sub}, nil } -// WatchBlockProposed0 is a free log subscription operation binding the contract event 0xa62cea5af360b010ef0d23472a2a7493b54175fd9fd2f9c2aa2bb427d2f4d3ca. +// WatchBlockProposed0 is a free log subscription operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint96,uint64)[] depositsProcessed) +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink chan<- *TaikoL1BlockProposed0, blockId []*big.Int, assignedProver []common.Address) (event.Subscription, error) { var blockIdRule []interface{} @@ -1898,9 +1594,9 @@ func (_TaikoL1 *TaikoL1Filterer) WatchBlockProposed0(opts *bind.WatchOpts, sink }), nil } -// ParseBlockProposed0 is a log parse operation binding the contract event 0xa62cea5af360b010ef0d23472a2a7493b54175fd9fd2f9c2aa2bb427d2f4d3ca. +// ParseBlockProposed0 is a log parse operation binding the contract event 0xcda4e564245eb15494bc6da29f6a42e1941cf57f5314bf35bab8a1fca0a9c60a. // -// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint24,uint24,uint16,bool,bytes32) meta, (address,uint96,uint64)[] depositsProcessed) +// Solidity: event BlockProposed(uint256 indexed blockId, address indexed assignedProver, uint96 livenessBond, (bytes32,bytes32,bytes32,bytes32,bytes32,address,uint64,uint32,uint64,uint64,uint16,bool,bytes32,address) meta, (address,uint96,uint64)[] depositsProcessed) func (_TaikoL1 *TaikoL1Filterer) ParseBlockProposed0(log types.Log) (*TaikoL1BlockProposed0, error) { event := new(TaikoL1BlockProposed0) if err := _TaikoL1.contract.UnpackLog(event, "BlockProposed0", log); err != nil { diff --git a/packages/eventindexer/event.go b/packages/eventindexer/event.go index cf39618df2..7d8560ef25 100644 --- a/packages/eventindexer/event.go +++ b/packages/eventindexer/event.go @@ -45,6 +45,7 @@ type Event struct { FeeTokenAddress string `json:"feeTokenAddress"` TransactedAt time.Time `json:"transactedAt"` Tier sql.NullInt16 `json:"tier"` + EmittedBlockID uint64 `json:"emittedBlockID"` } // SaveEventOpts @@ -65,6 +66,7 @@ type SaveEventOpts struct { FeeTokenAddress *string TransactedAt time.Time Tier *uint16 + EmittedBlockID uint64 } type UniqueProversResponse struct { @@ -111,4 +113,8 @@ type EventRepository interface { req *http.Request, address string, ) (paginate.Page, error) + DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error + FindLatestBlockID( + srcChainID uint64, + ) (uint64, error) } diff --git a/packages/eventindexer/generator/generator.go b/packages/eventindexer/generator/generator.go index b49c581d45..b0cf23219e 100644 --- a/packages/eventindexer/generator/generator.go +++ b/packages/eventindexer/generator/generator.go @@ -638,25 +638,6 @@ func (g *Generator) queryByTask(task string, date time.Time) error { } result = tsdResult.Decimal.Add(dailyAccountsCount.Decimal) - case tasks.BlocksPerDay: - query := `SELECT COUNT(*) FROM blocks WHERE DATE(transacted_at) = ?` - err = g.db.GormDB().Raw(query, dateString).Scan(&result).Error - case tasks.TotalBlocks: - var dailyBlockCount decimal.NullDecimal - - query := `SELECT COUNT(*) FROM blocks WHERE DATE(transacted_at) = ?` - - err = g.db.GormDB().Raw(query, dateString).Scan(&dailyBlockCount).Error - if err != nil { - return err - } - - tsdResult, err := g.previousDayTsdResultByTask(task, date, nil, nil) - if err != nil { - return err - } - - result = tsdResult.Decimal.Add(dailyBlockCount.Decimal) case tasks.TransactionsPerDay: query := `SELECT COUNT(*) FROM transactions WHERE DATE(transacted_at) = ?` err = g.db.GormDB().Raw(query, dateString).Scan(&result).Error diff --git a/packages/eventindexer/indexer/config.go b/packages/eventindexer/indexer/config.go index e109afde0f..940376559c 100644 --- a/packages/eventindexer/indexer/config.go +++ b/packages/eventindexer/indexer/config.go @@ -37,7 +37,6 @@ type Config struct { BlockBatchSize uint64 SubscriptionBackoff uint64 SyncMode SyncMode - WatchMode WatchMode IndexNFTs bool Layer string OpenDBFunc func() (DB, error) @@ -72,7 +71,6 @@ func NewConfigFromCliContext(c *cli.Context) (*Config, error) { BlockBatchSize: c.Uint64(flags.BlockBatchSize.Name), SubscriptionBackoff: c.Uint64(flags.SubscriptionBackoff.Name), RPCUrl: c.String(flags.IndexerRPCUrl.Name), - WatchMode: WatchMode(c.String(flags.WatchMode.Name)), SyncMode: SyncMode(c.String(flags.SyncMode.Name)), IndexNFTs: c.Bool(flags.IndexNFTs.Name), Layer: c.String(flags.Layer.Name), diff --git a/packages/eventindexer/indexer/config_test.go b/packages/eventindexer/indexer/config_test.go index a9eb2256cc..7140727d7e 100644 --- a/packages/eventindexer/indexer/config_test.go +++ b/packages/eventindexer/indexer/config_test.go @@ -22,7 +22,6 @@ var ( blockBatchSize = "100" subscriptionBackoff = "30" syncMode = "sync" - watchMode = "filter" layer = "l1" rpcUrl = "rpcUrl" ) @@ -61,7 +60,6 @@ func TestNewConfigFromCliContext(t *testing.T) { assert.Equal(t, uint64(100), c.BlockBatchSize) assert.Equal(t, uint64(30), c.SubscriptionBackoff) assert.Equal(t, SyncMode(syncMode), c.SyncMode) - assert.Equal(t, WatchMode(watchMode), c.WatchMode) assert.Equal(t, true, c.IndexNFTs) assert.Equal(t, layer, c.Layer) assert.Equal(t, rpcUrl, c.RPCUrl) @@ -90,7 +88,6 @@ func TestNewConfigFromCliContext(t *testing.T) { "--" + flags.BlockBatchSize.Name, blockBatchSize, "--" + flags.SubscriptionBackoff.Name, subscriptionBackoff, "--" + flags.SyncMode.Name, syncMode, - "--" + flags.WatchMode.Name, watchMode, "--" + flags.IndexNFTs.Name, "--" + flags.Layer.Name, layer, "--" + flags.IndexerRPCUrl.Name, rpcUrl, diff --git a/packages/eventindexer/indexer/detect_and_handle_reorg.go b/packages/eventindexer/indexer/detect_and_handle_reorg.go deleted file mode 100644 index 2ae534a236..0000000000 --- a/packages/eventindexer/indexer/detect_and_handle_reorg.go +++ /dev/null @@ -1,24 +0,0 @@ -package indexer - -import ( - "context" - - "github.com/pkg/errors" -) - -func (indx *Indexer) detectAndHandleReorg(ctx context.Context, event string, blockID int64) error { - existingEvent, err := indx.eventRepo.FindByEventTypeAndBlockID(ctx, event, blockID) - if err != nil { - return errors.Wrap(err, "svc.eventRepo.FindByEventTypeAndBlockID") - } - - if existingEvent != nil { - // reorg detected - err := indx.eventRepo.Delete(ctx, existingEvent.ID) - if err != nil { - return errors.Wrap(err, "svc.eventRepo.Delete") - } - } - - return nil -} diff --git a/packages/eventindexer/indexer/filter.go b/packages/eventindexer/indexer/filter.go index 0c752aa773..f156fea30c 100644 --- a/packages/eventindexer/indexer/filter.go +++ b/packages/eventindexer/indexer/filter.go @@ -14,7 +14,7 @@ import ( type FilterFunc func( ctx context.Context, chainID *big.Int, - indxr *Indexer, + i *Indexer, filterOpts *bind.FilterOpts, ) error @@ -22,116 +22,116 @@ type FilterFunc func( func filterFunc( ctx context.Context, chainID *big.Int, - indxr *Indexer, + i *Indexer, filterOpts *bind.FilterOpts, ) error { wg, ctx := errgroup.WithContext(ctx) - if indxr.taikol1 != nil { + if i.taikol1 != nil { wg.Go(func() error { - transitionProvedEvents, err := indxr.taikol1.FilterTransitionProved(filterOpts, nil) + transitionProvedEvents, err := i.taikol1.FilterTransitionProved(filterOpts, nil) if err != nil { - return errors.Wrap(err, "indxr.taikol1.FilterTransitionProved") + return errors.Wrap(err, "i.taikol1.FilterTransitionProved") } - err = indxr.saveTransitionProvedEvents(ctx, chainID, transitionProvedEvents) + err = i.saveTransitionProvedEvents(ctx, chainID, transitionProvedEvents) if err != nil { - return errors.Wrap(err, "indxr.saveBlockProvenEvents") + return errors.Wrap(err, "i.saveBlockProvenEvents") } return nil }) wg.Go(func() error { - transitionContestedEvents, err := indxr.taikol1.FilterTransitionContested(filterOpts, nil) + transitionContestedEvents, err := i.taikol1.FilterTransitionContested(filterOpts, nil) if err != nil { - return errors.Wrap(err, "indxr.taikol1.FilterTransitionContested") + return errors.Wrap(err, "i.taikol1.FilterTransitionContested") } - err = indxr.saveTransitionContestedEvents(ctx, chainID, transitionContestedEvents) + err = i.saveTransitionContestedEvents(ctx, chainID, transitionContestedEvents) if err != nil { - return errors.Wrap(err, "indxr.saveTransitionContestedEvents") + return errors.Wrap(err, "i.saveTransitionContestedEvents") } return nil }) wg.Go(func() error { - blockProposedEvents, err := indxr.taikol1.FilterBlockProposed(filterOpts, nil, nil) + blockProposedEvents, err := i.taikol1.FilterBlockProposed(filterOpts, nil, nil) if err != nil { - return errors.Wrap(err, "indxr.taikol1.FilterBlockProposed") + return errors.Wrap(err, "i.taikol1.FilterBlockProposed") } - err = indxr.saveBlockProposedEvents(ctx, chainID, blockProposedEvents) + err = i.saveBlockProposedEvents(ctx, chainID, blockProposedEvents) if err != nil { - return errors.Wrap(err, "indxr.saveBlockProposedEvents") + return errors.Wrap(err, "i.saveBlockProposedEvents") } return nil }) wg.Go(func() error { - blockVerifiedEvents, err := indxr.taikol1.FilterBlockVerified(filterOpts, nil, nil, nil) + blockVerifiedEvents, err := i.taikol1.FilterBlockVerified(filterOpts, nil, nil, nil) if err != nil { - return errors.Wrap(err, "indxr.taikol1.FilterBlockVerified") + return errors.Wrap(err, "i.taikol1.FilterBlockVerified") } - err = indxr.saveBlockVerifiedEvents(ctx, chainID, blockVerifiedEvents) + err = i.saveBlockVerifiedEvents(ctx, chainID, blockVerifiedEvents) if err != nil { - return errors.Wrap(err, "indxr.saveBlockVerifiedEvents") + return errors.Wrap(err, "i.saveBlockVerifiedEvents") } return nil }) } - if indxr.bridge != nil { + if i.bridge != nil { wg.Go(func() error { - messagesSent, err := indxr.bridge.FilterMessageSent(filterOpts, nil) + messagesSent, err := i.bridge.FilterMessageSent(filterOpts, nil) if err != nil { - return errors.Wrap(err, "indxr.bridge.FilterMessageSent") + return errors.Wrap(err, "i.bridge.FilterMessageSent") } - err = indxr.saveMessageSentEvents(ctx, chainID, messagesSent) + err = i.saveMessageSentEvents(ctx, chainID, messagesSent) if err != nil { - return errors.Wrap(err, "indxr.saveMessageSentEvents") + return errors.Wrap(err, "i.saveMessageSentEvents") } return nil }) } - if indxr.assignmentHook != nil { + if i.assignmentHook != nil { wg.Go(func() error { - blocksAssigned, err := indxr.assignmentHook.FilterBlockAssigned(filterOpts, nil) + blocksAssigned, err := i.assignmentHook.FilterBlockAssigned(filterOpts, nil) if err != nil { - return errors.Wrap(err, "indxr.assignmentHook.FilterBlockAssigned") + return errors.Wrap(err, "i.assignmentHook.FilterBlockAssigned") } - err = indxr.saveBlockAssignedEvents(ctx, chainID, blocksAssigned) + err = i.saveBlockAssignedEvents(ctx, chainID, blocksAssigned) if err != nil { - return errors.Wrap(err, "indxr.saveBlockAssignedEvents") + return errors.Wrap(err, "i.saveBlockAssignedEvents") } return nil }) } - if indxr.swaps != nil { - for _, s := range indxr.swaps { + if i.swaps != nil { + for _, s := range i.swaps { swap := s wg.Go(func() error { swaps, err := swap.FilterSwap(filterOpts, nil, nil) if err != nil { - return errors.Wrap(err, "indxr.bridge.FilterSwap") + return errors.Wrap(err, "i.bridge.FilterSwap") } // only save ones above 0.01 ETH, this is only for Galaxe // and we dont care about the rest - err = indxr.saveSwapEvents(ctx, chainID, swaps) + err = i.saveSwapEvents(ctx, chainID, swaps) if err != nil { - return errors.Wrap(err, "indxr.saveSwapEvents") + return errors.Wrap(err, "i.saveSwapEvents") } return nil @@ -141,14 +141,14 @@ func filterFunc( liquidityAdded, err := swap.FilterMint(filterOpts, nil) if err != nil { - return errors.Wrap(err, "indxr.bridge.FilterMint") + return errors.Wrap(err, "i.bridge.FilterMint") } // only save ones above 0.1 ETH, this is only for Galaxe // and we dont care about the rest - err = indxr.saveLiquidityAddedEvents(ctx, chainID, liquidityAdded) + err = i.saveLiquidityAddedEvents(ctx, chainID, liquidityAdded) if err != nil { - return errors.Wrap(err, "indxr.saveLiquidityAddedEvents") + return errors.Wrap(err, "i.saveLiquidityAddedEvents") } return nil @@ -157,9 +157,10 @@ func filterFunc( } wg.Go(func() error { - if err := indxr.indexRawBlockData(ctx, chainID, filterOpts.Start, *filterOpts.End); err != nil { - return errors.Wrap(err, "indxr.indexRawBlockData") + if err := i.indexRawBlockData(ctx, chainID, filterOpts.Start, *filterOpts.End); err != nil { + return errors.Wrap(err, "i.indexRawBlockData") } + return nil }) @@ -176,3 +177,54 @@ func filterFunc( return nil } + +func (i *Indexer) filter( + ctx context.Context, + filter FilterFunc, +) error { + n, err := i.eventRepo.FindLatestBlockID(i.srcChainID) + if err != nil { + return err + } + + i.latestIndexedBlockNumber = n + + header, err := i.ethClient.HeaderByNumber(ctx, nil) + if err != nil { + return errors.Wrap(err, "i.ethClient.HeaderByNumber") + } + + // the end block is the latest header. + endBlockID := header.Number.Uint64() + + slog.Info("getting batch of events", + "startBlock", i.latestIndexedBlockNumber, + "endBlock", header.Number.Int64(), + "batchSize", i.blockBatchSize, + ) + + for j := i.latestIndexedBlockNumber + 1; j <= endBlockID; j += i.blockBatchSize { + end := i.latestIndexedBlockNumber + i.blockBatchSize + // if the end of the batch is greater than the latest block number, set end + // to the latest block number + if end > endBlockID { + end = endBlockID + } + + slog.Info("block batch", "start", j, "end", end) + + filterOpts := &bind.FilterOpts{ + Start: j, + End: &end, + Context: ctx, + } + + if err := filter(ctx, new(big.Int).SetUint64(i.srcChainID), i, filterOpts); err != nil { + return errors.Wrap(err, "filter") + } + + i.latestIndexedBlockNumber = end + } + + return nil +} diff --git a/packages/eventindexer/indexer/filter_then_subscribe.go b/packages/eventindexer/indexer/filter_then_subscribe.go deleted file mode 100644 index 51afed9985..0000000000 --- a/packages/eventindexer/indexer/filter_then_subscribe.go +++ /dev/null @@ -1,115 +0,0 @@ -package indexer - -import ( - "context" - "fmt" - "math/big" - - "log/slog" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/pkg/errors" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" -) - -func (indxr *Indexer) filterThenSubscribe( - ctx context.Context, - filter FilterFunc, -) error { - chainID, err := indxr.ethClient.ChainID(ctx) - if err != nil { - return errors.Wrap(err, "indxr.ethClient.ChainID()") - } - - if indxr.watchMode == Subscribe { - return indxr.subscribe(ctx, chainID) - } - - if err := indxr.setInitialIndexingBlockByMode(ctx, indxr.syncMode, chainID); err != nil { - return errors.Wrap(err, "indxr.setInitialIndexingBlockByMode") - } - - header, err := indxr.ethClient.HeaderByNumber(ctx, nil) - if err != nil { - return errors.Wrap(err, "indxr.ethClient.HeaderByNumber") - } - - if indxr.processingBlockHeight == header.Number.Uint64() { - slog.Info("indexing caught up subscribing to new incoming events", "chainID", chainID.Uint64()) - return indxr.subscribe(ctx, chainID) - } - - slog.Info("getting batch of events", - "chainID", chainID.Uint64(), - "startBlock", indxr.processingBlockHeight, - "endBlock", header.Number.Int64(), - "batchSize", indxr.blockBatchSize, - ) - - for i := indxr.processingBlockHeight; i < header.Number.Uint64(); i += indxr.blockBatchSize { - end := indxr.processingBlockHeight + indxr.blockBatchSize - // if the end of the batch is greater than the latest block number, set end - // to the latest block number - if end > header.Number.Uint64() { - end = header.Number.Uint64() - } - - // filter exclusive of the end block. - // we use "end" as the next starting point of the batch, and - // process up to end - 1 for this batch. - filterEnd := end - 1 - - fmt.Printf("block batch from %v to %v", i, filterEnd) - fmt.Println() - - filterOpts := &bind.FilterOpts{ - Start: indxr.processingBlockHeight, - End: &filterEnd, - Context: ctx, - } - - if err := filter(ctx, chainID, indxr, filterOpts); err != nil { - return errors.Wrap(err, "filter") - } - - header, err := indxr.ethClient.HeaderByNumber(ctx, big.NewInt(int64(end))) - if err != nil { - return errors.Wrap(err, "indxr.ethClient.HeaderByNumber") - } - - slog.Info("setting last processed block", "height", end, "hash", header.Hash().Hex()) - - if err := indxr.processedBlockRepo.Save(eventindexer.SaveProcessedBlockOpts{ - Height: uint64(end), - Hash: header.Hash(), - ChainID: chainID, - }); err != nil { - return errors.Wrap(err, "indxr.blockRepo.Save") - } - - eventindexer.BlocksProcessed.Inc() - - indxr.processingBlockHeight = uint64(end) - } - - slog.Info( - "fully caught up, checking blockNumber to see if advanced", - "chainID", chainID.Uint64(), - ) - - latestBlock, err := indxr.ethClient.HeaderByNumber(ctx, nil) - if err != nil { - return errors.Wrap(err, "indxr.ethclient.HeaderByNumber") - } - - if indxr.processingBlockHeight < latestBlock.Number.Uint64() { - return indxr.filterThenSubscribe(ctx, filter) - } - - // we are caught up and specified not to subscribe, we can return now - if indxr.watchMode == Filter { - return nil - } - - return indxr.subscribe(ctx, chainID) -} diff --git a/packages/eventindexer/indexer/index_nft_transfers.go b/packages/eventindexer/indexer/index_nft_transfers.go index 0a343ff586..d1ae27f6a4 100644 --- a/packages/eventindexer/indexer/index_nft_transfers.go +++ b/packages/eventindexer/indexer/index_nft_transfers.go @@ -28,17 +28,17 @@ var ( // indexNFTTransfers indexes from a given starting block to a given end block and parses all event logs // to find ERC721 or ERC1155 transfer events -func (indxr *Indexer) indexNFTTransfers( +func (i *Indexer) indexNFTTransfers( ctx context.Context, chainID *big.Int, logs []types.Log, ) error { for _, vLog := range logs { - if !indxr.isERC721Transfer(ctx, vLog) && !indxr.isERC1155Transfer(ctx, vLog) { + if !i.isERC721Transfer(ctx, vLog) && !i.isERC1155Transfer(ctx, vLog) { continue } - if err := indxr.saveNFTTransfer(ctx, chainID, vLog); err != nil { + if err := i.saveNFTTransfer(ctx, chainID, vLog); err != nil { return err } } @@ -47,7 +47,7 @@ func (indxr *Indexer) indexNFTTransfers( } // isERC1155Transfer determines whether a given log is a valid ERC1155 transfer event -func (indxr *Indexer) isERC1155Transfer(ctx context.Context, vLog types.Log) bool { +func (i *Indexer) isERC1155Transfer(ctx context.Context, vLog types.Log) bool { // malformed event if len(vLog.Topics) == 0 { return false @@ -64,7 +64,7 @@ func (indxr *Indexer) isERC1155Transfer(ctx context.Context, vLog types.Log) boo } // isERC721Transfer determines whether a given log is a valid ERC721 transfer event -func (indxr *Indexer) isERC721Transfer(ctx context.Context, vLog types.Log) bool { +func (i *Indexer) isERC721Transfer(ctx context.Context, vLog types.Log) bool { // malformed event if len(vLog.Topics) == 0 { return false @@ -87,20 +87,20 @@ func (indxr *Indexer) isERC721Transfer(ctx context.Context, vLog types.Log) bool // saveNFTTrasnfer parses the event logs and saves either an ERC721 or ERC1155 event, updating // users balances -func (indxr *Indexer) saveNFTTransfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { - if indxr.isERC721Transfer(ctx, vLog) { - return indxr.saveERC721Transfer(ctx, chainID, vLog) +func (i *Indexer) saveNFTTransfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { + if i.isERC721Transfer(ctx, vLog) { + return i.saveERC721Transfer(ctx, chainID, vLog) } - if indxr.isERC1155Transfer(ctx, vLog) { - return indxr.saveERC1155Transfer(ctx, chainID, vLog) + if i.isERC1155Transfer(ctx, vLog) { + return i.saveERC1155Transfer(ctx, chainID, vLog) } return errors.New("nftTransferVlog not ERC721 or ERC1155") } // saveERC721Transfer updates the user's balances on the from and to of a ERC721 transfer event -func (indxr *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { +func (i *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[1].Bytes()[12:])) to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) @@ -117,7 +117,7 @@ func (indxr *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, // increment To address's balance - _, err := indxr.nftBalanceRepo.IncreaseBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ + _, err := i.nftBalanceRepo.IncreaseBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ ChainID: chainID.Int64(), Address: to, TokenID: tokenID, @@ -132,7 +132,7 @@ func (indxr *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, // decrement From address's balance // ignore zero address since that is usually the "mint" if from != ZeroAddress.Hex() { - _, err = indxr.nftBalanceRepo.SubtractBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ + _, err = i.nftBalanceRepo.SubtractBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ ChainID: chainID.Int64(), Address: from, TokenID: tokenID, @@ -150,7 +150,7 @@ func (indxr *Indexer) saveERC721Transfer(ctx context.Context, chainID *big.Int, // saveERC1155Transfer parses and saves either a TransferSingle or TransferBatch event to // the database and updates the user's balances -func (indxr *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { +func (i *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, vLog types.Log) error { from := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[2].Bytes()[12:])) to := fmt.Sprintf("0x%v", common.Bytes2Hex(vLog.Topics[3].Bytes()[12:])) @@ -200,7 +200,7 @@ func (indxr *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, // increment To address's balance for _, transfer := range transfers { - _, err = indxr.nftBalanceRepo.IncreaseBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ + _, err = i.nftBalanceRepo.IncreaseBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ ChainID: chainID.Int64(), Address: to, TokenID: transfer.ID.Int64(), @@ -214,7 +214,7 @@ func (indxr *Indexer) saveERC1155Transfer(ctx context.Context, chainID *big.Int, if from != ZeroAddress.Hex() { // decrement From address's balance - _, err = indxr.nftBalanceRepo.SubtractBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ + _, err = i.nftBalanceRepo.SubtractBalance(ctx, eventindexer.UpdateNFTBalanceOpts{ ChainID: chainID.Int64(), Address: from, TokenID: transfer.ID.Int64(), diff --git a/packages/eventindexer/indexer/index_raw_block_data.go b/packages/eventindexer/indexer/index_raw_block_data.go index 6a1cb0ea1e..4438884f07 100644 --- a/packages/eventindexer/indexer/index_raw_block_data.go +++ b/packages/eventindexer/indexer/index_raw_block_data.go @@ -11,7 +11,7 @@ import ( "golang.org/x/sync/errgroup" ) -func (indxr *Indexer) indexRawBlockData( +func (i *Indexer) indexRawBlockData( ctx context.Context, chainID *big.Int, start uint64, @@ -23,43 +23,39 @@ func (indxr *Indexer) indexRawBlockData( slog.Info("indexRawBlockData", "start", start, "end", end) // only index block/transaction data on L2 - if indxr.layer == Layer2 { - for i := start; i < end; i++ { - id := i + if i.layer == Layer2 { + for j := start; j < end; j++ { + id := j wg.Go(func() error { slog.Info("processing block data", "blockNum", id) - block, err := indxr.ethClient.BlockByNumber(ctx, big.NewInt(int64(id))) + block, err := i.ethClient.BlockByNumber(ctx, big.NewInt(int64(id))) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") - } - - if err := indxr.blockRepo.Save(ctx, block, chainID); err != nil { - return errors.Wrap(err, "indxr.blockRepo.Save") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } txs := block.Transactions() for _, tx := range txs { slog.Info("transaction found", "hash", tx.Hash()) - receipt, err := indxr.ethClient.TransactionReceipt(ctx, tx.Hash()) + receipt, err := i.ethClient.TransactionReceipt(ctx, tx.Hash()) if err != nil { return err } - sender, err := indxr.ethClient.TransactionSender(ctx, tx, block.Hash(), receipt.TransactionIndex) + sender, err := i.ethClient.TransactionSender(ctx, tx, block.Hash(), receipt.TransactionIndex) if err != nil { return err } - if err := indxr.accountRepo.Save(ctx, sender, time.Unix(int64(block.Time()), 0)); err != nil { + if err := i.accountRepo.Save(ctx, sender, time.Unix(int64(block.Time()), 0)); err != nil { return err } - if err := indxr.txRepo.Save(ctx, + if err := i.txRepo.Save(ctx, tx, sender, block.Number(), @@ -81,15 +77,15 @@ func (indxr *Indexer) indexRawBlockData( ToBlock: big.NewInt(int64(end)), } - logs, err := indxr.ethClient.FilterLogs(ctx, query) + logs, err := i.ethClient.FilterLogs(ctx, query) if err != nil { return err } // index NFT transfers - if indxr.indexNfts { + if i.indexNfts { wg.Go(func() error { - if err := indxr.indexNFTTransfers(ctx, chainID, logs); err != nil { + if err := i.indexNFTTransfers(ctx, chainID, logs); err != nil { return errors.Wrap(err, "svc.indexNFTTransfers") } diff --git a/packages/eventindexer/indexer/indexer.go b/packages/eventindexer/indexer/indexer.go index 7269d6a75a..ba2f740afe 100644 --- a/packages/eventindexer/indexer/indexer.go +++ b/packages/eventindexer/indexer/indexer.go @@ -27,15 +27,6 @@ var ( Layer2 = "l2" ) -type WatchMode string - -var ( - Filter WatchMode = "filter" - Subscribe WatchMode = "subscribe" - FilterAndSubscribe WatchMode = "filter-and-subscribe" - WatchModes = []WatchMode{Filter, Subscribe, FilterAndSubscribe} -) - type SyncMode string var ( @@ -45,17 +36,16 @@ var ( ) type Indexer struct { - accountRepo eventindexer.AccountRepository - blockRepo eventindexer.BlockRepository - eventRepo eventindexer.EventRepository - processedBlockRepo eventindexer.ProcessedBlockRepository - statRepo eventindexer.StatRepository - nftBalanceRepo eventindexer.NFTBalanceRepository - txRepo eventindexer.TransactionRepository + accountRepo eventindexer.AccountRepository + eventRepo eventindexer.EventRepository + statRepo eventindexer.StatRepository + nftBalanceRepo eventindexer.NFTBalanceRepository + txRepo eventindexer.TransactionRepository - ethClient *ethclient.Client + ethClient *ethclient.Client + srcChainID uint64 - processingBlockHeight uint64 + latestIndexedBlockNumber uint64 blockBatchSize uint64 subscriptionBackoff time.Duration @@ -71,44 +61,56 @@ type Indexer struct { wg *sync.WaitGroup ctx context.Context - watchMode WatchMode - syncMode SyncMode + syncMode SyncMode blockSaveMutex *sync.Mutex } -func (indxr *Indexer) Start() error { - indxr.ctx = context.Background() +func (i *Indexer) Start() error { + i.ctx = context.Background() - indxr.wg.Add(1) + if err := i.setInitialIndexingBlockByMode(i.ctx, i.syncMode); err != nil { + return errors.Wrap(err, "i.setInitialIndexingBlockByMode") + } - go func() { - defer func() { - indxr.wg.Done() - }() + i.wg.Add(1) - if err := indxr.filterThenSubscribe( - indxr.ctx, - filterFunc, - ); err != nil { - slog.Error("error filtering and subscribing", "err", err.Error()) - } - }() + go i.eventLoop(i.ctx) return nil } -func (indxr *Indexer) Name() string { +func (i *Indexer) eventLoop(ctx context.Context) { + defer i.wg.Done() + + t := time.NewTicker(10 * time.Second) + + defer t.Stop() + + for { + select { + case <-ctx.Done(): + slog.Info("event loop context done") + return + case <-t.C: + if err := i.filter(ctx, filterFunc); err != nil { + slog.Error("error filtering", "error", err) + } + } + } +} + +func (i *Indexer) Name() string { return "indexer" } -func (indxr *Indexer) InitFromCli(ctx context.Context, c *cli.Context) error { +func (i *Indexer) InitFromCli(ctx context.Context, c *cli.Context) error { cfg, err := NewConfigFromCliContext(c) if err != nil { return err } - return InitFromConfig(ctx, indxr, cfg) + return InitFromConfig(ctx, i, cfg) } // nolint: funlen @@ -128,16 +130,6 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { return err } - processedBlockRepository, err := repo.NewProcessedBlockRepository(db) - if err != nil { - return err - } - - blockRepository, err := repo.NewBlockRepository(db) - if err != nil { - return err - } - statRepository, err := repo.NewStatRepository(db) if err != nil { return err @@ -158,6 +150,11 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { return err } + chainID, err := ethClient.ChainID(ctx) + if err != nil { + return errors.Wrap(err, "i.ethClient.ChainID()") + } + var taikoL1 *taikol1.TaikoL1 if cfg.L1TaikoAddress.Hex() != ZeroAddress.Hex() { @@ -201,11 +198,11 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { i.blockSaveMutex = &sync.Mutex{} i.accountRepo = accountRepository i.eventRepo = eventRepository - i.processedBlockRepo = processedBlockRepository i.statRepo = statRepository i.nftBalanceRepo = nftBalanceRepository i.txRepo = txRepository - i.blockRepo = blockRepository + + i.srcChainID = chainID.Uint64() i.ethClient = ethClient i.taikol1 = taikoL1 @@ -217,13 +214,12 @@ func InitFromConfig(ctx context.Context, i *Indexer, cfg *Config) error { i.wg = &sync.WaitGroup{} i.syncMode = cfg.SyncMode - i.watchMode = cfg.WatchMode i.indexNfts = cfg.IndexNFTs i.layer = cfg.Layer return nil } -func (indxr *Indexer) Close(ctx context.Context) { - indxr.wg.Wait() +func (i *Indexer) Close(ctx context.Context) { + i.wg.Wait() } diff --git a/packages/eventindexer/indexer/save_block_assigned_event.go b/packages/eventindexer/indexer/save_block_assigned_event.go index 1294f0873c..09272712e3 100644 --- a/packages/eventindexer/indexer/save_block_assigned_event.go +++ b/packages/eventindexer/indexer/save_block_assigned_event.go @@ -13,7 +13,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/assignmenthook" ) -func (indxr *Indexer) saveBlockAssignedEvents( +func (i *Indexer) saveBlockAssignedEvents( ctx context.Context, chainID *big.Int, events *assignmenthook.AssignmentHookBlockAssignedIterator, @@ -26,10 +26,10 @@ func (indxr *Indexer) saveBlockAssignedEvents( for { event := events.Event - if err := indxr.saveBlockAssignedEvent(ctx, chainID, event); err != nil { + if err := i.saveBlockAssignedEvent(ctx, chainID, event); err != nil { eventindexer.BlockAssignedEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveBlockAssignedEvent") + return errors.Wrap(err, "i.saveBlockAssignedEvent") } if !events.Next() { @@ -38,7 +38,7 @@ func (indxr *Indexer) saveBlockAssignedEvents( } } -func (indxr *Indexer) saveBlockAssignedEvent( +func (i *Indexer) saveBlockAssignedEvent( ctx context.Context, chainID *big.Int, event *assignmenthook.AssignmentHookBlockAssigned, @@ -52,19 +52,19 @@ func (indxr *Indexer) saveBlockAssignedEvent( assignedProver := event.AssignedProver.Hex() - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - proverReward, err := indxr.updateAverageProverReward(ctx, event) + proverReward, err := i.updateAverageProverReward(ctx, event) if err != nil { - return errors.Wrap(err, "indxr.updateAverageProverReward") + return errors.Wrap(err, "i.updateAverageProverReward") } feeToken := event.Assignment.FeeToken.Hex() - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ Name: eventindexer.EventNameBlockAssigned, Data: string(marshaled), ChainID: chainID, @@ -75,9 +75,10 @@ func (indxr *Indexer) saveBlockAssignedEvent( Amount: proverReward, ProofReward: proverReward, FeeTokenAddress: &feeToken, + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.BlockProposedEventsProcessed.Inc() @@ -85,15 +86,15 @@ func (indxr *Indexer) saveBlockAssignedEvent( return nil } -func (indxr *Indexer) updateAverageProverReward( +func (i *Indexer) updateAverageProverReward( ctx context.Context, event *assignmenthook.AssignmentHookBlockAssigned, ) (*big.Int, error) { feeToken := event.Assignment.FeeToken.Hex() - stat, err := indxr.statRepo.Find(ctx, eventindexer.StatTypeProofReward, &feeToken) + stat, err := i.statRepo.Find(ctx, eventindexer.StatTypeProofReward, &feeToken) if err != nil { - return nil, errors.Wrap(err, "indxr.statRepo.Find") + return nil, errors.Wrap(err, "i.statRepo.Find") } avg, ok := new(big.Int).SetString(stat.AverageProofReward, 10) @@ -134,13 +135,13 @@ func (indxr *Indexer) updateAverageProverReward( newAverageProofReward.String(), ) - _, err = indxr.statRepo.Save(ctx, eventindexer.SaveStatOpts{ + _, err = i.statRepo.Save(ctx, eventindexer.SaveStatOpts{ ProofReward: newAverageProofReward, StatType: eventindexer.StatTypeProofReward, FeeTokenAddress: &feeToken, }) if err != nil { - return nil, errors.Wrap(err, "indxr.statRepo.Save") + return nil, errors.Wrap(err, "i.statRepo.Save") } return big.NewInt(0), nil diff --git a/packages/eventindexer/indexer/save_block_proposed_event.go b/packages/eventindexer/indexer/save_block_proposed_event.go index 1f41c6656a..030a01ddc0 100644 --- a/packages/eventindexer/indexer/save_block_proposed_event.go +++ b/packages/eventindexer/indexer/save_block_proposed_event.go @@ -14,7 +14,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" ) -func (indxr *Indexer) saveBlockProposedEvents( +func (i *Indexer) saveBlockProposedEvents( ctx context.Context, chainID *big.Int, events *taikol1.TaikoL1BlockProposedIterator, @@ -27,24 +27,20 @@ func (indxr *Indexer) saveBlockProposedEvents( for { event := events.Event - if err := indxr.detectAndHandleReorg(ctx, eventindexer.EventNameBlockProposed, event.BlockId.Int64()); err != nil { - return errors.Wrap(err, "indxr.detectAndHandleReorg") - } - - tx, _, err := indxr.ethClient.TransactionByHash(ctx, event.Raw.TxHash) + tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) if err != nil { - return errors.Wrap(err, "indxr.ethClient.TransactionByHash") + return errors.Wrap(err, "i.ethClient.TransactionByHash") } - sender, err := indxr.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) + sender, err := i.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) if err != nil { - return errors.Wrap(err, "indxr.ethClient.TransactionSender") + return errors.Wrap(err, "i.ethClient.TransactionSender") } - if err := indxr.saveBlockProposedEvent(ctx, chainID, event, sender); err != nil { + if err := i.saveBlockProposedEvent(ctx, chainID, event, sender); err != nil { eventindexer.BlockProposedEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveBlockProposedEvent") + return errors.Wrap(err, "i.saveBlockProposedEvent") } if !events.Next() { @@ -53,7 +49,7 @@ func (indxr *Indexer) saveBlockProposedEvents( } } -func (indxr *Indexer) saveBlockProposedEvent( +func (i *Indexer) saveBlockProposedEvent( ctx context.Context, chainID *big.Int, event *taikol1.TaikoL1BlockProposed, @@ -70,12 +66,12 @@ func (indxr *Indexer) saveBlockProposedEvent( assignedProver := event.AssignedProver.Hex() - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ Name: eventindexer.EventNameBlockProposed, Data: string(marshaled), ChainID: chainID, @@ -84,9 +80,10 @@ func (indxr *Indexer) saveBlockProposedEvent( BlockID: &blockID, AssignedProver: &assignedProver, TransactedAt: time.Unix(int64(block.Time()), 0).UTC(), + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.BlockProposedEventsProcessed.Inc() diff --git a/packages/eventindexer/indexer/save_block_verified_event.go b/packages/eventindexer/indexer/save_block_verified_event.go index b5efb76303..835794f484 100644 --- a/packages/eventindexer/indexer/save_block_verified_event.go +++ b/packages/eventindexer/indexer/save_block_verified_event.go @@ -13,7 +13,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" ) -func (indxr *Indexer) saveBlockVerifiedEvents( +func (i *Indexer) saveBlockVerifiedEvents( ctx context.Context, chainID *big.Int, events *taikol1.TaikoL1BlockVerifiedIterator, @@ -26,14 +26,10 @@ func (indxr *Indexer) saveBlockVerifiedEvents( for { event := events.Event - if err := indxr.detectAndHandleReorg(ctx, eventindexer.EventNameBlockVerified, event.BlockId.Int64()); err != nil { - return errors.Wrap(err, "indxr.detectAndHandleReorg") - } - - if err := indxr.saveBlockVerifiedEvent(ctx, chainID, event); err != nil { + if err := i.saveBlockVerifiedEvent(ctx, chainID, event); err != nil { eventindexer.BlockVerifiedEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveBlockVerifiedEvent") + return errors.Wrap(err, "i.saveBlockVerifiedEvent") } if !events.Next() { @@ -42,7 +38,7 @@ func (indxr *Indexer) saveBlockVerifiedEvents( } } -func (indxr *Indexer) saveBlockVerifiedEvent( +func (i *Indexer) saveBlockVerifiedEvent( ctx context.Context, chainID *big.Int, event *taikol1.TaikoL1BlockVerified, @@ -56,22 +52,23 @@ func (indxr *Indexer) saveBlockVerifiedEvent( blockID := event.BlockId.Int64() - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameBlockVerified, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameBlockVerified, - Address: "", - BlockID: &blockID, - TransactedAt: time.Unix(int64(block.Time()), 0), + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameBlockVerified, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameBlockVerified, + Address: "", + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.BlockVerifiedEventsProcessed.Inc() diff --git a/packages/eventindexer/indexer/save_liquidity_added_event.go b/packages/eventindexer/indexer/save_liquidity_added_event.go index 25a30869f3..e3647b796a 100644 --- a/packages/eventindexer/indexer/save_liquidity_added_event.go +++ b/packages/eventindexer/indexer/save_liquidity_added_event.go @@ -18,7 +18,7 @@ var ( minLiquidityAddedAmount = big.NewInt(100000000000000000) ) -func (indxr *Indexer) saveLiquidityAddedEvents( +func (i *Indexer) saveLiquidityAddedEvents( ctx context.Context, chainID *big.Int, events *swap.SwapMintIterator, @@ -31,10 +31,10 @@ func (indxr *Indexer) saveLiquidityAddedEvents( for { event := events.Event - if err := indxr.saveLiquidityAddedEvent(ctx, chainID, event); err != nil { + if err := i.saveLiquidityAddedEvent(ctx, chainID, event); err != nil { eventindexer.LiquidityAddedEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveSwapEvent") + return errors.Wrap(err, "i.saveSwapEvent") } if !events.Next() { @@ -43,12 +43,12 @@ func (indxr *Indexer) saveLiquidityAddedEvents( } } -func (indxr *Indexer) saveLiquidityAddedEvent( +func (i *Indexer) saveLiquidityAddedEvent( ctx context.Context, chainID *big.Int, event *swap.SwapMint, ) error { - tx, _, err := indxr.ethClient.TransactionByHash(ctx, event.Raw.TxHash) + tx, _, err := i.ethClient.TransactionByHash(ctx, event.Raw.TxHash) if err != nil { return err } @@ -79,21 +79,22 @@ func (indxr *Indexer) saveLiquidityAddedEvent( return errors.Wrap(err, "json.Marshal(event)") } - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameMint, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameMint, - Address: from.Hex(), - TransactedAt: time.Unix(int64(block.Time()), 0), + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameMint, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameMint, + Address: from.Hex(), + TransactedAt: time.Unix(int64(block.Time()), 0), + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.LiquidityAddedEventsProcessed.Inc() diff --git a/packages/eventindexer/indexer/save_message_sent_event.go b/packages/eventindexer/indexer/save_message_sent_event.go index 5a0adae50e..84fc6f6260 100644 --- a/packages/eventindexer/indexer/save_message_sent_event.go +++ b/packages/eventindexer/indexer/save_message_sent_event.go @@ -13,7 +13,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/bridge" ) -func (indxr *Indexer) saveMessageSentEvents( +func (i *Indexer) saveMessageSentEvents( ctx context.Context, chainID *big.Int, events *bridge.BridgeMessageSentIterator, @@ -28,10 +28,10 @@ func (indxr *Indexer) saveMessageSentEvents( slog.Info("new messageSent event", "owner", event.Message.From.Hex()) - if err := indxr.saveMessageSentEvent(ctx, chainID, event); err != nil { + if err := i.saveMessageSentEvent(ctx, chainID, event); err != nil { eventindexer.MessageSentEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveMessageSentEvent") + return errors.Wrap(err, "i.saveMessageSentEvent") } if !events.Next() { @@ -40,7 +40,7 @@ func (indxr *Indexer) saveMessageSentEvents( } } -func (indxr *Indexer) saveMessageSentEvent( +func (i *Indexer) saveMessageSentEvent( ctx context.Context, chainID *big.Int, event *bridge.BridgeMessageSent, @@ -50,21 +50,22 @@ func (indxr *Indexer) saveMessageSentEvent( return errors.Wrap(err, "json.Marshal(event)") } - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameMessageSent, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameMessageSent, - Address: event.Message.From.Hex(), - TransactedAt: time.Unix(int64(block.Time()), 0), + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameMessageSent, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameMessageSent, + Address: event.Message.From.Hex(), + TransactedAt: time.Unix(int64(block.Time()), 0), + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.MessageSentEventsProcessed.Inc() diff --git a/packages/eventindexer/indexer/save_swap_event.go b/packages/eventindexer/indexer/save_swap_event.go index 2bddb63ae0..de591a58dd 100644 --- a/packages/eventindexer/indexer/save_swap_event.go +++ b/packages/eventindexer/indexer/save_swap_event.go @@ -19,7 +19,7 @@ var ( minTradeAmount = big.NewInt(10000000000000000) ) -func (indxr *Indexer) saveSwapEvents( +func (i *Indexer) saveSwapEvents( ctx context.Context, chainID *big.Int, events *swap.SwapSwapIterator, @@ -32,10 +32,10 @@ func (indxr *Indexer) saveSwapEvents( for { event := events.Event - if err := indxr.saveSwapEvent(ctx, chainID, event); err != nil { + if err := i.saveSwapEvent(ctx, chainID, event); err != nil { eventindexer.SwapEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveSwapEvent") + return errors.Wrap(err, "i.saveSwapEvent") } if !events.Next() { @@ -44,7 +44,7 @@ func (indxr *Indexer) saveSwapEvents( } } -func (indxr *Indexer) saveSwapEvent( +func (i *Indexer) saveSwapEvent( ctx context.Context, chainID *big.Int, event *swap.SwapSwap, @@ -69,21 +69,22 @@ func (indxr *Indexer) saveSwapEvent( return errors.Wrap(err, "json.Marshal(event)") } - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameSwap, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameSwap, - Address: fmt.Sprintf("0x%v", common.Bytes2Hex(event.Raw.Topics[2].Bytes()[12:])), - TransactedAt: time.Unix(int64(block.Time()), 0), + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameSwap, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameSwap, + Address: fmt.Sprintf("0x%v", common.Bytes2Hex(event.Raw.Topics[2].Bytes()[12:])), + TransactedAt: time.Unix(int64(block.Time()), 0), + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.SwapEventsProcessed.Inc() diff --git a/packages/eventindexer/indexer/save_transition_contested_event.go b/packages/eventindexer/indexer/save_transition_contested_event.go index c622d9be81..fe2499e564 100644 --- a/packages/eventindexer/indexer/save_transition_contested_event.go +++ b/packages/eventindexer/indexer/save_transition_contested_event.go @@ -13,7 +13,7 @@ import ( "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" ) -func (indxr *Indexer) saveTransitionContestedEvents( +func (i *Indexer) saveTransitionContestedEvents( ctx context.Context, chainID *big.Int, events *taikol1.TaikoL1TransitionContestedIterator, @@ -26,18 +26,10 @@ func (indxr *Indexer) saveTransitionContestedEvents( for { event := events.Event - if err := indxr.detectAndHandleReorg( - ctx, - eventindexer.EventNameTransitionContested, - event.BlockId.Int64(), - ); err != nil { - return errors.Wrap(err, "indxr.detectAndHandleReorg") - } - - if err := indxr.saveTransitionContestedEvent(ctx, chainID, event); err != nil { + if err := i.saveTransitionContestedEvent(ctx, chainID, event); err != nil { eventindexer.TransitionContestedEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveBlockProvenEvent") + return errors.Wrap(err, "i.saveBlockProvenEvent") } if !events.Next() { @@ -46,7 +38,7 @@ func (indxr *Indexer) saveTransitionContestedEvents( } } -func (indxr *Indexer) saveTransitionContestedEvent( +func (i *Indexer) saveTransitionContestedEvent( ctx context.Context, chainID *big.Int, event *taikol1.TaikoL1TransitionContested, @@ -65,23 +57,24 @@ func (indxr *Indexer) saveTransitionContestedEvent( blockID := event.BlockId.Int64() - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameTransitionContested, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameTransitionContested, - Address: event.Contester.Hex(), - BlockID: &blockID, - TransactedAt: time.Unix(int64(block.Time()), 0), - Tier: &event.Tier, + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameTransitionContested, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameTransitionContested, + Address: event.Contester.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + Tier: &event.Tier, + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.TransitionContestedEventsProcessed.Inc() diff --git a/packages/eventindexer/indexer/save_transition_proved_event.go b/packages/eventindexer/indexer/save_transition_proved_event.go index 787c1e9270..45221844e6 100644 --- a/packages/eventindexer/indexer/save_transition_proved_event.go +++ b/packages/eventindexer/indexer/save_transition_proved_event.go @@ -19,7 +19,7 @@ var ( oracleProver = common.HexToAddress("0x0000000000000000000000000000000000000000") ) -func (indxr *Indexer) saveTransitionProvedEvents( +func (i *Indexer) saveTransitionProvedEvents( ctx context.Context, chainID *big.Int, events *taikol1.TaikoL1TransitionProvedIterator, @@ -32,14 +32,10 @@ func (indxr *Indexer) saveTransitionProvedEvents( for { event := events.Event - if err := indxr.detectAndHandleReorg(ctx, eventindexer.EventNameTransitionProved, event.BlockId.Int64()); err != nil { - return errors.Wrap(err, "indxr.detectAndHandleReorg") - } - - if err := indxr.saveTransitionProvedEvent(ctx, chainID, event); err != nil { + if err := i.saveTransitionProvedEvent(ctx, chainID, event); err != nil { eventindexer.TransitionProvedEventsProcessedError.Inc() - return errors.Wrap(err, "indxr.saveBlockProvenEvent") + return errors.Wrap(err, "i.saveBlockProvenEvent") } if !events.Next() { @@ -48,7 +44,7 @@ func (indxr *Indexer) saveTransitionProvedEvents( } } -func (indxr *Indexer) saveTransitionProvedEvent( +func (i *Indexer) saveTransitionProvedEvent( ctx context.Context, chainID *big.Int, event *taikol1.TaikoL1TransitionProved, @@ -64,38 +60,39 @@ func (indxr *Indexer) saveTransitionProvedEvent( blockID := event.BlockId.Int64() - block, err := indxr.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) + block, err := i.ethClient.BlockByNumber(ctx, new(big.Int).SetUint64(event.Raw.BlockNumber)) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByNumber") + return errors.Wrap(err, "i.ethClient.BlockByNumber") } - _, err = indxr.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ - Name: eventindexer.EventNameTransitionProved, - Data: string(marshaled), - ChainID: chainID, - Event: eventindexer.EventNameTransitionProved, - Address: event.Prover.Hex(), - BlockID: &blockID, - TransactedAt: time.Unix(int64(block.Time()), 0), - Tier: &event.Tier, + _, err = i.eventRepo.Save(ctx, eventindexer.SaveEventOpts{ + Name: eventindexer.EventNameTransitionProved, + Data: string(marshaled), + ChainID: chainID, + Event: eventindexer.EventNameTransitionProved, + Address: event.Prover.Hex(), + BlockID: &blockID, + TransactedAt: time.Unix(int64(block.Time()), 0), + Tier: &event.Tier, + EmittedBlockID: event.Raw.BlockNumber, }) if err != nil { - return errors.Wrap(err, "indxr.eventRepo.Save") + return errors.Wrap(err, "i.eventRepo.Save") } eventindexer.TransitionProvedEventsProcessed.Inc() if event.Prover.Hex() != systemProver.Hex() && event.Prover.Hex() != oracleProver.Hex() { - if err := indxr.updateAverageProofTime(ctx, event); err != nil { - return errors.Wrap(err, "indxr.updateAverageProofTime") + if err := i.updateAverageProofTime(ctx, event); err != nil { + return errors.Wrap(err, "i.updateAverageProofTime") } } return nil } -func (indxr *Indexer) updateAverageProofTime(ctx context.Context, event *taikol1.TaikoL1TransitionProved) error { - block, err := indxr.taikol1.GetBlock(nil, event.BlockId.Uint64()) +func (i *Indexer) updateAverageProofTime(ctx context.Context, event *taikol1.TaikoL1TransitionProved) error { + block, err := i.taikol1.GetBlock(nil, event.BlockId.Uint64()) // will be unable to GetBlock for older blocks, just return nil, we dont // care about averageProofTime that much to be honest for older blocks if err != nil { @@ -104,14 +101,14 @@ func (indxr *Indexer) updateAverageProofTime(ctx context.Context, event *taikol1 return nil } - eventBlock, err := indxr.ethClient.BlockByHash(ctx, event.Raw.BlockHash) + eventBlock, err := i.ethClient.BlockByHash(ctx, event.Raw.BlockHash) if err != nil { - return errors.Wrap(err, "indxr.ethClient.BlockByHash") + return errors.Wrap(err, "i.ethClient.BlockByHash") } - stat, err := indxr.statRepo.Find(ctx, eventindexer.StatTypeProofTime, nil) + stat, err := i.statRepo.Find(ctx, eventindexer.StatTypeProofTime, nil) if err != nil { - return errors.Wrap(err, "indxr.statRepo.Find") + return errors.Wrap(err, "i.statRepo.Find") } proposedAt := block.Blk.ProposedAt @@ -148,12 +145,12 @@ func (indxr *Indexer) updateAverageProofTime(ctx context.Context, event *taikol1 newAverageProofTime.String(), ) - _, err = indxr.statRepo.Save(ctx, eventindexer.SaveStatOpts{ + _, err = i.statRepo.Save(ctx, eventindexer.SaveStatOpts{ ProofTime: newAverageProofTime, StatType: eventindexer.StatTypeProofTime, }) if err != nil { - return errors.Wrap(err, "indxr.statRepo.Save") + return errors.Wrap(err, "i.statRepo.Save") } return nil diff --git a/packages/eventindexer/indexer/set_initial_processing_block_height.go b/packages/eventindexer/indexer/set_initial_processing_block_height.go index 7c02da429b..6aecd7598e 100644 --- a/packages/eventindexer/indexer/set_initial_processing_block_height.go +++ b/packages/eventindexer/indexer/set_initial_processing_block_height.go @@ -2,24 +2,21 @@ package indexer import ( "context" - "log/slog" - "math/big" "github.com/pkg/errors" "github.com/taikoxyz/taiko-mono/packages/eventindexer" ) -func (indxr *Indexer) setInitialIndexingBlockByMode( +func (i *Indexer) setInitialIndexingBlockByMode( ctx context.Context, mode SyncMode, - chainID *big.Int, ) error { var startingBlock uint64 = 0 // only check stateVars on L1, otherwise sync from 0 - if indxr.taikol1 != nil { - stateVars, err := indxr.taikol1.GetStateVariables(nil) + if i.taikol1 != nil { + stateVars, err := i.taikol1.GetStateVariables(nil) if err != nil { - return errors.Wrap(err, "indxr.taikoL1.GetStateVariables") + return errors.Wrap(err, "i.taikoL1.GetStateVariables") } startingBlock = stateVars.A.GenesisHeight @@ -27,26 +24,24 @@ func (indxr *Indexer) setInitialIndexingBlockByMode( switch mode { case Sync: - latestProcessedBlock, err := indxr.processedBlockRepo.GetLatestBlockProcessed( - chainID, + // get most recently processed block height from the DB + latest, err := i.eventRepo.FindLatestBlockID( + i.srcChainID, ) if err != nil { - return errors.Wrap(err, "indxr.processedBlockRepo.GetLatestBlock()") + return errors.Wrap(err, "svc.eventRepo.FindLatestBlockID") } - if latestProcessedBlock.Height != 0 { - startingBlock = latestProcessedBlock.Height + if latest != 0 { + startingBlock = latest - 1 } - slog.Info("set processingBlockHeight", "startingBlock", startingBlock) - - indxr.processingBlockHeight = startingBlock - - return nil case Resync: - indxr.processingBlockHeight = startingBlock - return nil default: return eventindexer.ErrInvalidMode } + + i.latestIndexedBlockNumber = startingBlock + + return nil } diff --git a/packages/eventindexer/indexer/subscribe.go b/packages/eventindexer/indexer/subscribe.go deleted file mode 100644 index 06cca7d181..0000000000 --- a/packages/eventindexer/indexer/subscribe.go +++ /dev/null @@ -1,533 +0,0 @@ -package indexer - -import ( - "context" - "math/big" - - "log/slog" - - "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" - "github.com/labstack/gommon/log" - "github.com/pkg/errors" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/assignmenthook" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/bridge" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/swap" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/contracts/taikol1" -) - -// subscribe subscribes to latest events -func (indxr *Indexer) subscribe(ctx context.Context, chainID *big.Int) error { - slog.Info("subscribing to new events") - - errChan := make(chan error) - - if indxr.taikol1 != nil { - go indxr.subscribeTransitionProved(ctx, chainID, errChan) - go indxr.subscribeTransitionContested(ctx, chainID, errChan) - go indxr.subscribeBlockProposed(ctx, chainID, errChan) - go indxr.subscribeBlockVerified(ctx, chainID, errChan) - } - - if indxr.bridge != nil { - go indxr.subscribeMessageSent(ctx, chainID, errChan) - } - - if indxr.swaps != nil { - for _, swap := range indxr.swaps { - go indxr.subscribeSwap(ctx, swap, chainID, errChan) - go indxr.subscribeLiquidityAdded(ctx, swap, chainID, errChan) - } - } - - if indxr.assignmentHook != nil { - go indxr.subscribeBlockAssigned(ctx, chainID, errChan) - } - - go indxr.subscribeRawBlockData(ctx, chainID, errChan) - - // nolint: gosimple - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return nil - case err := <-errChan: - eventindexer.ErrorsEncounteredDuringSubscription.Inc() - - return errors.Wrap(err, "errChan") - } - } -} - -func (indxr *Indexer) subscribeRawBlockData( - ctx context.Context, - chainID *big.Int, - errChan chan error, -) { - headers := make(chan *types.Header) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - slog.Error("indxr.SubscribeNewHead", "error", err) - } - - slog.Info("resubscribing to NewHead events for block data") - - return indxr.ethClient.SubscribeNewHead(ctx, headers) - }) - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case header := <-headers: - slog.Info("new header", "header", header.Number) - - go func() { - if err := indxr.indexRawBlockData(ctx, chainID, header.Number.Uint64(), header.Number.Uint64()+1); err != nil { - slog.Error("indxr.indexRawBlockData", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeTransitionProved(ctx context.Context, chainID *big.Int, errChan chan error) { - sink := make(chan *taikol1.TaikoL1TransitionProved) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - log.Error("indxr.taikoL1.WatchTransitionProved", "error", err) - } - - log.Info("resubscribing to TransitionProved events") - - return indxr.taikol1.WatchTransitionProved(&bind.WatchOpts{ - Context: ctx, - }, sink, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - log.Info("transitionProvenEvent from subscription for prover", - "prover", event.Prover.Hex(), - "blockId", event.BlockId.String(), - ) - - if err := indxr.saveTransitionProvedEvent(ctx, chainID, event); err != nil { - eventindexer.TransitionProvedEventsProcessedError.Inc() - - log.Error("indxr.subscribe, indxr.saveTransitionProvedEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeTransitionContested(ctx context.Context, chainID *big.Int, errChan chan error) { - sink := make(chan *taikol1.TaikoL1TransitionContested) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - log.Error("indxr.taikoL1.WatchTransitionContested", "error", err) - } - - log.Info("resubscribing to TransitionContested events") - - return indxr.taikol1.WatchTransitionContested(&bind.WatchOpts{ - Context: ctx, - }, sink, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - log.Info("transitionContestedEvent from subscription for prover", - "contester", event.Contester.Hex(), - "blockId", event.BlockId.String(), - "contestBond", event.ContestBond.String(), - "tier", event.Tier, - ) - - if err := indxr.saveTransitionContestedEvent(ctx, chainID, event); err != nil { - eventindexer.TransitionContestedEventsProcessedError.Inc() - - log.Error("indxr.subscribe, indxr.saveTransitionContestedEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeBlockProposed(ctx context.Context, chainID *big.Int, errChan chan error) { - sink := make(chan *taikol1.TaikoL1BlockProposed) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - log.Error("indxr.taikoL1.WatchBlockProposed", "error", err) - } - - log.Info("resubscribing to BlockProposed events") - - return indxr.taikol1.WatchBlockProposed(&bind.WatchOpts{ - Context: ctx, - }, sink, nil, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - slog.Info("blockProposedEvent from subscription") - - tx, _, err := indxr.ethClient.TransactionByHash(ctx, event.Raw.TxHash) - if err != nil { - slog.Error("indxr.ethClient.TransactionByHash", "error", err) - - return - } - - sender, err := indxr.ethClient.TransactionSender(ctx, tx, event.Raw.BlockHash, event.Raw.TxIndex) - if err != nil { - slog.Error("indxr.ethClient.TransactionSender", "error", err) - - return - } - - slog.Info("blockProposed", "proposer", sender.Hex(), "blockID", event.BlockId.Uint64()) - - if err := indxr.saveBlockProposedEvent(ctx, chainID, event, sender); err != nil { - eventindexer.BlockProposedEventsProcessedError.Inc() - - slog.Error("indxr.subscribe, indxr.saveBlockProposedEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeBlockVerified(ctx context.Context, chainID *big.Int, errChan chan error) { - sink := make(chan *taikol1.TaikoL1BlockVerified) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - slog.Error("indxr.taikoL1.WatchBlockVerified", "error", err) - } - - slog.Info("resubscribing to BlockVerified events") - - return indxr.taikol1.WatchBlockVerified(&bind.WatchOpts{ - Context: ctx, - }, sink, nil, nil, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - slog.Info("blockVerifiedEvent from subscription", "prover", event.Prover.Hex()) - - if err := indxr.saveBlockVerifiedEvent(ctx, chainID, event); err != nil { - eventindexer.BlockVerifiedEventsProcessedError.Inc() - slog.Error("indxr.subscribe, indxr.saveBlockVerifiedEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeMessageSent(ctx context.Context, chainID *big.Int, errChan chan error) { - sink := make(chan *bridge.BridgeMessageSent) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - slog.Error("indxr.taikoL1.WatchMessageSent", "error", err) - } - - slog.Info("resubscribing to MessageSent events") - - return indxr.bridge.WatchMessageSent(&bind.WatchOpts{ - Context: ctx, - }, sink, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - slog.Info("messageSentEvent", "owner", event.Message.From.Hex()) - - if err := indxr.saveMessageSentEvent(ctx, chainID, event); err != nil { - eventindexer.MessageSentEventsProcessedError.Inc() - - slog.Error("indxr.subscribe, indxr.saveMessageSentEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeSwap(ctx context.Context, s *swap.Swap, chainID *big.Int, errChan chan error) { - sink := make(chan *swap.SwapSwap) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - slog.Error("s.WatchSwap", "error", err) - } - - slog.Info("resubscribing to Swap events") - - return s.WatchSwap(&bind.WatchOpts{ - Context: ctx, - }, sink, nil, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - if err := indxr.saveSwapEvent(ctx, chainID, event); err != nil { - eventindexer.SwapEventsProcessedError.Inc() - - slog.Error("indxr.subscribe, indxr.saveSwapEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeLiquidityAdded(ctx context.Context, s *swap.Swap, chainID *big.Int, errChan chan error) { - sink := make(chan *swap.SwapMint) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - slog.Error("s.WatchMint", "error", err) - } - - slog.Info("resubscribing to Swap events") - - return s.WatchMint(&bind.WatchOpts{ - Context: ctx, - }, sink, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - if err := indxr.saveLiquidityAddedEvent(ctx, chainID, event); err != nil { - eventindexer.SwapEventsProcessedError.Inc() - - slog.Error("indxr.subscribe, indxr.saveLiquidityAddedEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) subscribeBlockAssigned(ctx context.Context, chainID *big.Int, errChan chan error) { - sink := make(chan *assignmenthook.AssignmentHookBlockAssigned) - - sub := event.ResubscribeErr( - indxr.subscriptionBackoff, - func(ctx context.Context, err error) (event.Subscription, error) { - if err != nil { - log.Error("assignmenthook.AssignmentHookBlockAssignedd", "error", err) - } - - log.Info("resubscribing to TransitionProved events") - - return indxr.assignmentHook.WatchBlockAssigned(&bind.WatchOpts{ - Context: ctx, - }, sink, nil) - }) - - defer sub.Unsubscribe() - - for { - select { - case <-ctx.Done(): - slog.Info("context finished") - return - case err := <-sub.Err(): - slog.Error("sub.Err()", "error", err) - errChan <- errors.Wrap(err, "sub.Err()") - case event := <-sink: - go func() { - log.Info("blockAssigned event from subscription", - "prover", event.AssignedProver.Hex(), - "metaId", event.Meta.Id, - ) - - if err := indxr.saveBlockAssignedEvent(ctx, chainID, event); err != nil { - eventindexer.TransitionProvedEventsProcessedError.Inc() - - log.Error("indxr.subscribe, indxr.saveBlockAssignedEvent", "error", err) - - return - } - - if err := indxr.saveLatestBlockSeen(ctx, chainID, event.Raw.BlockNumber, event.Raw.BlockHash); err != nil { - log.Error("indxr.subscribe, indxr.saveLatestBlockSeen", "error", err) - } - }() - } - } -} - -func (indxr *Indexer) saveLatestBlockSeen( - ctx context.Context, - chainID *big.Int, - blockNumber uint64, - blockHash common.Hash, -) error { - indxr.blockSaveMutex.Lock() - defer indxr.blockSaveMutex.Unlock() - - block, err := indxr.processedBlockRepo.GetLatestBlockProcessed(chainID) - if err != nil { - slog.Error("indxr.subscribe, indxr.processedBlockRepo.GetLatestBlockProcessed", "error", err) - return err - } - - if block.Height < blockNumber { - err = indxr.processedBlockRepo.Save(eventindexer.SaveProcessedBlockOpts{ - Height: blockNumber, - Hash: blockHash, - ChainID: chainID, - }) - if err != nil { - slog.Error("indxr.subscribe, blockRepo.save", "error", err) - return err - } - - eventindexer.BlocksProcessed.Inc() - } - - return nil -} diff --git a/packages/eventindexer/migrations/1666650599_create_events_table.sql b/packages/eventindexer/migrations/1666650599_create_events_table.sql index 8075afc911..9a8382772b 100644 --- a/packages/eventindexer/migrations/1666650599_create_events_table.sql +++ b/packages/eventindexer/migrations/1666650599_create_events_table.sql @@ -8,6 +8,7 @@ CREATE TABLE IF NOT EXISTS events ( data JSON NOT NULL, address VARCHAR(42) NOT NULL DEFAULT "", block_id int DEFAULT NULL, + emitted_block_id BIGINT NOT NULL, amount DECIMAL(65, 0) DEFAULT NULL, proof_reward VARCHAR(255) DEFAULT NULL, proposer_reward VARCHAR(255) DEFAULT NULL, diff --git a/packages/eventindexer/migrations/1666650700_create_processed_blocks_table.sql b/packages/eventindexer/migrations/1666650700_create_processed_blocks_table.sql deleted file mode 100644 index 4c8726067d..0000000000 --- a/packages/eventindexer/migrations/1666650700_create_processed_blocks_table.sql +++ /dev/null @@ -1,17 +0,0 @@ --- +goose Up --- +goose StatementBegin -CREATE TABLE IF NOT EXISTS processed_blocks ( - id int NOT NULL PRIMARY KEY AUTO_INCREMENT, - block_height int NOT NULL, - hash VARCHAR(255) NOT NULL UNIQUE, - chain_id int NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , - updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -); - --- +goose StatementEnd --- +goose Down --- +goose StatementBegin -DROP TABLE processed_blocks; --- +goose StatementEnd - diff --git a/packages/eventindexer/migrations/20230906206839_create_blocks_table.sql b/packages/eventindexer/migrations/20230906206839_create_blocks_table.sql deleted file mode 100644 index 0a057ee99d..0000000000 --- a/packages/eventindexer/migrations/20230906206839_create_blocks_table.sql +++ /dev/null @@ -1,16 +0,0 @@ --- +goose Up --- +goose StatementBegin -CREATE TABLE IF NOT EXISTS blocks ( - id int NOT NULL PRIMARY KEY AUTO_INCREMENT, - chain_id int not null, - block_id int not null unique, - transacted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP , - updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -); - --- +goose StatementEnd --- +goose Down --- +goose StatementBegin -DROP TABLE blocks; --- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20280906208839_alter_blocks_table_add_indexes.sql b/packages/eventindexer/migrations/20280906208839_alter_blocks_table_add_indexes.sql deleted file mode 100644 index 6a00b34f46..0000000000 --- a/packages/eventindexer/migrations/20280906208839_alter_blocks_table_add_indexes.sql +++ /dev/null @@ -1,9 +0,0 @@ --- +goose Up --- +goose StatementBegin -ALTER TABLE `blocks` ADD INDEX `transacted_at_index` (`transacted_at`); - --- +goose StatementEnd --- +goose Down --- +goose StatementBegin -DROP INDEX transacted_at_index on blocks; --- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20290906208839_alter_processed_blocks_chain_id_index.sql b/packages/eventindexer/migrations/20290906208839_alter_processed_blocks_chain_id_index.sql deleted file mode 100644 index 89e70d749a..0000000000 --- a/packages/eventindexer/migrations/20290906208839_alter_processed_blocks_chain_id_index.sql +++ /dev/null @@ -1,9 +0,0 @@ --- +goose Up --- +goose StatementBegin -ALTER TABLE `processed_blocks` ADD INDEX `processed_blocks_chain_id_index` (`chain_id`); - --- +goose StatementEnd --- +goose Down --- +goose StatementBegin -DROP INDEX processed_blocks_chain_id_index on processed_blocks; --- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20300906208839_alter_processed_blocks_block_height_index.sql b/packages/eventindexer/migrations/20300906208839_alter_processed_blocks_block_height_index.sql deleted file mode 100644 index f0303ed4f6..0000000000 --- a/packages/eventindexer/migrations/20300906208839_alter_processed_blocks_block_height_index.sql +++ /dev/null @@ -1,9 +0,0 @@ --- +goose Up --- +goose StatementBegin -ALTER TABLE `processed_blocks` ADD INDEX `processed_blocks_block_height_index` (`block_height`); - --- +goose StatementEnd --- +goose Down --- +goose StatementBegin -DROP INDEX processed_blocks_block_height_index on processed_blocks; --- +goose StatementEnd diff --git a/packages/eventindexer/migrations/20310906208839_alter_processed_blocks_block_height_chain_id_index.sql b/packages/eventindexer/migrations/20310906208839_alter_processed_blocks_block_height_chain_id_index.sql deleted file mode 100644 index 08eb3835b6..0000000000 --- a/packages/eventindexer/migrations/20310906208839_alter_processed_blocks_block_height_chain_id_index.sql +++ /dev/null @@ -1,9 +0,0 @@ --- +goose Up --- +goose StatementBegin -ALTER TABLE `processed_blocks` ADD INDEX `processed_blocks_block_height_chain_id_index` (`block_height`, `chain_id`); - --- +goose StatementEnd --- +goose Down --- +goose StatementBegin -DROP INDEX processed_blocks_block_height_chain_id_index on processed_blocks; --- +goose StatementEnd diff --git a/packages/eventindexer/pkg/mock/event_repository.go b/packages/eventindexer/pkg/mock/event_repository.go index fd97a26ab8..bd0847f906 100644 --- a/packages/eventindexer/pkg/mock/event_repository.go +++ b/packages/eventindexer/pkg/mock/event_repository.go @@ -2,6 +2,7 @@ package mock import ( "context" + "errors" "math/big" "math/rand" "net/http" @@ -144,3 +145,19 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( Items: events, }, nil } + +// DeleteAllAfterBlockID is used when a reorg is detected +func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error { + return nil +} + +// GetLatestBlockID get latest block id +func (r *EventRepository) FindLatestBlockID( + srcChainID uint64, +) (uint64, error) { + if srcChainID == MockChainID.Uint64() { + return LatestBlockNumber.Uint64(), nil + } + + return 0, errors.New("invalid") +} diff --git a/packages/eventindexer/pkg/mock/processed_block_repository.go b/packages/eventindexer/pkg/mock/processed_block_repository.go deleted file mode 100644 index 953ad16fb0..0000000000 --- a/packages/eventindexer/pkg/mock/processed_block_repository.go +++ /dev/null @@ -1,33 +0,0 @@ -package mock - -import ( - "errors" - "math/big" - - "github.com/taikoxyz/taiko-mono/packages/eventindexer" -) - -var ( - LatestBlock = &eventindexer.ProcessedBlock{ - Height: 100, - Hash: "0x", - ChainID: MockChainID.Int64(), - } -) - -type ProcessedBlockRepository struct { -} - -func (r *ProcessedBlockRepository) Save(opts eventindexer.SaveProcessedBlockOpts) error { - return nil -} - -func (r *ProcessedBlockRepository) GetLatestBlockProcessedForEvent( - chainID *big.Int, -) (*eventindexer.ProcessedBlock, error) { - if chainID.Int64() != MockChainID.Int64() { - return nil, errors.New("error getting latest block processed for event") - } - - return LatestBlock, nil -} diff --git a/packages/eventindexer/pkg/repo/block.go b/packages/eventindexer/pkg/repo/block.go deleted file mode 100644 index f0a99030bb..0000000000 --- a/packages/eventindexer/pkg/repo/block.go +++ /dev/null @@ -1,55 +0,0 @@ -package repo - -import ( - "context" - "math/big" - "strings" - "time" - - "github.com/ethereum/go-ethereum/core/types" - "github.com/pkg/errors" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" -) - -type BlockRepository struct { - db eventindexer.DB -} - -func NewBlockRepository(db eventindexer.DB) (*BlockRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB - } - - return &BlockRepository{ - db: db, - }, nil -} - -func (r *BlockRepository) Save( - ctx context.Context, - block *types.Block, - chainID *big.Int, -) error { - // genesis block will have 0 time and no relevant information - if block.Time() == uint64(0) { - return nil - } - - t := time.Unix(int64(block.Time()), 0) - - b := &eventindexer.Block{ - ChainID: chainID.Int64(), - BlockID: block.Number().Int64(), - TransactedAt: t, - } - - if err := r.db.GormDB().Create(b).Error; err != nil { - if strings.Contains(err.Error(), "Duplicate") { - return nil - } - - return errors.Wrap(err, "r.db.Create") - } - - return nil -} diff --git a/packages/eventindexer/pkg/repo/block_test.go b/packages/eventindexer/pkg/repo/block_test.go deleted file mode 100644 index 9c22c8492f..0000000000 --- a/packages/eventindexer/pkg/repo/block_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package repo - -import ( - "context" - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/stretchr/testify/assert" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" -) - -func Test_NewBlockRepo(t *testing.T) { - tests := []struct { - name string - db eventindexer.DB - wantErr error - }{ - { - "success", - &db.DB{}, - nil, - }, - { - "noDb", - nil, - eventindexer.ErrNoDB, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _, err := NewBlockRepository(tt.db) - assert.Equal(t, tt.wantErr, err) - }) - } -} - -func TestIntegration_RawBlock_Save(t *testing.T) { - db, close, err := testMysql(t) - assert.Equal(t, nil, err) - - defer close() - - blockRepo, err := NewBlockRepository(db) - assert.Equal(t, nil, err) - - header := &types.Header{ - ParentHash: common.HexToHash("0x3a537c89809712367218bb171b3b1c46aa95df3dee7200ae9dc78f4052024068"), - UncleHash: common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), - Coinbase: common.HexToAddress("0x0000000000000000000000000000000000000000"), - Root: common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), - TxHash: common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), - ReceiptHash: common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), - Bloom: types.Bloom{}, - Difficulty: new(big.Int).SetInt64(2), - Number: new(big.Int).SetInt64(1), - GasLimit: 100000, - GasUsed: 2000, - Time: 1234, - Extra: []byte{0x7f}, - MixDigest: common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"), - Nonce: types.BlockNonce{0x13}, - BaseFee: big.NewInt(10), - } - b := types.NewBlockWithHeader(header) - - genesisHeader := &types.Header{ - Time: 0, - } - - b2 := types.NewBlockWithHeader(genesisHeader) - - tests := []struct { - name string - block *types.Block - chainID *big.Int - wantErr error - }{ - { - "success", - b, - big.NewInt(0), - nil, - }, - { - "genesis", - b2, - big.NewInt(0), - nil, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := blockRepo.Save(context.Background(), tt.block, tt.chainID) - assert.Equal(t, tt.wantErr, err) - }) - } -} diff --git a/packages/eventindexer/pkg/repo/event.go b/packages/eventindexer/pkg/repo/event.go index bd9e2ea8e9..c547a39806 100644 --- a/packages/eventindexer/pkg/repo/event.go +++ b/packages/eventindexer/pkg/repo/event.go @@ -29,12 +29,13 @@ func NewEventRepository(db eventindexer.DB) (*EventRepository, error) { func (r *EventRepository) Save(ctx context.Context, opts eventindexer.SaveEventOpts) (*eventindexer.Event, error) { e := &eventindexer.Event{ - Data: datatypes.JSON(opts.Data), - ChainID: opts.ChainID.Int64(), - Name: opts.Name, - Event: opts.Event, - Address: opts.Address, - TransactedAt: opts.TransactedAt, + Data: datatypes.JSON(opts.Data), + ChainID: opts.ChainID.Int64(), + Name: opts.Name, + Event: opts.Event, + Address: opts.Address, + TransactedAt: opts.TransactedAt, + EmittedBlockID: opts.EmittedBlockID, } if opts.Tier != nil { @@ -250,3 +251,28 @@ func (r *EventRepository) GetAssignedBlocksByProverAddress( return page, nil } + +// DeleteAllAfterBlockID is used when a reorg is detected +func (r *EventRepository) DeleteAllAfterBlockID(blockID uint64, srcChainID uint64) error { + query := ` +DELETE FROM events +WHERE block_id >= ? AND chain_id = ?` + + return r.db.GormDB().Table("events").Exec(query, blockID, srcChainID).Error +} + +// GetLatestBlockID get latest block id +func (r *EventRepository) FindLatestBlockID( + srcChainID uint64, +) (uint64, error) { + q := `SELECT COALESCE(MAX(emitted_block_id), 0) + FROM events WHERE chain_id = ?` + + var b uint64 + + if err := r.db.GormDB().Table("events").Raw(q, srcChainID).Scan(&b).Error; err != nil { + return 0, err + } + + return b, nil +} diff --git a/packages/eventindexer/pkg/repo/processed_block.go b/packages/eventindexer/pkg/repo/processed_block.go deleted file mode 100644 index 34104a430f..0000000000 --- a/packages/eventindexer/pkg/repo/processed_block.go +++ /dev/null @@ -1,62 +0,0 @@ -package repo - -import ( - "math/big" - - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "gorm.io/gorm" -) - -type ProcessedBlockRepository struct { - db eventindexer.DB -} - -func NewProcessedBlockRepository(db eventindexer.DB) (*ProcessedBlockRepository, error) { - if db == nil { - return nil, eventindexer.ErrNoDB - } - - return &ProcessedBlockRepository{ - db: db, - }, nil -} - -func (r *ProcessedBlockRepository) startQuery() *gorm.DB { - return r.db.GormDB().Table("processed_blocks") -} - -func (r *ProcessedBlockRepository) Save(opts eventindexer.SaveProcessedBlockOpts) error { - exists := &eventindexer.ProcessedBlock{} - _ = r.startQuery().Where("block_height = ?", opts.Height).Where("chain_id = ?", opts.ChainID.Int64()).First(exists) - // block processed already - if exists.Height == opts.Height { - return nil - } - - b := &eventindexer.ProcessedBlock{ - Height: opts.Height, - Hash: opts.Hash.String(), - ChainID: opts.ChainID.Int64(), - } - if err := r.startQuery().Create(b).Error; err != nil { - return err - } - - return nil -} - -func (r *ProcessedBlockRepository) GetLatestBlockProcessed(chainID *big.Int) (*eventindexer.ProcessedBlock, error) { - b := &eventindexer.ProcessedBlock{} - if err := r. - startQuery(). - Raw(`SELECT id, block_height, hash, chain_id - FROM processed_blocks - WHERE block_height = - ( SELECT MAX(block_height) from processed_blocks - WHERE chain_id = ? )`, chainID.Int64()). - FirstOrInit(b).Error; err != nil { - return nil, err - } - - return b, nil -} diff --git a/packages/eventindexer/pkg/repo/processed_block_test.go b/packages/eventindexer/pkg/repo/processed_block_test.go deleted file mode 100644 index 947d310a56..0000000000 --- a/packages/eventindexer/pkg/repo/processed_block_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package repo - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/taikoxyz/taiko-mono/packages/eventindexer" - "github.com/taikoxyz/taiko-mono/packages/eventindexer/pkg/db" - "gopkg.in/go-playground/assert.v1" -) - -func Test_NewProcessedBlockRepo(t *testing.T) { - tests := []struct { - name string - db eventindexer.DB - wantErr error - }{ - { - "success", - &db.DB{}, - nil, - }, - { - "noDb", - nil, - eventindexer.ErrNoDB, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _, err := NewProcessedBlockRepository(tt.db) - assert.Equal(t, tt.wantErr, err) - }) - } -} - -func TestIntegration_Block_Save(t *testing.T) { - db, close, err := testMysql(t) - assert.Equal(t, nil, err) - - defer close() - - blockRepo, err := NewProcessedBlockRepository(db) - assert.Equal(t, nil, err) - tests := []struct { - name string - opts eventindexer.SaveProcessedBlockOpts - wantErr error - }{ - { - "success", - eventindexer.SaveProcessedBlockOpts{ - ChainID: big.NewInt(1), - Height: 100, - Hash: common.HexToHash("0x1234"), - }, - nil, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err = blockRepo.Save(tt.opts) - assert.Equal(t, tt.wantErr, err) - }) - } -} - -func TestIntegration_Block_GetLatestBlockProcessedForEvent(t *testing.T) { - db, close, err := testMysql(t) - assert.Equal(t, nil, err) - - defer close() - - blockRepo, err := NewProcessedBlockRepository(db) - assert.Equal(t, nil, err) - tests := []struct { - name string - eventName string - chainID *big.Int - wantErr error - }{ - { - "success", - eventindexer.EventNameBlockProposed, - big.NewInt(1), - nil, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - _, err := blockRepo.GetLatestBlockProcessed(tt.chainID) - assert.Equal(t, tt.wantErr, err) - }) - } -}